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