Elasticsearch 证书问题解决

报错信息

cpp 复制代码
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):

bash 复制代码
docker cp <容器ID>:/usr/share/elasticsearch/config/certs/http_ca.crt ./http_ca.crt

导入证书到 Java 信任存储

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

bash 复制代码
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,

bash 复制代码
(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

相关推荐
武子康1 天前
大数据-237 离线数仓 - Hive 广告业务实战:ODS→DWD 事件解析、广告明细与转化分析落地
大数据·后端·apache hive
大大大大晴天1 天前
Flink生产问题排障-Kryo serializer scala extensions are not available
大数据·flink
Elasticsearch2 天前
如何使用 Agent Builder 排查 Kubernetes Pod 重启和 OOMKilled 事件
elasticsearch
Elasticsearch3 天前
通用表达式语言 ( CEL ): CEL 输入如何改进 Elastic Agent 集成中的数据收集
elasticsearch
武子康3 天前
大数据-236 离线数仓 - 会员指标验证、DataX 导出与广告业务 ODS/DWD/ADS 全流程
大数据·后端·apache hive
武子康4 天前
大数据-235 离线数仓 - 实战:Flume+HDFS+Hive 搭建 ODS/DWD/DWS/ADS 会员分析链路
大数据·后端·apache hive
DianSan_ERP5 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
够快云库5 天前
能源行业非结构化数据治理实战:从数据沼泽到智能资产
大数据·人工智能·机器学习·企业文件安全
AI周红伟5 天前
周红伟:智能体全栈构建实操:OpenClaw部署+Agent Skills+Seedance+RAG从入门到实战
大数据·人工智能·大模型·智能体
B站计算机毕业设计超人5 天前
计算机毕业设计Django+Vue.js高考推荐系统 高考可视化 大数据毕业设计(源码+LW文档+PPT+详细讲解)
大数据·vue.js·hadoop·django·毕业设计·课程设计·推荐算法