2012-04-25 92 views
0

我有以下异常,而写的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服务器上?我可以将指纹指向tomcats密钥库吗?如果是这样,我该怎么做?

回答

3

这不是您需要添加到信任库的指纹,而是实际的证书。

您可以自己添加服务器证书或在链中添加一个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。 )

如果您希望这会影响你的默认信任,在你的Java主目录的路径替换truststore.jkslib/security/cacerts(默认密码应该是changeit)。


由于目标服务器似乎来自一个著名的CA无论如何(和它的工作原理与JRE的一些版本),最简单的解决方法是一定要手动更新cacerts文件,从取副本JRE与它一起工作。毕竟,作为JSSE Reference Guide says

重要说明:JDK附带受信任的根的数量有限,在/ lib /安全/ cacerts文件 证书。由于keytool中记录了 ,因此如果您将此 文件用作信任库,则您有责任维护(即, 添加/删除)此文件中包含的证书。

根据您联系的服务器的证书配置, 您可能需要添加其他根证书。从相应的供应商处获取所需的 特定根证书。


事实证明,它肯定是与certificate chain order(这是在本网站不正确的)问题,如图Qualys SSL Labs tester

+0

thx为您的快速和qualitiv答案,我尝试。奇怪的是,似乎不被信任的证书来自verisign。它在Firefox中值得信赖。链中必须有一个可信的密钥......:/井如您所描述的那样手动添加它,并检查是否仍然发生异常 – 2012-04-25 13:20:51

+1

它是否已过期或由默认信任存储中较早的verisign CA颁发? (您也可以使用'keytool'列出信任存储的内容。) – Bruno 2012-04-25 13:23:55

+0

您会看看您给我的openssl命令的输出吗? http://nopaste.info/5b3b6db2c6.html;它说链中有一个自我签名的证书......据我的理解,这是不可信的。但浏览器似乎相信它。也许cacert不在我的系统上? – 2012-04-25 15:24:37