通过SSL卸载应用程序网关连接到Azure托管的ElasticSearch终结点

时间:2018-08-26 07:50:36

标签: .net azure elasticsearch nest azure-marketplace

我已使用模板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);
    }

1 个答案:

答案 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提供AuthorityPartOfChainAuthorityIsRoot取决于生成传递给Application Gateway的证书的方式,具体取决于客户端配置的证书是否是链的一部分,或分别是根证书。