更改密钥库中私钥的证书

时间:2018-11-17 20:32:22

标签: java keystore pkcs#12

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

到目前为止的解决方案

密钥生成和初始存储:

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的签名证书,直到用户将密码提供给密钥库条目,然后删除现有条目并使用适当的证书创建新条目。这种解决方案并不理想,我想避免走这条路。

欢迎提出任何建议。

1 个答案:

答案 0 :(得分:1)

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

一段时间后,CA发送适当的证书,该证书必须存储在某个地方(在我的情况下是数据库)。

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

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