【发布时间】:2018-11-07 11:08:00
【问题描述】:
为了更新某些证书,我必须将 jks 密钥库转换为 PKCS#12 密钥库,并在转换过程中包含私钥。我们收到的密钥库是 JKS 密钥库,但是我们的网络服务器使用 PKCS#12 密钥库,我们收到的密钥库只包含证书而不是私钥。
我试图用谷歌搜索并阅读 SO 的几个条目,但我只提出了一个解决方案,这似乎更像是一种解决方法而不是一种好方法,所以我想知道是否有人有更好的方法来解决注入私钥并以更简单的方式从 jks 密钥库转换为 PKCS#12 密钥库。
似乎JKS密钥库只能由keytool操作,但是keytool实用程序不支持将私钥注入trustedCertEntries AFAIK,所以我使用的方法如下:
假设我将私钥作为 pem 文件。
- 使用 keytool 从 jks 密钥库中提取了所有证书。
- 使用 openssl 创建了一个 PKCS#12 密钥库
- 使用 keytool 重命名创建的 PKCS12 中的别名
- 使用 openssl 创建另一个 PKCS#12 密钥库
- 使用 keytool 重命名另一个创建的 PKCS#12 中的别名
- 使用 keytool 将两个密钥库合并为一个
- 导入非私钥证书
所以整个流程如下(以防万一也需要):
openssl pkcs12 -in orig.alias.p12 -nodes -nocerts -out key.pem -passin pass:PASSWORD
keytool -keystore keystore1 -storepass PASSWORD -list
keytool -keystore keystore1 -storepass PASSWORD -rfc -file alias.root.pem -alias "root" -exportcert
keytool -keystore keystore1 -storepass PASSWORD -rfc -file alias.ca3.pem -alias "ca3" -exportcert
keytool -keystore keystore1 -storepass PASSWORD -rfc -file alias.long.pem -alias "long" -exportcert
keytool -keystore keystore1 -storepass PASSWORD -rfc -file alias.short.pem -alias "short" -exportcert
openssl pkcs12 -export -out keystore.p12 -inkey key.pem -in alias.short.pem -passout pass:PASSWORD
keytool -changealias -alias "1" -destalias "short" -keypass PASSWORD -keystore keystore.p12 -storepass PASSWORD
openssl pkcs12 -export -out keystore2.p12 -inkey key.pem -in alias.long.pem -passout pass:PASSWORD
keytool -changealias -alias "1" -destalias "long" -keypass PASSWORD -keystore keystore2.p12 -storepass PASSWORD
keytool -importkeystore -srckeystore keystore2.p12 -srcstoretype pkcs12 -srcstorepass PASSWORD -destkeystore keystore.p12 -deststoretype pkcs12 -deststorepass PASSWORD
keytool -keystore keystore.p12 -storepass PASSWORD -file alias.ca3.pem -alias "ca3" -importcert -noprompt
keytool -keystore keystore.p12 -storepass PASSWORD -file alias.root.pem -alias "root" -importcert -noprompt
keytool -keystore keystore.p12 -storepass PASSWORD -list
例如,我想象如果我可以在导入私钥证书时设置别名,那么之后我就不需要重命名别名了。那可能吗?
无论如何提前谢谢
【问题讨论】:
-
我假设您只需要这样做一次(或者可能一年一次)。在这种情况下,恕我直言,基于 GUI 的程序比坏的旧 keytool 简单得多。我建议使用开源软件KeyStore Explorer。 AFAIR 它应该能够加载 JKS 密钥库并将其保存为 PKCS#12。
-
这里有一些严重错误。如果您将私钥发送给其他任何人,您已经对其造成了致命的危害。从他们没有归还的事实看来,他们一开始就不需要它。在任何情况下,您现在需要做的就是将更新后的 证书 重新导入到已经拥有私钥的原始 JKS 密钥库中。但是您确实需要重新键入。
-
@EJP 也许我不够清楚,但私钥从未发送到另一部分。我刚刚发送了用公钥签名的 CSR,我得到了一个带有证书的 .JKS 文件..
-
@Robert 这可能是一个可行的解决方案。感谢您的建议
标签: ssl openssl keytool pkcs#12 jks