【问题标题】:Do I Really Need to Import a SSL Cert into Java Keystore Manually?我真的需要手动将 SSL 证书导入 Java 密钥库吗?
【发布时间】:2014-05-28 19:59:34
【问题描述】:

我有一个 Java Web 应用程序已经运行了好几个月。它与 Box API (https://upload.box.com/api/2.0) 集成以将文件保存到云服务。出乎意料的是,我们在尝试对 Box Web 服务进行 REST API 调用时开始收到可怕的 javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated 异常。

那里有大量帖子告诉您如何使用 keytool 实用程序手动将证书导入您的密钥存储区。我知道我可以这样做来解决问题。但这真的是正确的解决方法吗?

我的应用程序几个月来一直运行良好的事实使我相信https://upload.box.com 的证书中的某些内容发生了变化。在我的网络浏览器中查看证书,证书似乎有效,并且仅在几周前更新。我的密钥库中缺少什么?

我的密钥库中缺少根 CA 证书吗?如果是这种情况,我可以从较新版本的 Java 中复制 cacerts 文件吗?我的应用程序当前正在运行 JDK 1.6.0_33。

我只是想了解为什么这会突然停止工作以及“真正的”修复应该是什么。修改 JDK 密钥库似乎不是正确的做法。

【问题讨论】:

    标签: java ssl https box


    【解决方案1】:

    我假设您使用的是 Apache HTTP Client 4.x,在 4.2.6, 4.3 Beta2 之前,在这种情况下,javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated 很可能来自不受信任的证书(否则这意味着服务器没有'不发送证书,这是另一个问题,more details in this answer)。

    您尝试访问的服务器的当前证书似乎已于 2014 年 7 月 4 日颁发,因此这表明证书及其链最近确实发生了变化。

    我手头没有 JDK 1.6.0_33,但其中一些 CA 证书可能不是默认捆绑包的一部分。无论如何,更新cacerts 是值得的,即使是在较旧的 JRE 上(例如,如果只是为了删除不应再受信任的 CA 证书)。 JSSE Reference Guide 明确指出(诚然在相当长的文档中间,但值得搜索“重要说明”...):

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

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

    如果您无法升级您的 JRE(Java 6 通常不支持),从较新的版本更新 cacerts 文件肯定是一个明智的折衷方案。

    除了 Java 7 中的各种修复之外,Java 7+ 还允许您连接到需要 SNI 的主机(尽管这个特定主机似乎不是这种情况)。

    【讨论】:

    • 这是我一直在寻找的答案。根据 JSSE 参考指南中的推荐 - “如果您将此文件用作信任库,则维护(即添加/删除)此文件中包含的证书是您的责任”,我已经继续并添加了新证书到密钥库。
    猜你喜欢
    • 2013-01-02
    • 1970-01-01
    • 2017-02-03
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    相关资源
    最近更新 更多