【问题标题】:Change certificate for private key in keystore更改密钥库中私钥的证书
【发布时间】:2019-04-20 16:08:14
【问题描述】:

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

目前的解决方案

密钥生成和初始存储:

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

欢迎提出任何建议。

【问题讨论】:

  • I don't know the password for that entry in keystore我相信你需要一个密钥密码来替换密钥对证书

标签: java keystore pkcs#12


【解决方案1】:

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

一段时间后,CA 会发送正确的证书,该证书必须存储在某处(在我的情况下为数据库)。

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

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

【讨论】:

    猜你喜欢
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 2011-02-08
    相关资源
    最近更新 更多