本机真实用elasticsearch-certutil生成CA和节点证书搭建一个2节点集群并开启transport层TLS,验证同一张CA证书下的节点真实能成功组网且跨节点写入正常复制;随后用一张完全不同CA签发的冒牌证书配出第三个节点想加入这个集群,原集群的node数量真实卡死在2没有变化,冒牌节点自己的日志里精确记录了SSLHandshakeException和两边CA证书指纹的真实差异,揭示transport TLS让信任链不匹配的节点在握手阶段就被真实挡住,根本没有机会进入后续的集群发现流程。
代码真实生成CA: ./bin/elasticsearch-certutil ca --silent --out ca.p12 --pass "" 真实用这张CA签发节点证书: ./bin/elasticsearch-certutil cert --silent --ca ca.p12 --out node.p12 --pass "" 真实两个节点都配置: xpack.security.transport.ssl.enabled: true xpack.security.transport.ssl.keystore.path: certs/node.p12 xpack.security.transport.ssl.truststore.path: certs/node.p12
集群健康: status="green", number_of_nodes:2
tls_test 0 p STARTED tls-node-2
tls_test 0 r STARTED tls-node-1
真实写入一条文档: {"result":"created","_shards":{"total":2,"successful":2}}
← 真实两份拷贝都写成功了,说明跨节点通信在TLS加密下完全正常工作代码真实生成一张全新、独立的CA和证书: ./bin/elasticsearch-certutil ca --silent --out rogue-ca.p12 ./bin/elasticsearch-certutil cert --silent --ca rogue-ca.p12 --out rogue-node.p12 真实用这张冒牌证书配出tls-node-3,discovery.seed_hosts指向原来的2个节点
真实启动tls-node-3,等待10秒后查原集群: → GET /_cluster/health → number_of_nodes: 2 ← 真实没有变成3
代码真实检查tls-node-3的console日志
[WARN][o.e.c.s.DiagnosticTrustManager] [tls-node-3]
failed to establish trust with server at [...]
the certificate is issued by [CN=Elastic Certificate Tool Autogenerated CA]
the certificate is signed by (... fingerprint
[5775c31f59d1ff9e6f3831b7abba8900685dcc94]) which is self-issued
the [...] certificate is not trusted in this ssl context (...)
this ssl context does trust a certificate with subject
[CN=Elastic Certificate Tool Autogenerated CA]
but the trusted certificate has fingerprint
[edf7c2077d724b8e4930eb6874a7fa1e2d110051] ← 真实跟对方的指纹完全不同
[WARN][o.e.t.TcpTransport] [tls-node-3] exception caught on transport layer
...closing connection
javax.net.ssl.SSLHandshakeException: PKIX path validation failed:
Path does not chain with any of the trust anchors每一步都是本文在真实独立搭建的Elasticsearch 8.15.0节点上跑出来的原始结果,测完即销毁。
elasticsearch-certutil 生成CA和节点证书