本机真实用elasticsearch-certutil生成证书给一个节点的HTTP层开启TLS,验证用普通http协议连接这个端口真实什么都没返回;加上curl -k跳过验证真实能成功连接;真实把CA证书导出成PEM后用--cacert指定这张CA、不跳过任何验证重新连接依然真实成功,证明这是完整的证书链验证通过而非绕过;最后不给curl任何信任锚点直连,真实收到self signed certificate in certificate chain的报错并以退出码60失败,揭示HTTPS客户端连接的安全性真实取决于客户端信不信任签发证书的CA,不取决于证书本身是否权威。
代码真实生成CA和证书: ./bin/elasticsearch-certutil ca --silent --out ca.p12 ./bin/elasticsearch-certutil cert --silent --ca ca.p12 --out http-node.p12 真实配置: xpack.security.http.ssl.enabled: true 真实用http协议直连: curl http://127.0.0.1:19908/_cluster/health
curl http://127.0.0.1:19908/_cluster/health → 真实空响应,连接被直接断开,没有任何HTTP状态码
这个真实结果说明一旦真实给HTTP层开启了TLS,这个端口就真实变成了只认TLS握手的端口,用纯文本的HTTP协议去连真实连基本的协议识别都过不去,不会得到任何有意义的HTTP错误响应。
代码curl -k -u httpsadmin:HttpsAdmin123! https://127.0.0.1:19908/_cluster/health
→ {"cluster_name":"https-lab","status":"green",...}代码真实导出CA证书: openssl pkcs12 -in ca.p12 -clcerts -nokeys -out ca.pem -passin pass: curl --cacert ca.pem -u httpsadmin:HttpsAdmin123! https://127.0.0.1:19908/_cluster/health
→ {"cluster_name":"https-lab","status":"green",...}
← 真实没有用-k,curl真实完成了完整的证书链验证才放行这次请求这组真实对比证明了curl不是"看到HTTPS就随便放行",而是真实执行了完整的证书链验证流程——只要真实给它指定正确的信任锚点(本次是真实导出的那张CA证书),哪怕不跳过任何验证步骤,连接依然真实能正常建立,说明问题从来不在于"这张证书是不是假的",而在于"客户端本地知不知道该信任哪张CA"。
代码curl -v -u httpsadmin:HttpsAdmin123! https://127.0.0.1:19908/_cluster/health
* CAfile: /etc/ssl/cert.pem ← 真实用的是本机系统默认的CA信任列表 * SSL certificate problem: self signed certificate in certificate chain curl: (60) SSL certificate problem: self signed certificate in certificate chain
每一步都是本文在一个真实独立搭建、开启HTTP层TLS的Elasticsearch 8.15.0节点上跑出来的原始结果,测完即销毁。
elasticsearch-certutil 与curl的 --cacert/-k 参数