我的Spring Boot应用程序使用REST连接到不同的外部URL,它们都具有相同的域。我收到了此URL证书和其他凭证。
自2天以来,由于我收到“ ValidatorException PKIX路径构建失败”错误(贝洛是该异常的全部堆栈跟踪信息),因此连接不再起作用。
在为每个URL创建一个特定的REST模板之前,我已在其中将SSLContext与特定的密钥库信息和客户端凭据设置在一起。
如果我将以下信任库(我收到了一个CA文件)添加到SSLContext中,则设法解决了该错误:
// Create Trust Managers
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
Certificate ca = certificateFactory.generateCertificate(caInput);
String alias = ((X509Certificate) ca).getSubjectX500Principal().getName();
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null);
trustStore.setCertificateEntry(alias, ca);
TrustManager[] trustManagers = {new CustomTrustManager(trustStore)};
能给我一个提示吗?
谢谢!
org.springframework.web.client.ResourceAccessException: I/O error on GET request for "https://....": sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is 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
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:696)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:644)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:296)
答案 0 :(得分:0)
此错误通常意味着您要与之通信的服务器使用了一个证书,其中(1)您没有将证书连接到客户端,并且(2)您没有用于执行以下操作的中间证书创建连接到客户端的服务器端证书。通常,当证书是自签名的或由不在Java标准密钥库中的证书颁发机构签名时,您会看到此错误。
要确保来自客户端的所有调用都具有,则应将证书添加到应用程序使用的密钥库中。这可以是标准的Java密钥库,也可以是使用启动参数-Djavax.net.ssl.trustStore=<path to keystore>
和-Djavax.net.ssl.trustStorePassword=<password>
连接到JVM的特定于应用程序的密钥库。
如果服务器将其证书更改为您的客户端不知道的内容,则可能会突然出现此错误。
答案 1 :(得分:0)
此问题发生在 IDE 内部(如 Intelij),只需在 IDE 外部终端运行它即可。 要在IDE中运行或调试,需要在intelij中添加证书。