java - 更改 keystore 中私钥的证书

标签 java keystore pkcs#12

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

到目前为止的解决方案:

key 生成和初始存储:

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(...);

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

另一种选择是根本不设置证书,在 CA 签署 CSR 后,将最终签名的证书添加到 keystore 中。像这样的东西:

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

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

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

欢迎任何建议。

最佳答案

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

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

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

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

关于java - 更改 keystore 中私钥的证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53355311/

相关文章:

java - 从 SCM checkout Maven 项目 : disconnect and merge

java - 在 Android 应用程序中引用图标的方法

java - java中的SSL可信证书

java - 如何在android keystore 中存储私钥?

node.js - NodeJS 从文件加载 PFX 证书

openssl - 将中间证书添加到 pkcs12 文件

java - HTTP 状态 500 - Glassfish 上的内部服务器错误

java - Sonar 鱿鱼 :S2095 when method return Connection

java - 将 SSL 连接与 Akka 结合使用 - 无法使配置正常工作