Java 获取错误:PKIX路径生成失败:找不到请求目标的有效证书路径
我正试图通过web服务将xml发送到另一个系统。但是在尝试发送时,我得到了以下错误。我已经安装了他们给我的证书。但它仍然不起作用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
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握手中不存在此证书)
${java.home}/lib/security/cacerts
)或更好—创建您自己的信任库(在升级java时不会删除),并通过JVM属性将其提供给您的应用程序
第二种情况的解决方案是使用第一种情况的解决方案,或者更好-说服对方发送正确的证书链。此错误有两种可能的来源:
- 另一方正在使用真正不受信任的证书(自签名或由不受信任的CA签名)
- 或者另一方没有发送证书验证链(例如,在发送到受信任CA的过程中存在中间签名证书,但SSL握手中不存在此证书)
${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密钥工具中安装了证书。它不是自签名证书。