Java 获取错误:PKIX路径生成失败:找不到请求目标的有效证书路径

Java 获取错误:PKIX路径生成失败:找不到请求目标的有效证书路径,java,spring,tomcat,ssl,certificate,Java,Spring,Tomcat,Ssl,Certificate,我正试图通过web服务将xml发送到另一个系统。但是在尝试发送时,我得到了以下错误。我已经安装了他们给我的证书。但它仍然不起作用 javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find val

我正试图通过web服务将xml发送到另一个系统。但是在尝试发送时,我得到了以下错误。我已经安装了他们给我的证书。但它仍然不起作用

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

此错误有两个可能的来源:

  • 另一方正在使用真正不受信任的证书(自签名或由不受信任的CA签名)
  • 或者另一方没有发送证书验证链(例如,在发送到受信任CA的过程中存在中间签名证书,但SSL握手中不存在此证书)
第一种情况的解决方案是将不受信任的CA(或ceriticate本身)添加到您的JRE信任库(
${java.home}/lib/security/cacerts
)或更好—创建您自己的信任库(在升级java时不会删除),并通过JVM属性将其提供给您的应用程序


第二种情况的解决方案是使用第一种情况的解决方案,或者更好-说服对方发送正确的证书链。

此错误有两种可能的来源:

  • 另一方正在使用真正不受信任的证书(自签名或由不受信任的CA签名)
  • 或者另一方没有发送证书验证链(例如,在发送到受信任CA的过程中存在中间签名证书,但SSL握手中不存在此证书)
第一种情况的解决方案是将不受信任的CA(或ceriticate本身)添加到您的JRE信任库(
${java.home}/lib/security/cacerts
)或更好—创建您自己的信任库(在升级java时不会删除),并通过JVM属性将其提供给您的应用程序


第二种情况的解决方案是使用第一种情况的解决方案,或者更好-说服对方发送正确的证书链。

将证书添加到JRE信任库@${java.home}/lib/security/cacerts,或者如果您有自己的信任库,请在应用程序/JVM中提供指向该信任库的路径。例如,一种可能的方法是

或者通过java代码

有关更多信息,请参阅RedHat的详细信息


如果您有自己的信任库,请参考

将证书添加到JRE信任库@${java.home}/lib/security/cacerts,或者在应用程序/JVM中提供指向该信任库的路径。例如,一种可能的方法是

或者通过java代码

有关更多信息,请参阅RedHat的详细信息


这可能会有帮助参考

我现在在2020年遇到了同样的问题,所以我认为这可能会对面临这个问题的人有所帮助

在调用安全API之前,可以使用下面的握手方法代码-

public static void handshakeHttps() throws NoSuchAlgorithmException, KeyManagementException{
    // Create a trust manager that does not validate certificate chains
    TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }
            public void checkClientTrusted(X509Certificate[] certs, String authType) {
            }
            public void checkServerTrusted(X509Certificate[] certs, String authType) {
            }
        }
    };

    // Install the all-trusting trust manager
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

    // Create all-trusting host name verifier
    HostnameVerifier allHostsValid = new HostnameVerifier() {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    };

    // Install the all-trusting host verifier
    HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
    
}

请告诉我使用后问题是否仍然存在。

我在2020年也遇到了同样的问题,因此我认为这可能对面临此问题的人有所帮助

在调用安全API之前,可以使用下面的握手方法代码-

public static void handshakeHttps() throws NoSuchAlgorithmException, KeyManagementException{
    // Create a trust manager that does not validate certificate chains
    TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }
            public void checkClientTrusted(X509Certificate[] certs, String authType) {
            }
            public void checkServerTrusted(X509Certificate[] certs, String authType) {
            }
        }
    };

    // Install the all-trusting trust manager
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

    // Create all-trusting host name verifier
    HostnameVerifier allHostsValid = new HostnameVerifier() {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    };

    // Install the all-trusting host verifier
    HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
    
}

请告诉我使用此证书后问题是否仍然存在。

您在哪里安装了证书?是自签名证书吗?@Avi:我已经在java密钥工具中安装了证书。它不是自签名证书。您在哪里安装了该证书?是自签名证书吗?@Avi:我已经在java密钥工具中安装了证书。它不是自签名证书。