EKS部署Spring Boot调用自签名REST API报PKIX错误如何解决
EKS环境Spring Boot调用自签名REST API PKIX报错排查方案
1. 验证Java进程实际加载的信任库
- 进入运行中Pod执行命令:
kubectl exec -it <Pod名称> -n <命名空间> -- bash - 查看Java进程启动参数:
ps -ef | grep java - 确认是否配置了
-Djavax.net.ssl.trustStore参数:若有配置,核对参数指向的路径是否为你挂载证书的信任库路径;若无配置,确认你导入证书的路径是否为当前JDK版本的默认信任库路径:- OpenJDK 8默认路径:
$JAVA_HOME/jre/lib/security/cacerts - OpenJDK 11+默认路径:
$JAVA_HOME/lib/security/cacerts
- OpenJDK 8默认路径:
2. 核对信任库内证书有效性
执行以下命令确认证书内容匹配、未过期:
- 列出信任库内所有证书:
keytool -list -keystore <信任库路径> -storepass <信任库密码,默认值为changeit>,确认你导入的CA证书别名存在 - 导出信任库内的CA证书:
keytool -export -alias <导入时使用的证书别名> -keystore <信任库路径> -storepass changeit -file /tmp/exported.crt - 对比导出证书和原始自签名证书内容:
diff /tmp/exported.crt <挂载的CA证书文件路径>,确认内容完全一致 - 验证证书有效期:
openssl x509 -in <挂载的CA证书文件路径> -text -noout | grep Validity,确认证书未过期
3. 校验目标API服务端证书链
很多PKIX错误源于服务端返回的证书链不全,在Pod内直接执行SSL握手验证:
- 命令:
openssl s_client -connect <目标API域名:端口> -CAfile <挂载的CA证书路径> - 若返回
Verify return code: 0 (ok),说明证书链无问题,继续下一步排查;若返回其他错误:- 错误为
unable to verify local issuer certificate:说明服务端未返回中间证书,需将中间证书一同导入信任库,或要求服务端配置完整证书链 - 错误为
certificate is valid for <xxx>, not <调用的域名>:说明域名不匹配,需确认调用的API域名和证书内的SAN/CN字段一致,测试环境可临时添加JVM参数-Djdk.internal.httpclient.disableHostnameVerification=true跳过校验(生产环境建议修正证书配置)
- 错误为
4. 排查Spring Boot HTTP客户端自定义配置
部分Spring Boot内置的HTTP客户端会自定义SSL上下文,不使用JVM全局信任库:
- 若使用
RestTemplate:检查是否配置了自定义的ClientHttpRequestFactory,若存在自定义SSL配置,需将根CA加入该自定义SSL上下文 - 若使用
WebClient/HttpClient:检查是否显式配置了SslContext,若有配置需同步添加自签名根CA到信任列表 - 若使用OkHttp客户端:OkHttp默认不会读取JVM默认信任库,需单独配置SSL上下文导入根CA
5. 开启SSL调试日志定位根因
若以上步骤未定位问题,添加JVM调试参数打印完整SSL握手过程:
- 在Deployment的启动命令中添加JVM参数:
-Djavax.net.debug=ssl,handshake - 重启Pod后调用接口,查看日志中信任库加载、证书链校验的具体环节,日志会明确提示校验失败的原因
内容的提问来源于stack exchange,提问作者George Thomas
相关产品推荐
相关产品推荐

