使用证书

917 发布于: 2021-04-01 读完约需 4 分钟

概述

如果你启用了Elasticsearch的SSL,或者通过代理访问Elasticsearch,并且生成证书的证书颁发机构(CA)受运行客户端代码的计算机的信任,那么你可以很容易地在客户端通过HTTPS来访问集群。

如果你使用的是不受信任的CA,默认情况下.NET不允许你对这个端点进行HTTPS调用。在.NET框架中,你可以通过全局静态ServicePointManager.ServerCertificateValidationCallback事件上的自定义验证回调来解决这个问题。很多情况下,大家都简单地以返回true来完成验证回调。这是非常不可取的,因为它允许任何HTTPS流量通过当前AppDomain,而不需要任何验证。

假设你部署了一个web应用程序,它使用NEST通过HTTPS与Elasticsearch进行通信,并且还使用一些第三方SOAP/WSDL端点,设置如下:

ServicePointManager.ServerCertificateValidationCallback +=
(sender, cert, chain, errors) => true

这会导致到Elasticsearch和外部服务的HTTPS连接,都将不会执行验证。

验证配置

使用.NET为每个服务端点设置回调也是可以,Elasticsearch.NETNEST均可通过连接配置来暴露这个回调。你可以在这个处理程序中执行你自己的验证,也可以在静态类CertificateValidations上使用现成的处理程序。

最基本的两个是AllowAllDenyAll`,它们分别表示接受或拒绝所有到节点的SSL通信。

拒绝所有身份验证

以下在ConnectionSettings上设置了拒绝所有身份验证的验证回调:

[IntegrationOnly]
public class DenyAllCertificatesCluster : SslAndKpiXPackCluster
{
    protected override ConnectionSettings ConnectionSettings(ConnectionSettings s) => s
        .ServerCertificateValidationCallback((o, certificate, chain, errors) => false)
        .ServerCertificateValidationCallback(CertificateValidations.DenyAll); 
}

允许所有身份验证

以下在ConnectionSettings上设置了允许所有身份验证的验证回调:

public class AllowAllCertificatesCluster : SslAndKpiXPackCluster
{
    protected override ConnectionSettings ConnectionSettings(ConnectionSettings s) => s
        .ServerCertificateValidationCallback((o, certificate, chain, errors) => true) 
        .ServerCertificateValidationCallback(CertificateValidations.AllowAll); 
}

允许来自证书颁发机构的证书

如果你的客户端应用程序可以访问本地的公共CA证书,那么Elasticsearch.NETNEST附带了一些辅助工具,它可以断言服务器提供的证书是来自本地CA的证书。

如果使用elasticsearch-certutil工具生成SSL证书,为了减少SSL信号交换的大小,生成的节点证书中不包括证书链中的CA。在这种情况下,你可以使用CertificateValidations.AuthorityIsRoot并将CA公钥的本地副本传递给它,以断言服务器提供的证书是使用它生成的。

[IntegrationOnly]
public class CertgenCaCluster : SslAndKpiXPackCluster
{
    public CertgenCaCluster() : base() { }
    public CertgenCaCluster(SslAndKpiClusterConfiguration configuration) : base(configuration) { }
    protected override ConnectionSettings ConnectionSettings(ConnectionSettings s) => s
        .ServerCertificateValidationCallback(
            CertificateValidations.AuthorityIsRoot(new X509Certificate(this.ClusterConfiguration.FileSystem.CaCertificate))
        );
}

如果你的本地副本与服务器的CA不匹配,则客户端将无法连接

[IntegrationOnly]
public class BadCertgenCaCluster : SslAndKpiXPackCluster
{
    protected override ConnectionSettings ConnectionSettings(ConnectionSettings s) => s
        .ServerCertificateValidationCallback(
            CertificateValidations.AuthorityPartOfChain(new X509Certificate(this.ClusterConfiguration.FileSystem.UnusedCaCertificate))
        );
}

如果使用供应商生成的SSL证书,证书的常见做法是在证书链中包含CA和任何中间CA。使用该证书时,请使用CertificateValidations.AuthorityPartOfChain验证本地CA证书是否是用于生成服务器密钥的链的一部分。

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

发表评论

登录用户才能发表评论, 请 登 录 或者 注册