java - java 如何验证证书以及为什么我收到 SSLHandshakeException

标签 java ssl spring-security ssl-certificate

我尝试使用 RestTemplte 从服务器 A 上的服务和服务器 B 上的其他服务调用 api,但出现以下错误:

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

即使我将此配置(下面的代码)添加到其余模板中,仍然存在同样的问题。

SSLContext sslContext = new SSLContextBuilder()
                .loadTrustMaterial(new File(keystore), trustStorePassword.toCharArray())
                .build();
        SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext);
        HttpClient httpClient = HttpClients.custom()
                .setSSLSocketFactory(socketFactory)
                .build();
        HttpComponentsClientHttpRequestFactory factory =
                new HttpComponentsClientHttpRequestFactory(httpClient);
        RestTemplate restTemplate = new RestTemplate(factory);

我在网上找到的解决方案是从chrome导出证书并将其添加到JVM信任证书中。我不知道这是否是正确的解决方案,因为我们可以每 3 个月更改此证书..

我还有其他一些问题:

  • JVM 是否知道所有证书颁发机构(我认为有十亿个..),例如,当我使用其余证书调用 google 时,JVM 将使用“security/cacerts”对 JVM 进行验证?

  • 我应该在 JVM 受信任的证书中添加我们的证书来修复 sun.security.validator.ValidatorException: PKIX 路径构建失败: sun.security.provider.certpath.SunCertPathBuilderException: 无法找到有效的证书路径要求的目标;嵌套异常是 javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径

  • SSL 机制不会自动验证过程?

提前谢谢您。

最佳答案

正如您自己所发现的,jvm 当前不信任您的远程服务器的证书。要解决此问题,您必须将信任存储配置为信任该远程服务器。

您确实可以添加远程服务器的直接证书,这应该可以解决您的问题。

但正如您所说,证书可能是短暂的。您应该添加来自证书颁发机构的证书。这应该在 Chrome 的 key 链中可用。

不幸的是,如果您使用自签名证书,则没有证书颁发机构,只有第一个解决方案可用。

关于java - java 如何验证证书以及为什么我收到 SSLHandshakeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59754701/

相关文章:

ssl - 在服务器端检测不受信任的 SSL 访问?

c++ - Cyassl-2.4.2 缺少 libcyassl.a 文件

spring-security - 不支持的配置属性 : [IS_AUTHENTICATED_FULLY] when upgrade from 3. 2.6 至 4.0.1

java - 手动身份验证 Spring Security

java - 如何在 iText 7 中设置横向方向

java - JPA使用set的哪个实现类

java - 如何使用 LinkedHashSet 删除 ArrayList <Object> 中的重复项?

java - 如何将项目jar 添加到eclipseworkspace\.metadata\.plugins\serverfolder\projectfolder\web-inf\lib

apache - 比特纳米 AH02042 : rejecting client initiated renegotiation

java - 如何使用安全 :authentication tag in Spring? 获取用户名