Java应用配置使用Windows信任存储连接HTTPS服务器时出现证书路径构建失败的问题排查求助
我现在碰到个头疼的问题:我正尝试用Java应用通过HTTPS连接公司服务器,所有Windows客户端都已经存储了服务器证书,所以我想让Java应用直接调用Windows的信任存储。
我设置了javax.net.ssl.trustStoreType=Windows-ROOT,按我的理解这应该能让Java使用Windows系统里安装的证书。我创建客户端的代码如下:
static CloseableHttpClient getClientWindowsTrust() throws Exception { System.setProperty("javax.net.ssl.trustStoreType", "Windows-ROOT"); SSLContext sslContext = SSLContext.getDefault(); DefaultClientTlsStrategy strat = new DefaultClientTlsStrategy(sslContext); var connectionManager = PoolingHttpClientConnectionManagerBuilder.create() .setTlsSocketStrategy(strat) .build(); return HttpClients.custom() .setConnectionManager(connectionManager) .build(); }
需要的证书确实在Windows信任存储里,而且其他依赖这些证书的应用都能正常运行,但我的Java应用却抛出了错误:
TransportContext.java:363|Fatal (CERTIFICATE_UNKNOWN): PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
我到底漏掉了什么?有没有办法定位到路径构建具体在哪一步出了问题?
更新进展
感谢各位的回复,我试了所有建议但都没解决问题。之后我把排查重点转向了服务器端——因为客户端这边能想到的办法我都试过了。
后来发现服务器最近更换了新的中间证书,但客户端找不到这个证书。我换了另一台已经部署好新证书的服务器尝试,结果连接成功了。这两台服务器的区别是:服务器1是Windows系统,运行Apache和Tomcat;服务器2是容器化部署的。
目前我猜测是Windows服务器的配置出了问题——我在另一台之前能正常工作的Windows服务器上安装新证书后,它也无法连接了。等有更多信息我会再更新。
问题已解决!
根本不是客户端的问题。我的同事在服务器上安装新证书时,忘记更新Apache的配置了——配置文件里仍然引用的是旧的中间证书,这才导致了连接失败。
内容来源于stack exchange

