Elasticsearch 证书问题解决

发布于:2025-04-03 ⋅ 阅读:(23) ⋅ 点赞:(0)

报错信息

javax.net.ssl.SSLHandshakeException: 
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: 
unable to find valid certification path to requested target
        at org.elasticsearch.client.RestClient.
extractAndWrapCause(RestClient.java:929) ~[elasticsearch-rest-client-8.15.5.jar:8.15.5]

javax.net.ssl.SSLHandshakeException: PKIX path building failed 是 Java 在尝试建立 SSL/TLS 连接时发生的常见问题。具体错误信息表明,客户端无法验证服务器的证书,因为它找不到从服务器证书到受信任根证书的有效证书路径(即信任链构建失败)。在你的案例中,这个错误发生在使用 Elasticsearch 的 RestClient(版本 8.15.5)连接 Elasticsearch 服务器时。

错误原因分析

  1. 服务器使用自签名证书 Elasticsearch 默认启用了安全功能(xpack.security.enabled=true),并自动生成自签名证书。这种证书未被 Java 默认信任存储(cacerts)中的根 CA(证书颁发机构)所信任,因此会导致 PKIX path building failed。

  2. 缺少中间证书或根证书 如果服务器使用的是由第三方 CA(如 Let’s Encrypt、DigiCert)签发的证书,但证书链不完整(例如缺少中间证书),Java 也无法构建信任路径。

  3. 客户端信任存储未配置 Java 的默认信任存储(cacerts)不包含 Elasticsearch 自签名证书的根 CA,或者你未手动导入服务器的证书。

  4. HTTPS 配置问题 你可能尝试通过 HTTPS(https://localhost:9200)连接 Elasticsearch,但未正确配置客户端的 SSL 设置。------------------------------------------------------------

解决方法

方法 1:导入服务器证书到 Java 信任存储「推荐」

将 Elasticsearch 的自签名证书(或其根 CA 证书)导入到 Java 的 cacerts 文件中,使其被客户端信任。

获取服务器证书

  • 使用 openssl 从 Elasticsearch 服务器导出证书:

  • openssl s_client -connect localhost:9200 -showcerts </dev/null 2>/dev/null | openssl x509 -outform PEM > elasticsearch-cert.pem

  • 「推荐」或者从 Elasticsearch 容器中提取证书(通常位于 /usr/share/elasticsearch/config/certs/http_ca.crt):

  • docker cp <容器ID>:/usr/share/elasticsearch/config/certs/http_ca.crt ./http_ca.crt

导入证书到 Java 信任存储

使用 keytool 导入证书到 JDK 的 cacerts:

sudo keytool -import -trustcacerts -file http_ca.crt -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit -alias elasticsearch-ca

$JAVA_HOME 是你的 JDK 安装路径,默认密码为 changeit。

提示是否信任时,输入 yes。成功了

执行出错可能是java_home不正确。文末设置java_home,


(base) andy_mac@Andy-FandeMacBook-Pro bin % 
sudo keytool -import -trustcacerts -file http_ca.crt -keystore /Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home/lib/security/cacerts -storepass changeit -alias elasticsearch-ca 

Password: 警告: 使用 -cacerts 选项访问 cacerts 密钥库 所有者: CN=Elasticsearch security auto-configuration HTTP CA 发布者: CN=Elasticsearch security auto-configuration HTTP CA 序列号: 2e1687fde5df9c273e369d6aaf5572ff5480b434 生效时间: Tue Apr 01 16:28:56 CST 2025, 失效时间: Fri Mar 31 16:28:56 CST 2028 证书指纹: SHA1: CD:5B:2D:C7:BA:36:9D:83:D4:49:0E:E7:0E:DA:AB:59:D6:97:84:9C SHA256: 65:3D:32:2D:E0:18:93:D5:75:CC:7D:CC:98:31:09:4D:DF:20:14:86:0E:D2:34:3A:A9:B2:C7:7E:A8:91:58:BF 签名算法名称: SHA256withRSA 主体公共密钥算法: 4096 位 RSA 密钥 版本: 3 扩展: #1: ObjectId: 2.5.29.35 Criticality=false AuthorityKeyIdentifier [ KeyIdentifier [ 0000: BF 92 96 7F D4 C9 DB 65 2B 60 5E 18 FC CE 1F CD .......e+`^..... 0010: FA DC 6E 42 ..nB ] ] #2: ObjectId: 2.5.29.19 Criticality=true BasicConstraints:[ CA:true PathLen: no limit ] #3: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: BF 92 96 7F D4 C9 DB 65 2B 60 5E 18 FC CE 1F CD .......e+`^..... 0010: FA DC 6E 42 ..nB ] ] 
是否信任此证书? [否]: y 
证书已添加到密钥库中

验证 重启应用,检查是否仍报错

------------------------------------------------------------------------------------------------------

------------------------------------------------------------

-----------------------------------

--------------

1-检查 $JAVA_HOME 是否正确设置

验证 $JAVA_HOME 在终端运行:

echo $JAVA_HOME

如果输出为空或路径不正确(例如不是 JDK 安装目录),需要设置正确的 $JAVA_HOME。

2-查找 JDK 路径(macOS) 在 macOS 上,JDK 通常安装在

/Library/Java/JavaVirtualMachines/ 下。运行以下命令查找:

/usr/libexec/java_home

(base) andy_mac@Andy-FandeMacBook-Pro bin % /usr/libexec/java_home /Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home

--我的mac

3-设置 $JAVA_HOME 如果未设置或不正确,临时设置:

export JAVA_HOME=$(/usr/libexec/java_home)

或者永久设置【推荐】,编辑 ~/.zshrc(或 ~/.bashrc,取决于你的 shell):

echo 'export JAVA_HOME=$(/usr/libexec/java_home)' >> ~/.zshrc

source ~/.zshrc

4-验证路径 确认 cacerts 文件是否存在:

ls $JAVA_HOME/lib/security/cacerts

如果文件存在,路径正确;否则继续排查 JDK 安装。 /Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home/lib/security/cacerts