Edit :我尝试在我的网站上以更合适的方式格式化问题并接受答案blog https://tech-geek-passion.blogspot.com/2017/09/how-to-resolve-javaxnetsslsslhandshakee.html.
这是原来的问题。
我收到此错误:
详细消息 sun.security.validator.ValidatorException: PKIX 路径
构建失败:
sun.security.provider.certpath.SunCertPathBuilderException:无法
找到请求目标的有效认证路径
导致javax.net.ssl.SSLHandshakeException:
sun.security.validator.ValidatorException:PKIX 路径构建
失败:sun.security.provider.certpath.SunCertPathBuilderException:
无法找到请求目标的有效认证路径
我使用 Tomcat 6 作为网络服务器。我在同一台计算机上不同端口的不同 Tomcat 上安装了两个 HTTPS Web 应用程序。假设 App1(端口 8443)和 App2(端口 443)。 App1 连接到 App2。当 App1 连接到 App2 时,出现上述错误。我知道这是一个非常常见的错误,因此在不同的论坛和网站上遇到了许多解决方案。我有以下条目server.xml
两只雄猫的:
keystoreFile="c:/.keystore"
keystorePass="changeit"
每个网站都说同样的原因,app2 提供的证书不在 app1 jvm 的受信任存储中。当我尝试在 IE 浏览器中点击相同的 URL 时,这似乎也是正确的(随着变暖,该网站的安全证书有问题。这里我说继续访问该网站)。但是,当 Java 客户端(在我的例子中)访问相同的 URL 时,我收到上述错误。因此,为了将其放入信任库中,我尝试了以下三个选项:
Option 1
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
Option 2
在环境变量中设置如下
CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Option 3
在环境变量中设置如下
JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Result
但没有任何效果。
最后成功了什么正在执行中建议的Java方法如何使用 Apache HttpClient 处理无效的 SSL 证书? https://stackoverflow.com/questions/1828775/httpclient-and-ssl由 Pascal Thivent 执行,即执行 InstallCert 程序。
但是这种方法对于 devbox 设置来说很好,但我不能在生产环境中使用它。
我想知道为什么当我在中提到相同的值时上述三种方法不起作用server.xml
通过设置 App2 服务器和信任库中的相同值
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());