我已使用模板Elasticsearch Azure Marketplace在Azure中部署ElasticSearch群集。
我为它配置了SSL / TLS,以便通过Application Gateway通过HTTP层与Elasticsearch进行通信,并且一切正常,我可以登录到Kibana并查看集群节点的状态。
问题是我无法从客户端通过Azure应用网关通过NEST.NET连接到ElasticSearch,它需要我在提交模板时提供的证书和密码,但是当我设置模板时,我得到“无法从传输连接读取数据” 和“无法建立SSL连接,请参阅内部异常。” 。当我发送请求时。
这是我从客户端连接到ElasticSearch的代码:
public IElasticClient Client { get; }
public ElasticService(IConfiguration configuration)
{
var settings = new ConnectionSettings(new Uri(configuration["Elastic:Endpoint"]))
.DefaultIndex("impression");
settings.ClientCertificate(new X509Certificate2(@"C:\git\server.p12", "PASSWORD", X509KeyStorageFlags.Exportable));
Client = new ElasticClient(settings);
}
答案 0 :(得分:1)
在这种情况下,该证书不像ClientCertificate
方法那样用于对Elasticsearch进行证书身份验证,而是用于传输层安全性(TLS)。
可以使用ServerCertificateValidationCallback
设置TLS证书
var pool = new SingleNodeConnectionPool(new Uri(configuration["Elastic:Endpoint"]));
var settings = new ConnectionSettings(pool)
.DefaultIndex(defaultIndex)
.BasicAuthentication("elastic", "<password>")
.ServerCertificateValidationCallback(
CertificateValidations.AuthorityPartOfChain(
new X509Certificate2(@"C:\git\server.p12", "PASSWORD"))
);
var client = new ElasticClient(settings);
CertificateValidations
提供AuthorityPartOfChain
和AuthorityIsRoot
取决于生成传递给Application Gateway的证书的方式,具体取决于客户端配置的证书是否是链的一部分,或分别是根证书。