调用API时遇PKIX证书路径构建失败问题求助
解决Java SSL证书PKIX路径构建失败问题
报错信息
javax.net.ssl|ERROR|01|main|2022-11-22 05:56:38.677 UTC|TransportContext.java:361|Fatal (CERTIFICATE_UNKNOWN): PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target ( "throwable" : { sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target Exception in thread "main" javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
排查步骤
确认目标证书是否导入JVM默认信任库
- 定位JVM信任库文件:JDK8及以下路径为
$JAVA_HOME/jre/lib/security/cacerts,JDK9+为$JAVA_HOME/lib/security/cacerts - 用keytool命令检查证书是否存在:
keytool -list -keystore <cacerts文件路径> -alias <自定义证书别名>,默认密码为changeit - 未导入则执行导入命令:
keytool -import -trustcacerts -file <本地证书文件路径> -alias <自定义证书别名> -keystore <cacerts文件路径>
- 定位JVM信任库文件:JDK8及以下路径为
检查代码中是否配置了自定义信任库
- 若代码里通过
System.setProperty("javax.net.ssl.trustStore", "xxx")指定了自定义信任库,需确认该库中包含目标服务器的证书 - 避免同时混用默认信任库和自定义信任库,防止加载逻辑冲突
- 若代码里通过
验证服务器证书链完整性
- 使用openssl命令查看服务器返回的完整证书链:
openssl s_client -connect <目标域名>:<端口> -showcerts - 检查输出的证书链是否从服务器证书到根CA证书完整无缺,若缺失中间证书,需将中间证书一并导入信任库
- 使用openssl命令查看服务器返回的完整证书链:
确认本地系统时间准确性
- SSL证书有严格的有效期范围,若本地系统时间与实际时间偏差超过证书有效期,会触发证书验证失败
排查网络代理/防火墙干扰
- 若网络环境存在代理,确认代理未替换服务器证书;若代理使用了自签名证书,需将代理证书导入信任库
内容的提问来源于stack exchange,提问作者Mangesh
相关产品推荐
相关产品推荐

