2

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

4

1 回答 1

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

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

如果您希望这影响您的默认信任库,请替换truststore.jks为 Java 主目录中的路径lib/security/cacerts(默认密码应为changeit)。


由于目标服务器似乎来自一个知名的 CA(并且它适用于某些版本的 JRE),最简单的修复当然是cacerts手动更新您的文件,从适用的 JRE 获取副本。毕竟,正如JSSE 参考指南所说

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

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


事实证明,这肯定是证书链顺序的问题(在本网站上不正确),如Qualys SSL Labs tester所示。

于 2012-04-25T13:11:36.943 回答