首页 > 解决方案 > 引起:javax.net.ssl.SSLHandshakeException: PKIX 路径构建 [Spring boot 项目]

问题描述

我有个问题。我不断收到 SSL 异常。我确实配置了这些东西:

  1. 已将证书文件添加到 java cacerts
  2. 已经在我的 Spring Boot 项目中添加了 SSL 配置

但是当我尝试从 Spring Boot 项目调用外部 API 时出现 SSL 异常。

原因:javax.net.ssl.SSLHandshakeException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径 Apr 02 10:04:44 java[13294]:在 sun。 security.ssl.Alert.createSSLException(Alert.java:131) Apr 02 10:04:44 java[13294]: 在 sun.security.ssl.TransportContext.fatal(TransportContext.java:324) Apr 02 10:04:44 java[13294]: 在 sun.security.ssl.TransportContext.fatal(TransportContext.java:267) Apr 02 10:04:44 java[13294]: 在 sun.security.ssl.TransportContext.fatal(TransportContext.java:262 ) 4 月 2 日 10:04:44 java[13294]: 在 sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:654) 4 月 2 日 10:04:44 java[13294]: 在 sun.security.ssl .CertificateMessage$T12CertificateConsumer.onCertificate(CertificateMessage.java:473)4 月 2 日 10:04:44 java[13294]:在 sun.security.ssl.CertificateMessage$T12CertificateConsumer.consume(CertificateMessage.java:369)4 月 2 日 10:04:44 java[13294]:在 sun.security。 ssl.SSLHandshake.consume(SSLHandshake.java:377) Apr 02 10:04:44 java[13294]: 在 sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:444) Apr 02 10:04:44 java[ 13294]:在 sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:422) Apr 02 10:04:44 java[13294]:在 sun.security.ssl.TransportContext.dispatch(TransportContext.java:182) Apr 02 10:04:44 java[13294]: 在 sun.security.ssl.SSLTransport.decode(SSLTransport.java:149) Apr 02 10:04:44 java[13294]: 在 sun.security.ssl.SSLSocketImpl.decode (SSLSocketImpl.java:1143)4 月 2 日 10:04:44 java[13294]:在 sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1054)4 月 2 日 10:04:44 java[13294]:在 sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:394) Apr 02 10:04:44 java[13294]: 在 sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559) 4 月 2 日 10:04:44 java[13294]:在 sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) 4 月 2 日 10:04:44 java[13294]:在 sun.net。 www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1340) Apr 02 10:04:44 java[13294]: 在 sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1315) Apr 02 10:04:44 java[13294]: 在 sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:264) Apr 02 10:04:44 java[13294]: 在 com.sun.xml .internal.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:104) Apr 02 10:04:44 dbx-gauli java[13294]:... 124 更多 Apr 02 10:04:44 java[13294]:原因:sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath。 SunCertPathBuilderException:无法找到请求目标的有效证书路径 Apr 02 10:04:44 java[13294]:在 sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:456) Apr 02 10:04:44 java[13294 ]:在 sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:323) Apr 02 10:04:44 java[13294]:在 sun.security.validator.Validator.validate(Validator.java:271) Apr 02 10:04:44 java[13294]: 在 sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:315) Apr 02 10:04:44 java[13294]: 在 sun.security.ssl.X509TrustManagerImpl.checkTrusted( X509TrustManagerImpl.java:223) Apr 02 10:04:44 java[13294]: 在 sun.security.ssl。X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:129) Apr 02 10:04:44 java[13294]: 在 sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:638) Apr 02 10:04:44 java[ 13294]:... 140 更多 Apr 02 10:04:44 java [13294]:原因:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径 Apr 02 10:04:44 java [13294]:在 sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) Apr 02 10:04:44 java[13294]:在 sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder. java:126) 4 月 2 日 10:04:44 java[13294]:在 java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) 4 月 2 日 10:04:44 java[13294]:在 sun.security。验证器.PKIXValidator.doBuild(PKIXValidator.java:451)checkServerTrusted(X509TrustManagerImpl.java:129)4 月 2 日 10:04:44 java[13294]:在 sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:638)4 月 2 日 10:04:44 java[13294] : ... 140 更多 Apr 02 10:04:44 java[13294]: 原因:sun.security.provider.certpath.SunCertPathBuilderException: 无法找到请求目标的有效认证路径 Apr 02 10:04:44 java[13294 ]:在 sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) Apr 02 10:04:44 java[13294]: 在 sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java: 126) 4 月 2 日 10:04:44 java[13294]:在 java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) 4 月 2 日 10:04:44 java[13294]:在 sun.security.validator。 PKIXValidator.doBuild(PKIXValidator.java:451)checkServerTrusted(X509TrustManagerImpl.java:129)4 月 2 日 10:04:44 java[13294]:在 sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:638)4 月 2 日 10:04:44 java[13294] : ... 140 更多 Apr 02 10:04:44 java[13294]: 原因:sun.security.provider.certpath.SunCertPathBuilderException: 无法找到请求目标的有效认证路径 Apr 02 10:04:44 java[13294 ]:在 sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) Apr 02 10:04:44 java[13294]: 在 sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java: 126) 4 月 2 日 10:04:44 java[13294]:在 java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) 4 月 2 日 10:04:44 java[13294]:在 sun.security.validator。 PKIXValidator.doBuild(PKIXValidator.java:451)451)451)129) 4 月 2 日 10:04:44 java[13294]: 在 sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:638) 4 月 2 日 10:04:44 java[13294]: ... 140 更多4 月 2 日 10:04:44 java [13294]:原因:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径 4 月 2 日 10:04:44 java [13294]:在 sun.security .provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) Apr 02 10:04:44 java[13294]: 在 sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) Apr 02 10: 04:44 java[13294]: at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) Apr 02 10:04:44 java[13294]: at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.爪哇:451)129) 4 月 2 日 10:04:44 java[13294]: 在 sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:638) 4 月 2 日 10:04:44 java[13294]: ... 140 更多4 月 2 日 10:04:44 java [13294]:原因:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径 4 月 2 日 10:04:44 java [13294]:在 sun.security .provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) Apr 02 10:04:44 java[13294]: 在 sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) Apr 02 10: 04:44 java[13294]: at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) Apr 02 10:04:44 java[13294]: at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.爪哇:451)CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:638) Apr 02 10:04:44 java[13294]: ... 140 更多 Apr 02 10:04:44 java[13294]: 原因:sun.security.provider。 certpath.SunCertPathBuilderException:无法找到请求目标的有效认证路径 Apr 02 10:04:44 java[13294]:在 sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) Apr 02 10:04: 44 java[13294]:在 sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) Apr 02 10:04:44 java[13294]:在 java.security.cert.CertPathBuilder.build(CertPathBuilder. java:280) 4 月 2 日 10:04:44 java[13294]: 在 sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:451)CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:638) Apr 02 10:04:44 java[13294]: ... 140 更多 Apr 02 10:04:44 java[13294]: 原因:sun.security.provider。 certpath.SunCertPathBuilderException:无法找到请求目标的有效认证路径 Apr 02 10:04:44 java[13294]:在 sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) Apr 02 10:04: 44 java[13294]:在 sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) Apr 02 10:04:44 java[13294]:在 java.security.cert.CertPathBuilder.build(CertPathBuilder. java:280) 4 月 2 日 10:04:44 java[13294]: 在 sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:451)原因:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效认证路径 Apr 02 10:04:44 java[13294]:在 sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java :141) 4 月 2 日 10:04:44 java[13294]: 在 sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) 4 月 2 日 10:04:44 java[13294]: 在 java.security .cert.CertPathBuilder.build(CertPathBuilder.java:280) Apr 02 10:04:44 java[13294]: 在 sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:451)原因:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效认证路径 Apr 02 10:04:44 java[13294]:在 sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java :141) 4 月 2 日 10:04:44 java[13294]: 在 sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) 4 月 2 日 10:04:44 java[13294]: 在 java.security .cert.CertPathBuilder.build(CertPathBuilder.java:280) Apr 02 10:04:44 java[13294]: 在 sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:451)security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) Apr 02 10:04:44 java[13294]: at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) Apr 02 10:04 :44 java[13294]: 在 sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:451)security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) Apr 02 10:04:44 java[13294]: at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) Apr 02 10:04 :44 java[13294]: 在 sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:451)

我的 Java 配置如下所示:

SSLContext sslContext = SSLContext.getInstance("SSL");

// set up a TrustManager that trusts everything
sslContext.init(null, new TrustManager[] { new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                    System.out.println("getAcceptedIssuers =============");
                    return null;
            }

            public void checkClientTrusted(X509Certificate[] certs,
                            String authType) {
                    System.out.println("checkClientTrusted =============");
            }

            public void checkServerTrusted(X509Certificate[] certs,
                            String authType) {
                    System.out.println("checkServerTrusted =============");
            }
} }, new SecureRandom());

SSLSocketFactory sf = new SSLSocketFactory(sslContext);
Scheme httpsScheme = new Scheme("https", 443, sf);
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(httpsScheme);

标签: springspring-bootsslssl-certificate

解决方案


推荐阅读