问题描述
我正在尝试在本地测试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>