突然错误:ValidatorException:PKIX路径构建失败

时间:2018-11-02 08:49:27

标签: java spring spring-boot spring-security

我的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)};

能给我一个提示吗?

  1. 如何为我的所有连接使用相同的TrustStore? 即使我具有相同的域,也收到了该URL,不同的证书,并且需要使用不同的客户端凭据进行连接-因此,对于每个RestTemplate对象,我都配置了不同的SSLContext。我还同时调用了URL(使用JMS队列),所以我想知道是否可以在同一时间访问同一CA文件没有问题。...
  2. 您如何解释为什么这些URL突然停止工作?我们没有在本地或在云中更改我们的Java版本...。对于授权部分,我有点陌生,我无法理解它以前如何工作并突然停止。

谢谢!

  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)

2 个答案:

答案 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中添加证书。