如何将指纹添加到密钥库

Mar*_*Cel 2 java ssl keystore ssl-certificate

写入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
Run Code Online (Sandbox Code Playgroud)

似乎目标服务器的证书不受信任。我在Windows 7机器jdk7和tomcat7上测试了我的实现,没有问题。在带有openJDK 6和tomcat7的ubuntu 10 LTS上引发了异常。我得到了套接字目标服务器的sha1和md5指纹。我要流式传输的服务器的证书不是我的ubuntu服务器上的受托人吗?我可以将指纹保存到tomcats密钥库中吗?如果是这样,我该怎么做?

Bru*_*uno 5

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

您可以添加服务器证书本身,也可以在链中添加CA证书之一(如果您希望信任该CA的所有证书,而不仅是该特定服务器的话)。

要了解证书是什么,可以使用OpenSSL:

openssl s_client -showcerts -connect your.host.name:443
Run Code Online (Sandbox Code Playgroud)

(用您使用的实际端口替换主机名和443。)

两者之间的块--BEGIN/END CERT...--是PEM格式的证书。您可以使用openssl x509 -text -noout(并在其中粘贴每个块)检查其内容。

将您要导入的证书保存到纯文本文件中(例如certificate.pem)。您应该只导入您信任的证书。这里有一定的信念飞跃。(例如,您可能想连接浏览器并检查密钥材料是否匹配。)

要导入您的信任库,请使用:

keytool -importcert -keystore truststore.jks -file certificate.pem
Run Code Online (Sandbox Code Playgroud)

(您可能需要指定一个别名wit -alias some_name_you_choose。)

如果希望此操作影响默认信任库,请替换truststore.jkslib/security/cacertsJava主目录中的路径(默认密码应为changeit)。


由于目标服务器无论如何似乎都来自著名的CA(并且适用于JRE的某些版本),因此最简单的解决方案当然是cacerts手动更新文件,并从与其一起工作的JRE中获取副本。毕竟,正如《JSSE参考指南》所说

重要说明:JDK随附了/ lib / security / cacerts文件中有限数量的受信任的根证书。如keytool中所述,如果您将此文件用作信任库,则有责任维护(即添加/删除)此文件中包含的证书。

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


事实证明,证书链顺序肯定是有问题的(在此站点上不正确),如Qualys SSL Labs测试仪所示