Spring Boot双向认证握手失败问题排查求助
PKIX验证错误排查:Spring Boot RestTemplate调用HTTPS服务失败
我最近在Spring Boot应用里用RestTemplate调用HTTPS服务时,一直遇到PKIX路径验证错误,折腾了好一阵子才解决,把过程分享出来给大家参考。
场景复现
我写的RestTemplate客户端代码如下:
@SpringBootApplication public class SecureAppClientApplication { private static final Logger LOG = LoggerFactory.getLogger(SecureAppClientApplication.class); public static void main(String[] args) { SpringApplication.run(SecureAppClientApplication.class, args); LOG.debug("Testing connecting to secure site"); HttpsURLConnection.setDefaultHostnameVerifier ((hostname, session) -> false); RestTemplate restTemp = new RestTemplate(); String greetings = restTemp.getForObject("https://my.secure.service", String.class); LOG.debug("Received greetings from secured server ---> " + greetings ); } }
对应的application.properties配置:
server.ssl.key-store=myKeyStore.jks server.ssl.key-store-password=Store@123 server.ssl.key-alias=myClient server.ssl.key-password=Key@1234 server.ssl.trust-store=cacerts server.ssl.trust-store-password=changeit
为了让客户端信任服务器证书,我把从Mozilla浏览器导出的主机证书安装到了这些位置:
- 类路径下的
myKeyStore.jks - 类路径下的
cacerts副本 - JDK目录下的
cacerts - JRE目录下的
cacerts
但不管怎么弄,还是抛出了这个错误:
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
初期怀疑方向
一开始我怀疑是这几个原因:
- 从浏览器提取的证书有问题(之前用openssl生成的X509证书测试是正常的)
- 服务器访问路径与证书域名不匹配:我访问的是
https://host/service,但证书只对应https://host - 用
keytool -importcert -file certificate.cer -keystore keystore.jks -alias my-alias导入证书的方式有误
问题定位与解决
后来排查发现问题出在证书链上:从浏览器导出的证书只是终端服务器证书,缺少中间证书和根证书,导致Java无法构建完整的信任链。联系服务器管理员获取了完整的3个证书(根证书、中间证书、终端证书)并安装后,问题就解决了。
总结
实际场景中调用HTTPS Web服务时,不能直接使用浏览器导出的证书——浏览器本身会自动处理证书链,但Java的信任库需要完整的证书链才能验证通过。一定要获取包含所有层级的证书集合,确保Java能找到从终端证书到信任根的完整路径。
内容的提问来源于stack exchange,提问作者soufrk
相关产品推荐
相关产品推荐

