微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

REST客户端调用失败,并显示“ SunCertPathBuilderException:无法找到到请求目标的有效证书路径”

如何解决REST客户端调用失败,并显示“ SunCertPathBuilderException:无法找到到请求目标的有效证书路径”

我正在尝试在本地测试2个应用程序。一个是REST API服务器,另一个是REST客户端。服务器在Eclipse上的Open Liberty上运行。客户端在Eclipse中作为JUnit测试运行。

我已经在Eclipse JRE和服务器配置的信任库中安装了我们的公司证书。单元测试配置为使用已安装证书的JRE,并且我还在运行配置中显式设置了信任库位置:

-Djavax.net.ssl.keyStore="C:\Program Files\Java\jre\lib\security\cacerts"
-Djavax.net.ssl.keyStorePassword=changeit
-Djavax.net.ssl.trustStore="C:\Program Files\Java\jre\lib\security\cacerts"
-Djavax.net.ssl.trustStorePassword=changeit
-Djavax.net.debug=all

错误消息包含:

Caused by: sun.security.validator.ValidatorException: PKIX path building Failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.validator.PKIXValidator.dobuild(PKIXValidator.java:450)
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:317)
    ... 51 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
    ... 57 more

我启用了SSL调试并看到了

*** Certificate chain
chain [0] = [
[
  Version: V3
  Subject: CN=localhost,OU=OpenLibertyServer,O=ibm,C=us
  Signature Algorithm: SHA256withRSA,OID = 1.2.840.113549.1.1.11

  Key:  Sun RSA public key,2048 bits
  params: null
  modulus: <removed.....>
  public exponent: 65537
  Validity: [From: Thu Mar 19 15:08:27 CET 2020,To: Fri Mar 19 15:08:27 CET 2021]
  Issuer: CN=localhost,C=us
  SerialNumber: [    21...29]

Certificate Extensions: 2
[1]: ObjectId: 2.5.29.17 Criticality=false
SubjectAlternativeName [
  DNSName: localhost
]

[2]: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: ...                                       
]

调试还列出了信任库中的所有证书,包括我安装的证书。

这里可能有什么问题或遗漏了?

更新

我将客户端的信任库设置为服务器使用的完全相同的信任库,并且问题已“解决”。这自然是不现实的解决方案,并且可能表明证书确实丢失。至少我可以继续测试...

解决方法

我不确定造成问题的原因是什么,但以我的经验,将受信任的根证书导入Windows存储(可能已由公司推送到该存储中)并添加以下JVM选项会更容易:>

-Djavax.net.ssl.trustStoreType=WINDOWS-ROOT
,

“ C:\ Program Files \ Java \ jre \ lib \ security \ cacerts”是默认的Java信任库,您需要在Java客户端cacerts中添加证书链。 使用工具或Windows将CER格式的证书链导出,然后将其添加到默认的Java信任库中,如下所示:

keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias yourCertAlias -file path\to\yourCertificatChain.cer 

或者,如果您想轻松切换JRE,可以将证书链放入外部信任库中,并使用:

进行调用
-Djavax.net.ssl.trustStore=<truststore path> -javax.net.ssl.trustStorePassword=<truststorepassword>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。