写入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密钥库中吗?如果是这样,我该怎么做?
不是您需要添加到信任库中的指纹,而是实际的证书。
您可以添加服务器证书本身,也可以在链中添加一个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
(您可能需要指定一个别名wit -alias some_name_you_choose
。)
如果您希望这影响默认的信任库,请替换truststore.jks
为lib/security/cacerts
Java主目录中的路径(默认密码应为changeit
)。
由于目标服务器无论如何似乎都来自著名的CA(并且适用于JRE的某些版本),因此最简单的修复方法当然是cacerts
手动更新文件,并从与其一起工作的JRE中获取副本。毕竟,正如《JSSE参考指南》所说:
重要说明:JDK随附了/ lib / security /
cacerts文件中有限数量的受信任的根证书。如keytool中所述,如果您将此文件用作信任库,则有责任维护(即添加/删除)此文件中包含的证书。根据您联系的服务器的证书配置,您可能需要添加其他根证书。从适当的供应商处获取所需的特定根证书。
事实证明,证书链顺序肯定是有问题的(在此站点上不正确),如Qualys
SSL Labs测试仪所示。
问题内容: 我的文件带有证书链-certificate.cer: 我需要将此证书链添加到密钥库。 我做的事: 结果,我在密钥库中只有1个证书。 但是应该有3. 什么地方可能出问题? 解决方案: CA向我发送了PKCS#7格式的证书。 我将它们存储在certificate.p7b文件中,然后通过以下命令将它们成功添加到密钥库中: 问题答案: 从keytool管理员中-如果以PKCS#7格式输入,它将
问题内容: 我正在编写NIO服务器,并希望根据用户请求进行响应,即将一些数据写入通道。 读取一些数据后,我想响应。这意味着我需要添加到键,然后将键添加到“ 选定键”集中 ,然后一旦键出现在选定集中,就将一些内容写入通道。 如何将密钥显式添加到所选集中? 问题答案: 你不能 从Javadoc: 键可能无法直接添加到所选键集中。 您只能从中删除密钥。 但是您不需要任何这些。如果要写,只需写,且 仅当
我们的应用程序成功地使用了此证书,并且在此过程中没有抛出任何错误。
问题内容: 我想自动将键添加到Python字典(如果还不存在)。例如, 如果密钥不存在,如何自动创建密钥? 问题答案: 使用:
获得SHA-1指纹的方法与获得指纹的方法相同吗?以前,我运行的是以下命令: 我不清楚我得到的结果是不是SHA-1指纹。有人能澄清一下吗?