更改密钥库中私钥的证书

Change certificate for private key in keystore

是否可以更改密钥库中现有条目(私钥)的证书和证书链。据我了解,首先我需要删除现有条目,然后使用新证书和链存储相同的私钥。这个解决方案不是一个选项,因为我不知道密钥库中该条目的密码。

目前的解决方案:

密钥生成和初始存储:

KeyPair kp = generateRSAKeyPair();
X509Certificate selfSignedCert = makeSelfSignedCert(kp);
ks.load(...);
ks.setKeyEntry("entry1", kp.getPrivate(), PASSWORD, new X509Certificate[]{selfSignedCert});
ks.store(...);

CA发证书后我要:

ks.load(...);
ks.setCertificateEntry("entry1", caSignedCert);
ks.store(...);

主要问题是在将密钥存储到密钥库时我没有正确的证书。生成密钥和 CA 发送签名证书之间存在延迟。

另一种选择是根本不设置证书,在 CA 签署 CSR 后,将最终签署的证书添加到密钥库。类似于:

KeyPair kp = generateRSAKeyPair();
ks.load(...);
ks.setKeyEntry("entry1", kp.getPrivate(), PASSWORD);
ks.store(...);
// after some time
ks.load(...);
ks.setCertificateEntry("entry1", caSignedCert);
ks.store(...);

但是我找不到在密钥库中没有关联证书的情况下存储私钥的方法。将私钥存储在其他地方也不是一种选择。

一个潜在的解决方案是存储来自 CA 的签名证书,直到用户向密钥库条目提供密码,然后删除现有条目并使用适当的证书创建新条目。这个解决方案并不理想,我想避免走这条路。

欢迎提出任何建议。

解决方法是先将密钥与自签名证书一起存储到密钥库中。此时,无法使用此密钥,因为 CA 尚未为此密钥发送正确的证书。如果此时使用密钥进行签名,则会使用关联的自签名证书(这是不可取的)。

一段时间后,CA 发送了正确的证书,该证书必须存储在某个地方(在我的例子中是数据库)。

在提供密钥输入密码的第一次机会时,从密钥库中检索密钥并立即使用相同的密码但不同的别名和来自 CA 的正确证书再次存储。然后删除带有自签名证书的原始条目是安全的。

我希望这对某人有所帮助。欢迎任何更好的解决方案。