繁体   English   中英

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

[英]REST client call fails with "SunCertPathBuilderException: unable to find valid certification path to requested target"

我正在尝试在本地测试 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, OU=OpenLibertyServer, O=ibm, 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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM