0

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

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

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

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

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

4

1 回答 1

1

我只是假设您使用的是 Apache HTTP Client 4.x,在4.2.6, 4.3 Beta2之前,在这种情况下javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated很可能来自不受信任的证书(否则这意味着服务器没有发送证书,这是一个不同的问题,此答案中有更多详细信息)。

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

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

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

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

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

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

于 2014-05-28T20:26:27.367 回答