我正在用 Java 编写一个应用程序,它通过 HTTPS 连接到两个 Web 服务器。一个通过默认信任链获得受信任的证书,另一个使用自签名证书。当然,连接到第一台服务器开箱即用,而使用自签名证书连接到服务器直到我用该服务器的证书创建一个 trustStore 才起作用。但是,默认情况下与受信任服务器的连接不再起作用,因为显然一旦我创建了自己的默认 trustStore 就会被忽略。
我找到的一种解决方案是将默认 trustStore 中的证书添加到我自己的证书中。但是,我不喜欢这个解决方案,因为它需要我继续管理那个 trustStore。 (我不能假设这些证书在可预见的未来保持不变,对吧?)
除此之外,我发现了两个有类似问题的 5 年前的线程:
它们都深入到 Java SSL 基础结构。我希望现在有一个更方便的解决方案,我可以在代码的安全审查中轻松解释。
原文由 user1785730 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以使用与我在 之前的回答 中提到的类似的模式(针对不同的问题)。
本质上,获取默认信任管理器,创建使用您自己的信任库的第二个信任管理器。将它们都包装在一个自定义的信任管理器实现中,该实现将调用委托给两者(当一个失败时回退到另一个)。
您不必将该上下文设置为默认上下文。您如何使用它取决于您使用的客户端库(以及它从哪里获取套接字工厂)。
话虽这么说,原则上,无论如何,您总是必须根据需要更新信任库。 Java 7 JSSE 参考指南对此有一个“重要说明”,现在 在同一指南的版本 8 中降级为一个“说明” :