概述
如果你启用了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.NET
和NEST
均可通过连接配置来暴露这个回调。你可以在这个处理程序中执行你自己的验证,也可以在静态类CertificateValidations
上使用现成的处理程序。
最基本的两个是AllowAll和
DenyAll`,它们分别表示接受或拒绝所有到节点的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.NET
和NEST
附带了一些辅助工具,它可以断言服务器提供的证书是来自本地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证书是否是用于生成服务器密钥的链的一部分。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册