您需要添加到信任库的不是指纹,而是实际的证书。
您可以添加服务器证书本身或在链中添加 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所示。