解决 javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed error?
编辑:我试图在我的博客上格式化问题并以更美观的方式接受答案。
这是原始问题。
我收到此错误:
详细的消息 sun.security.validator.Validator异常: PKIX 路径构建失败:
sun.security.provider.certpath.SunCertPathBuilder异常: 找不到到请求目标的有效证书路径原因 javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: 找不到到请求目标的有效证书路径
我正在使用Tomcat 6作为Web服务器。我有两个HTTPS Web应用程序安装在不同端口上的不同Tomcats上,但在同一台机器上。比如 App1(端口 8443)和 App2(端口 443)。应用 1 连接到应用 2。当App1连接到App2时,我收到上述错误。我知道这是一个非常常见的错误,所以在不同的论坛和网站上遇到了许多解决方案。我在两只雄猫中都有以下条目:server.xml
keystoreFile="c:/.keystore"
keystorePass="changeit"
每个站点都说了同样的原因,即 app2 提供的证书不在 app1 jvm 的受信任存储中。当我尝试在IE浏览器中点击相同的URL时,这似乎也是正确的,它可以工作(随着预热,此网站的安全证书存在问题。在这里我说继续这个网站)。但是当Java客户端(在我的情况下)击中相同的URL时,我得到上述错误。因此,为了将其放入信任库,我尝试了以下三个选项:
备选案文1
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
备选案文2
在环境变量中设置下面
CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
备选案文3
在环境变量中设置下面
JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
结果
但没有任何效果。
最后起作用的是执行Pascal Thivent的如何使用Apache HttpClient处理无效的SSL证书中建议的Java方法,即执行程序InstallCert。
但是这种方法对于devbox设置来说很好,但我不能在生产环境中使用它。
我想知道为什么上面提到的三种方法不起作用,当我提到App2服务器中的相同值和信任库中的相同值时,通过设置server.xml
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore") and System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
在 App1 程序中。
有关更多信息,以下是我建立连接的方式:
URL url = new URL(urlStr);
URLConnection conn = url.openConnection();
if (conn instanceof HttpsURLConnection) {
HttpsURLConnection conn1 = (HttpsURLConnection) url.openConnection();
conn1.setHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
reply.load(conn1.getInputStream());