【问题标题】:How to add fingerprint to keystore如何将指纹添加到密钥库
【发布时间】:2012-04-25 12:55:39
【问题描述】:

写入 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 服务器上不是 trustet 是否正确?我可以指纹到 tomcats 密钥库吗?如果是这样,我该怎么做?

【问题讨论】:

    标签: java ssl ssl-certificate keystore


    【解决方案1】:

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

    您可以添加服务器证书本身或添加链中的 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。)

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


    由于目标服务器似乎来自一个知名的 CA(并且它适用于 JRE 的某些版本),最简单的修复当然是手动更新您的 cacerts 文件,从 JRE 获取副本它的工作原理。毕竟作为JSSE Reference Guide says

    重要提示:JDK 附带有限数量的受信任根 /lib/security/cacerts 文件中的证书。作为 记录在 keytool 中,您有责任维护(即, 添加/删除)如果您使用此文件中包含的证书 文件作为信任库。

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


    事实证明,certificate chain order 肯定有问题(本站不正确),如Qualys SSL Labs tester 所示。

    【讨论】:

    • 感谢您的快速和高质量的回答,我会尝试的。奇怪的是,似乎不受信任的证书来自威瑞信。它在 Firefox 中是受信任的。链中必须有一个威瑞信可信密钥......:/好吧,我会像你描述的那样手动添加它并检查是否仍然发生异常
    • 它是否已过期或由您的默认信任库中较旧的威瑞信 CA 颁发? (您也可以使用keytool 列出信任库的内容。)
    • 你能看一下你给我的 openssl 命令的输出吗? nopaste.info/5b3b6db2c6.html ;它说链中有一个自签名证书……据我所知,这是不可信的。但浏览器似乎信任它。也许我的系统上没有 cacert?
    • self signed certificate in certificate chain 就在那里,因为openssl 默认情况下不使用任何 CA 证书,除非您也明确指定 CA 列表,否则它将对任何服务器执行此操作。这不是问题。但是服务器配置不正确(列表未排序),这可能会导致问题(不确定是否可以联系服务器管理员):webmasters.stackexchange.com/a/28074/11628
    • 不确定哪个服务器属于您。 https://api.sofort.com/ 配置不正确。 (据我了解,您的服务器在这方面是客户端?)如果您尝试从 Java 连接到它,它会抱怨这个问题。
    猜你喜欢
    • 2018-11-07
    • 2013-04-10
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多