解决javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败错误?

编辑: -试图格式化问题,并在我的博客接受更多的方式接受答案

这是原始问题: -

我收到这个错误

详细消息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作为网络服务器。 我有两个https webbapplication安装在differte端口上的不同tomcat上,但在同一台机器上。 说App1(port 8443)App2(port 443)App1连接到App2 。当App1连接到App2 i以上错误。 我知道这是非常常见的错误,因此在不同论坛和网站上发布了许多解决方案。 我有两个tomcat即server.xml中的条目

keystoreFile="c:/.keystore" 
keystorePass="changeit"

每个站点都表示与app2提供的证书不在app1 jvm的可信存储区中的原因相同。 这似乎也是真实的,当我厌倦打IE浏览器中的相同的URL,它的工作原理(与温暖,这个网站的安全证书有问题,这里我说继续这个网站)但是当相同的URL被击中Java客户端(在我的情况)。 所以我得到上述错误。 所以把它放在可信任我试过这些树选项即

选项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安装,但我无法在生产环境中使用它。

我想知道为什么上面提到的三种方法不起作用,当我在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());

您需要将App2的证书添加到位于%JAVA_HOME%libsecuritycacerts的已用JVM的信任库文件。

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

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

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

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

Sun / Oracle信息可以在这里找到。


javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到要求的目标的有效证书路径

•当我收到错误信息时,我尝试Google表达该表达式的含义,并且发现,当服务器更改其HTTPS SSL证书时,会发生此问题,并且我们的旧版本的Java不能识别根证书颁发机构(CA) 。

•如果您可以在浏览器中访问HTTPS URL,则可以更新Java以识别根CA.

•在浏览器中,转至Java无法访问的HTTPS URL。 点击HTTPS证书链(Internet Explorer中有锁图标),点击锁来查看证书。

•转到证书的“详细信息”和“复制到文件”。 以Base64(.cer)格式复制它。 它将保存在桌面上。

•安装证书,忽略所有警报。

这是我收集我尝试访问的URL的证书信息的方式。

现在我不得不让我的Java版本了解证书,以便进一步它不拒绝识别URL。 在这方面,我必须提及我发现JDK的 jre lib security位置默认存在根证书信息,并且访问的默认密码是: changeit。

要查看cacerts信息,请遵循以下步骤:

•点击开始按钮 - >运行

•输入cmd。 命令提示符打开(您可能需要以管理员身份打开它)。

转到Java/jreX/bin目录

•输入以下内容

keytool -list -keystore D: Java jdk1.5.0_12 jre lib security cacerts

它给出了密钥库中包含的当前证书的列表。 它看起来像这样:

C: Documents and Settings NeelanjanaG> keytool -list -keystore D: Java jdk1.5.0_12 jre lib security cacerts

输入密钥库密码:changeit

密钥库类型:jks

密钥库提供商:SUN

您的密钥库包含44个条目

verisignclass3g2ca,2004年3月26日,trustedCertEntry,

证书指纹(MD5):A2:33:9B:4C:74:78:73:D4:6C:E7:C1:F3:8D:CB:5C:E9

entrustclientca,2003年1月9日,trustedCertEntry,

证书指纹(MD5):0C:41:2F:13:5B:A0:54:F5:96:66:2D:7E:CD:0E:03:F4

thawtepersonalbasicca,1999年2月13日,trustedCertEntry,

证书指纹(MD5):E6:0B:D2:C9:CA:2D:88:DB:1A:71:0E:4B:78:EB:02:41

addtrustclass1ca,2006年5月1日,trustedCertEntry,

证书指纹(MD5):1E:42:95:02:33:92:6B:B9:5F:C0:7F:DA:D6:B2:4B:FC

verisignclass2g3ca,2004年3月26日,trustedCertEntry,

证书指纹(MD5):F8:BE:C4:63:22:C9:A8:46:74:8B:B8:1D:1E:4A:2B:F6

•现在我必须将之前安装的证书包含在cacerts中。

•为此,程序如下:

keytool -import -noprompt -trustcacerts -alias ALIASNAME -file FILENAME_OF_THE_INSTALLED_CERTIFICATE -keystore PATH_TO_CACERTS_FILE -storepass PASSWORD

如果您正在使用Java 7:

keytool -importcert -trustcacerts -alias ALIASNAME -file PATH_TO_FILENAME_OF_THE_INSTALLED_CERTIFICATE -keystore PATH_TO_CACERTS_FILE -storepass changeit

然后它会将证书信息添加到cacert文件中。

这是我为上述Exception提供的解决方案!


如何在Tomcat 7中工作

我想在Tomcat应用程序中支持自签名证书,但以下代码段失败

import java.io.DataOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class HTTPSPlayground {
    public static void main(String[] args) throws Exception {

        URL url = new URL("https:// ... .com");
        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

        httpURLConnection.setRequestMethod("POST");
        httpURLConnection.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
        httpURLConnection.setDoOutput(true);
        DataOutputStream wr = new DataOutputStream(httpURLConnection.getOutputStream());

        String serializedMessage = "{}";
        wr.writeBytes(serializedMessage);
        wr.flush();
        wr.close();

        int responseCode = httpURLConnection.getResponseCode();
        System.out.println(responseCode);
    }
}

这是什么解决了我的问题:

1)下载.crt文件

echo -n | openssl s_client -connect <your domain>:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/<your domain>.crt
  • <your domain>替换<your domain> (例如jossef.com
  • 2)在Java的cacerts证书存储中应用.crt文件

    keytool -import -v -trustcacerts -alias <your domain> -file ~/<your domain>.crt -keystore <JAVA HOME>/jre/lib/security/cacerts -keypass changeit -storepass changeit
    
  • <your domain>替换<your domain> (例如jossef.com
  • 用你的java主目录替换<JAVA HOME>
  • 3)破解它

    即使iv'e在Java的默认证书存储中安装了我的证书,但Tomcat忽略了这一点 (似乎没有配置为使用Java的默认证书存储)。

    为了解决这个问题,请在代码中添加以下内容:

    String certificatesTrustStorePath = "<JAVA HOME>/jre/lib/security/cacerts";
    System.setProperty("javax.net.ssl.trustStore", certificatesTrustStorePath);
    
    // ...
    
    链接地址: http://www.djcxy.com/p/21821.html

    上一篇: Resolving javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed Error?

    下一篇: Client certificate authentication