我真的需要手动将SSL证书导入Java密钥库吗?

我真的需要手动将SSL证书导入Java密钥库吗?,java,ssl,https,box,Java,Ssl,Https,Box,我有一个Java web应用程序,几个月来一直运行良好。它与Box API()集成以将文件保存到云服务。突然,我们开始收到可怕的javax.net.ssl.SSLPeerUnverifiedException:peer not authenticated异常,同时尝试对Box web服务进行REST API调用 有很多帖子告诉你如何使用keytool工具将证书手动导入密钥库。我知道我可以这样做来解决问题。但这真的是正确的解决方案吗 几个月来,我的应用程序一直运行良好,这一事实让我相信证书中的某些

我有一个Java web应用程序,几个月来一直运行良好。它与Box API()集成以将文件保存到云服务。突然,我们开始收到可怕的
javax.net.ssl.SSLPeerUnverifiedException:peer not authenticated
异常,同时尝试对Box web服务进行REST API调用

有很多帖子告诉你如何使用keytool工具将证书手动导入密钥库。我知道我可以这样做来解决问题。但这真的是正确的解决方案吗

几个月来,我的应用程序一直运行良好,这一事实让我相信证书中的某些东西已经发生了变化。在我的网络浏览器中查看证书,证书似乎有效,并且仅在几周前更新。我的密钥库缺少什么

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


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

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

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

我手头没有JDK1.6.0!33,但有可能其中一些CA证书不是默认捆绑包的一部分。在任何情况下,都值得更新
cacerts
,即使是在较旧的JRE上(例如,如果只是为了删除不应再信任的CA证书)。很明显的状态(当然,在一个相当长的文件的中间,但是值得搜索“重要注释”…):

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

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

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


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

这就是我想要的答案。根据JSSE参考指南中的建议——“如果您将此文件用作信任库,则您有责任维护(即,添加/删除)此文件中包含的证书”,我已经将新证书添加到密钥库中。