【发布时间】:2015-09-18 04:47:34
【问题描述】:
编辑:我尝试在blog 中以更形象的方式格式化问题并接受答案。
这是原始问题。
我收到此错误:
详细消息 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 时,出现上述错误。我知道这是一个非常常见的错误,因此在不同的论坛和网站上遇到了许多解决方案。我在两个 Tomcat 的 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 在How to handle invalid SSL certificates with Apache HttpClient? 中建议的 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());
【问题讨论】:
-
HttpClient and SSL 的可能副本
-
奇怪的是,我在单独没有 SSL 问题的集群服务器之间进行通信时遇到了这个错误。一旦我在我的 RHEL 服务器中正确设置了
domainname,问题就消失了。希望它可以帮助某人。 -
要检查的另一件事是您是否拥有最新版本的 Java - 因此我遇到了类似的错误。
-
stackoverflow.com/questions/2893819/… - 也很相关,也是一个很棒的答案。
-
首先将您的crt文件导入{JAVA_HOME}/jre/security/cacerts,如果您仍然遇到此异常,请更改您的jdk版本。例如从 jdk1.8.0_17 到 jdk1.8.0_231