编辑:-试图在我的博客上以更合理的方式格式化问题和接受的答案
这是原始问题。
我收到此错误:
详细消息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作为Web服务器。我有两个HTTPS Web应用程序安装在不同端口上但在同一台机器上的不同Tomcat上。说App1(port 8443)
和App2(port 443)
。App1
连接到App2
。当App1
连接到App2
我得到以上错误。我知道这是一个非常常见的错误,因此在不同的论坛和站点上遇到了许多解决方案。我在server.xml
两个Tomcat中都有以下条目:
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");
Option2在环境变量中进行以下设置
CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Option3在环境变量中进行以下设置
JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
但是没有任何效果。
最后执行的工作是执行如何使用Apache HttpClient处理无效的SSL证书中建议的Java方法?由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());
您需要将App2的证书添加到位于的使用的JVM的信任库文件中%JAVA_HOME%\lib\security\cacerts
。
首先,您可以通过运行以下命令来检查证书是否已在信任库中:(keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts"
不需要提供密码)
如果缺少证书,则可以通过使用浏览器下载证书并将其添加到信任库中,使用以下命令:
keytool -import -noprompt -trustcacerts -alias <AliasName> -file <certificate> -keystore <KeystoreFile> -storepass <Password>
导入后,您可以再次运行第一个命令以检查是否已添加证书。
可在此处找到Sun / Oracle信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句