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

Connect to an Azure hosted ElasticSearch endpoint through a SSL offloading Application Gateway

我已经使用模板 Elasticsearch Azure Marketplace 在 Azure 中部署了 ElasticSearch 集群。

我将其配置为 SSL/TLS 通过应用程序网关通过 HTTP 层与 Elasticsearch 通信,一切正常,我可以登录 Kibana 并查看我的集群节点的状态。

问题是我无法使用 NEST.NET 从客户端通过 Azure 应用程序网关连接到 ElasticSearch,它需要我在提交模板时提供的证书和密码,但是当我设置它时我得到 "Unable to read data from the transport connection""The SSL connection could not be established, see inner exception." 当我发送请求时。

这是我在客户端连接到 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);
    }

本例中的证书不用于 Elasticsearch 的证书身份验证,因为 ClientCertificate 方法用于,但用于传输层安全性 (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,具体取决于客户端配置的证书是否属于链,或分别是根证书。