编辑:-试图在我的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作为Web服务器。我有两个HTTPS Web应用程序安装在不同端口上但在同一台机器上的不同Tomcat上。说App1(port 8443)
 App2(port 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设置来说很好,但是我不能在生产环境中使用它。

我想知道
为什么当我通过设置设置在server.xml服务器的app2中的相同值和Truststore中的相同值时,上述三种方法不起作用

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的证书添加到位于%JAVA_HOME%\lib\security\cacerts的所用JVM的信任库文件中。

首先,您可以通过运行以下命令来检查证书是否已在信任库中:
keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts"(您无需提供密码)

如果您的证书丢失,可以通过使用浏览器下载证书并将其添加到信任库中,使用以下命令:

keytool -import -noprompt -trustcacerts -alias <AliasName> -file <certificate> -keystore <KeystoreFile> -storepass <Password>

导入后,您可以再次运行第一个命令以检查是否已添加证书。

可以在here中找到Sun / Oracle信息。

关于java - 解决javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31154362/

10-13 04:49