安装更新 SSL 证书会破坏 Java 网络集成?

Instaling updated SSL Certificates breaks Java web integration?

我们在 Windows 2013 服务器上托管了 .Net WCF 服务。通过 HTTPS 公开的服务的 SSL 证书即将到期。已生成更新的证书并将其应用于服务器。

我们所有的 .Net 客户端应用程序继续正常运行,但我们基于 Java 的应用程序开始出现故障。我被告知服务器管理员必须手动进入这些框并使用新更新的证书更新 Java 密钥库。

如果是真的,这让我震惊。所有网络浏览器、.Net 应用程序等...都可以毫无问题地处理 SSL 证书更改。当证书最终再次更新时,您如何防止将来使用 Java 密钥库出现此类问题?在这方面有没有办法让密钥库更多"dynamic"?

您必须确保用于签署证书的根证书已在 Java 默认密钥库中受信任。并非所有证书提供商都是这种情况。您可以使用命令

列出所有根证书
keytool -list -keystore /path/to/your/keystore

然后将该列表与您的证书链进行比较。

Java 客户端不能很好地处理新服务器证书的可能原因很简单,这些客户端的 Java 版本已过时。

Java Runtime Environment (JRE) 的每个安装都带有一个名为 cacerts(位于 <java-home>/lib/security/cacerts)的 trust store 文件,它包括 JVM 中的 SSL/TLS 客户端 运行 将自动信任的所有证书颁发机构 (CA) 和中间证书。如果您的新服务器证书是由不在客户端 JRE 的 cacerts 文件中的 CA 证书 authored/signed,则客户端无法信任该服务器并且设置 SSL/TLS 连接将失败.

我假设 .NET 客户端直接使用底层 Windows OS 的可信证书;如果启用自动 Windows 更新,新的 CA 证书将毫不费力地提供给客户端。网络浏览器也是如此:它们经常通过自动更新保持最新。然而,在许多环境中,新的 JRE 版本——尤其是在 Java 应用程序服务器安装中——需要手动安装,这意味着如果不付出额外的努力,可能无法立即获得最新最好的 CA 证书。

也有可能您的服务器正在使用由 CA 颁发的证书,该证书甚至没有包含在最新 JRE 版本的 cacerts 文件中。在这种情况下,除了让系统管理员手动导入证书外别无选择。