elasticsearch,.net-core,nest,Ssl,elasticsearch,.net Core,Nest" /> elasticsearch,.net-core,nest,Ssl,elasticsearch,.net Core,Nest" />

Ssl Elasticsearch NEST HttpClientHandler证书

Ssl Elasticsearch NEST HttpClientHandler证书,ssl,elasticsearch,.net-core,nest,Ssl,elasticsearch,.net Core,Nest,我正在尝试将Elasticsearch嵌套与.NET核心和我们的Elasticsearch实例一起使用。我们通过SSL连接,它有一个通配符证书,我们需要以编程方式接受它。我正试图找出如何将HttpClientHandler挂接到NEST以接受它。似乎没有很好的文档说明如何做,只是说按照他们的指示去做 我正在寻找一个例子,如果可能的话。提前谢谢 我知道了。我需要创建一个HttpConnection并重写CreateHttpClientHandler方法。下面是一个无论证书是什么都返回true的示例

我正在尝试将Elasticsearch嵌套与.NET核心和我们的Elasticsearch实例一起使用。我们通过SSL连接,它有一个通配符证书,我们需要以编程方式接受它。我正试图找出如何将HttpClientHandler挂接到NEST以接受它。似乎没有很好的文档说明如何做,只是说按照他们的指示去做


我正在寻找一个例子,如果可能的话。提前谢谢

我知道了。我需要创建一个
HttpConnection
并重写
CreateHttpClientHandler
方法。下面是一个无论证书是什么都返回true的示例

public class ConnectionWithCert : HttpConnection
{
    protected override HttpClientHandler CreateHttpClientHandler(RequestData requestData)
    {
        var handler = base.CreateHttpClientHandler(requestData);
        handler.ServerCertificateCustomValidationCallback = ValidateCertificate;
        return handler;
    }

    private bool ValidateCertificate(HttpRequestMessage message, X509Certificate2 certificate, X509Chain chain, SslPolicyErrors errors)
    {
        return true;
    }
}
一个人会想要检查证书,以确保它是他们期望的证书

然后,我在
ConnectionSettings

var connectionSettings = new ConnectionSettings(connnectionPool, new ConnectionWithCert());

可能想做一些依赖注入,但我想我会分享解决方案,以防其他人想知道他们需要做什么。

这让我费了好大劲才弄明白,所以我想我会把它贴在这里。我们使用的是反向代理,我们使用证书将请求发送到443 SSL端口(azure中的负载平衡到三个客户端节点),以进行身份验证,然后将其转发到本地客户端节点,以分散到数据节点。证书是自签名的,并且位于包含api的服务器上的本地存储(当前用户>个人)中。指纹在我们的web.config中

public class ConnectionWithCert : Elasticsearch.Net.HttpConnection
{
    protected override HttpWebRequest CreateHttpWebRequest(RequestData requestData)
    {
        var handler = base.CreateHttpWebRequest(requestData);

        string certThumbprint = System.Configuration.ConfigurationManager.AppSettings["ElasticsearchCertificateThumbprint"];
        X509Certificate2 certificate =
            GetCertificateByThumbprint(certThumbprint);

        handler.ClientCertificates.Add(certificate);
        return handler;
    }

    /// <summary>
    /// Get the certificate using the certificate thumbprint
    /// </summary>
    /// <param name="certificateThumbprint">Thumbprint of certificate</param>
    /// <returns>Certificate object</returns>
    public static X509Certificate2 GetCertificateByThumbprint(string certificateThumbprint)
    {
        Ensure.ArgumentNotEmpty(certificateThumbprint, nameof(certificateThumbprint));

        // Open the certificate store
        X509Store certificateStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
        certificateStore.Open(OpenFlags.ReadOnly);

        // Get the certificates
        var matchingCertificates = certificateStore.Certificates.Find(X509FindType.FindByThumbprint, certificateThumbprint, false);
        if (matchingCertificates.Count == 0)
        {
            // No certificate found
            return null;
        }
        else
        {
            // Return first certificate
            return matchingCertificates[0];
        }
    }
}

现在,通过我的助手执行的所有操作都附加了客户端证书,并通过我的反向代理授予访问权限。

我们在5.3.0中添加了一些助手,以帮助设置客户端证书。文档将很快更新:它基于@RussCam,文档仍然缺少如何使用.NETCore实现它。它有一个关于“不幸的是,这在.NETCore中不可用…”的宣传语,但它并没有解释如何在.NETCore中使用它。在您的文档中提供示例将非常有用。
    public ElasticSearchHelper(string elasticSearchUrl, OcvElasticSearchDataProvider dataProvider, int elasticSearchConflictRetryCount)
    {
        // Parameters
        this.elasticSearchConflictRetryCount = elasticSearchConflictRetryCount;
        this.dataProvider = dataProvider;

        // Create the ElasticSearch client and configure
        var node = new Uri(elasticSearchUrl);

        var pool = new SingleNodeConnectionPool(node);
        var settings = new ConnectionSettings(pool, new ConnectionWithCert());

        this.client = new ElasticClient(settings);
    }