如何将指纹添加到密钥库

时间:2012-04-25 12:55:40

标签: java ssl ssl-certificate keystore

写入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吗?如果是这样,我该怎么做?

1 个答案:

答案 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所示。