我们有一个使用双向TLSv1.2验证的远程Java客户端应用程序。 意思是服务器先向客户端认证,然后客户端向服务器认证。
这可以通过使用包含来自证书签名机构的已签名证书的.jks文件以及使用SSLSocketFactory来实现。
是否可以与当前证书一起在相同的密钥库和信任库中添加新证书(来自同一机构)?
在当前证书过期后,Java是否会“故障转移”到新证书?
如果是这样,这将允许我们分批推出新的密钥/信任库,而不必在单个企业范围的部署中替换服务器端和客户端上的所有证书。
例如,我们可以使用包含当前证书链和新证书链的新存储来更新服务器端。然后,我们可以在几天内将商店的部署扩展到包含新证书链的客户端。
一些客户与当前链握手,而某些客户与新链握手。
SSL实施是否足够聪明,可以尝试使用商店中所有可用的链,并且/或者在当前证书链到期之日,Java会“故障转移”以使用新的证书链吗?
然后,下次我们需要使用新链更新商店时,可以从商店中删除过期的链。
答案 0 :(得分:2)
可以做您想做的事,但这需要您或维护Java客户端的任何人对其进行编程。显然,存储密钥的密钥库可以包含您希望包含的密钥对。在服务器与客户端之间协商TLS时,服务器可以发送其可以接受的证书颁发机构DN的列表。然后,客户决定从密钥库中选择哪一个。缺省的Java实现将遍历服务器发送的DN列表,并检查它们是否与客户端密钥库中证书上的Issuer DN相匹配。如果找到匹配的证书,则选择将其发送到服务器进行身份验证。如果两个证书匹配,则优先考虑未过期的证书。有关更多详细信息,请参见JDK-8132108。现在,这是默认行为。如果需要更多控制,则需要实现自己的X509KeyManager并实现希望用于客户端证书选择的任何逻辑。