写入SSL套接字时出现以下异常
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
似乎目标服务器的证书不受信任。我在Windows 7机器,jdk7和tomcat7上测试了我的实现没有问题。使用openJDK 6和tomcat7在ubuntu 10 LTS上抛出异常。我得到了套接字目标服务器的sha1和md5指纹。我是否正确,我尝试流式传输的服务器的证书不是我的ubuntu服务器上的trustet?我能指纹到tomcats keystore吗?如果是这样,我该怎么做?
答案 0 :(得分:5)
这不是您需要添加到信任库的指纹,而是实际的证书。
您可以添加服务器证书本身或在链中添加一个CA证书(如果您希望信任来自该CA的所有证书,而不仅仅是该特定服务器)。
要了解证书是什么,您可以使用OpenSSL:
openssl s_client -showcerts -connect your.host.name:443
(用您正在使用的实际端口替换主机名和443。)
--BEGIN/END CERT...--
之间的块是PEM格式的证书。您可以使用openssl x509 -text -noout
检查其内容(并在其中粘贴每个块)。
将要导入的证书保存到纯文本文件中(例如certificate.pem
)。您应该只导入您信任的证书。这里有一定的信念飞跃。 (例如,您可能希望与浏览器连接并检查密钥材料是否匹配。)
要导入您的信任库,请使用:
keytool -importcert -keystore truststore.jks -file certificate.pem
(您可能需要指定别名-alias some_name_you_choose
。)
如果您希望这会影响您的默认信任库,请将truststore.jks
替换为Java主目录中lib/security/cacerts
的路径(默认密码应为changeit
)。
由于目标服务器似乎来自一个着名的CA(并且它适用于某些版本的JRE),最简单的解决方法当然是手动更新cacerts
文件,从中获取副本与之相关的JRE。毕竟,正如JSSE Reference Guide says:
重要说明:JDK附带有限数量的受信任root / lib / security / cacerts文件中的证书。如 在keytool中记录,您有责任维护(即, 如果使用此文件,请添加/删除此文件中包含的证书 将文件作为信任库。
根据您联系的服务器的证书配置, 您可能需要添加其他根证书。获得所需 来自相应供应商的特定根证书。
事实证明,certificate chain order(在此网站上不正确)肯定存在问题,如Qualys SSL Labs tester所示。