Elasticsearch的证书过期处理方法
摘要
-
本文介绍Elasticsearch证书过期时的处理方法
-
Elasticsearch版本8.17.3
ES证书简介
-
Elasticsearch 8 默认情况下创建的证书只有3年有效期,过期时需要创建新的证书,为了不必要的麻烦,也可以一开始就创建一个有效期比较长的证书。
-
在 Elasticsearch 8 的配置下,
config/certs
目录通常存放的是用于安全通信的证书和密钥文件。这些文件确保了 Elasticsearch 实例之间的通讯以及与外部客户端的通讯能够被加密且经过认证。 -
config/certs
目录包含三个文件分别是:http.p12
: 这是一个 PKCS#12 格式的文件(通常带有.p12或.pfx扩展名),包含了 Elasticsearch HTTP 层用来进行 TLS/SSL 通信所需的一切,包括一个私钥、相应的公钥证书(服务器证书)及 CA 证书链。客户端使用这个文件来验证它们正在与正确的服务器进行通信,并且此服务器也信任该客户端。http_ca.crt
: CA (Certificate Authority) 根证书或中间证书,用于验证通过 HTTP 协议连接至 Elasticsearch 服务端点的身份。当客户端尝试建立 HTTPS 连接时,它会检查来自 Elasticsearch 的证书是否由这个 CA 签名;这是确保双方通信安全的重要步骤之一。transport.p12
: 同样为 PKCS#12 格式,但这个特定的文件是给 Elasticsearch 节点之间内部传输层使用的。在集群内,节点间需
要相互认证,transport.p12就包含着让不同 Elasticsearch 实例能互相识别所需的私钥和证书。
-
总之,
http.p12
服务于面向 Web 的接口,而transport.p12
则处理 Elasticsearch 群集内的交互;两者都依赖于http_ca.crt
来进行身份验证过程的一部分。
ES证书过期的影响
-
集群无法增加新节点:特别是在重启集群时,节点无法加入集群,导致无法正常重启。
-
访问异常:如果使用证书连接ES集群,会导致无法正常访问集群。
-
安全风险:证书过期会破坏证书链的信任,可能引发安全漏洞。
-
日志干扰:会持续出现证书过期的错误日志,干扰问题排查和诊断。
查看证书的过期时间
-
通过openssl查看证书的过期时间
1 | # 查看crt证书到期时间 |
-
通过ES的API查看证书过期时间
1 | curl -XGET -k -u 'elastic:123456' 'https://127.0.0.1:9200/_ssl/certificates?pretty' |
证书过期处理
-
Elasticsearch 8 的证书创建需要使用命令行工具
elasticsearch-certutil
,这部分的详细信息可以参考官方文档:elasticsearch-certutil -
当证书过期时,需要重新生成证书,并更新
config/certs
目录下的文件,更新前要备份原证书。
备份原证书
1 | $ cp -r config/certs config/certs.bak |
生成新证书
生成CA证书
-
生成crt证书
1 | # --days 36500: 指定证书的有效期,单位为天,这里设置为 36500 天,大约 10 年 |
-
也可以生成PKCS#12格式的证书
1 | $ bin/elasticsearch-certutil ca --out config/certs/ca.p12 --days 36500 |
生成transport证书
1 | # 基于crt证书 |
生成http证书
1 | # 这里是交互式命令行 |
-
输出说明
1 | Generate a CSR? [y/N]n # 不生成CSR |
-
解压并将http证书拷贝到config/certs目录下
1 | $ unzip elasticsearch-ssl-http.zip |
分发到ES集群中的每个节点
-
上面创建新的证书时我们只在一个节点上进行即可,之后将生成好的证书分发到ES集群中的其它节点,这里就是
http.p12
和transport.p12
,将其拷贝到每个节点的config/certs
目录下,拷贝前做好原证书的备份。 -
如有必要也可以拷贝
ca.p12
或者http_ca.crt
和http_ca.key
到每个节点的config/certs
目录下
重启ES服务
-
集群中的节点依次重启
1 | $ bin/elasticsearch -d |
-
重启时可能会报错
1 | org.elasticsearch.ElasticsearchSecurityException: failed to load SSL configuration [xpack.security.transport.ssl] - cannot read configured [PKCS12] keystore (as a truststore) [/usr/local/elasticsearch/elasticsearch-8.17.3/config/certs/transport.p12] - this is usually caused by an incorrect password; (a keystore password was provided) |
-
解决方法
1 | # 使用bin/elasticsearch-keystore list查看现有的密钥列表 |
替换Kibana的证书
-
将上面创建好的
kibana/elasticsearch-ca.pem
拷贝到Kibana服务器,比如/usr/local/kibana/kibana-8.17.3/config/certs/elasticsearch-ca.pem
-
修改Kibana配置文件
config/kibana.yml
中的elasticsearch.ssl.certificateAuthorities
配置,使其指向/usr/local/kibana/kibana-8.17.3/config/certs/elasticsearch-ca.pem
1 | elasticsearch.ssl.certificateAuthorities: ["/usr/local/kibana/kibana-8.17.3/config/certs/elasticsearch-ca.pem"] |
-
重启Kibana服务
证书格式转换
1 | # p12转换为crt格式 |
生成http证书时为每个节点单独配置证书
1 | Generate a certificate per node? [y/N]y # 是否为每个节点单独配置证书,这里选择是 |
- 此时解压查看文件结构
1 | unzip elasticsearch-ssl-http.zip |
-
将对应的证书拷贝到对应节点的
config/certs
目录下