使用新证书更新 Java 密钥库和信任库

Updating Java Keystore and Truststores with new Certificates

我们有一个使用双向 TLSv1.2 验证的远程 java 客户端应用程序。 这意味着服务器向客户端进行身份验证,然后客户端向服务器进行身份验证。

这是使用包含来自证书签名机构的签名证书的 .jks 文件和使用 SSLSocketFactory 实现的。

是否可以在当前证书旁边的相同密钥库和信任库中添加新证书(来自同一机构)?

当前证书过期后Java"fail-over"是否会使用新证书?

如果是这样,这将允许我们分批推出新的 key/truststores,而不必在单个企业范围的部署中同时替换服务器端和客户端的所有证书.

例如,我们可以使用包含当前证书链和新证书链的新存储来更新服务器端。然后我们可以在几天内将商店部署到包含新证书链的客户端。

一些客户端与当前链握手,一些客户端与新链握手。

SSL 实施是否足够智能,可以尝试商店中所有可用的链 and/or,在当前证书链过期的那一天,Java 将 "fail-over" 使用新的证书链?

下次我们需要用新链更新商店时,我们可以从商店中删除过期的链。

可以做你想做的事,但它需要你或任何维护你的 Java 客户端的人来编程。存储您的密钥的密钥库显然可以包含您希望它包含的任意数量的密钥对。在服务器和您的客户端之间协商 TLS 时,服务器可以发送它可以接受的证书颁发机构的 DN 列表。然后您的客户决定从您的密钥库中选择哪一个。默认 Java 实现遍历服务器发送的 DN 列表,并检查它们是否与客户端密钥库中证书上的颁发者 DN 匹配。当找到匹配的证书时,选择将其发送到服务器进行身份验证。如果两个证书匹配,则优先考虑未过期的证书。有关详细信息,请参阅 JDK-8132108。现在,这是默认行为。如果你想要更多的控制,你需要实现你自己的 X509KeyManager 并实现你想要的客户端证书选择的任何逻辑。