从Java调用SSL URL会导致证书问题

时间:2014-02-02 15:23:56

标签: java ssl

我正在尝试使用SSL执行API。当我执行调用时,出现以下错误:

org.springframework.web.client.ResourceAccessException: I/O error on GET request for "https://yyyyy.zzz/123":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

我知道StackOverflow中有很多关于这个问题的问题,但我看到的是因为证书是自签名的。在这种情况下,证书是有效的,浏览器可以将其识别为有效证书。

所以我的问题是,为什么在使用Java调用时失败并且在使用浏览器时它确实运行良好?

1 个答案:

答案 0 :(得分:0)

我有同样的问题。浏览器识别证书(和证书路径),但Java虚拟机没有。错误文本是一样的。

在我的情况下,信任根位于Browser keystore和Java trust keystore中。所以每个人都可以查看推力路径但是,如果您的服务器不返回整个证书路径,而只返回服务器1,则更难。在这种情况下,只有当验证者在其推力存储区中具有INTERMEDIATE证书时,才能验证证书路径。

由于java密钥库在浏览器中没有像这些那样定期更新,因此您可以在浏览器中使用中间证书,但不能在JVM中使用。

在这种情况下可能的解决方案:

  • 服务器返回整个证书链
  • 要在java信任库中添加的中间证书

有关详情,请查看Certificate path discovery in Java