如何将证书链添加到密钥库?

Posted

技术标签:

【中文标题】如何将证书链添加到密钥库?【英文标题】:How to add certificate chain to keystore? 【发布时间】:2013-04-10 08:02:55 【问题描述】:

我有证书链文件 - certificate.cer:

subject=/C...
issuer=/C=US/O=VeriSign, Inc...
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

subject=/C=US/O=VeriSign, Inc...
issuer=/C=US/O=VeriSign, Inc...
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

subject=/C=US/O=VeriSign, Inc...
issuer=/C=US/O=VeriSign, Inc...
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

我需要将此证书链添加到密钥库。 我做什么:

openssl x509 -outform der -in certificate.cer -out cert.der
keytool -v -importcert -alias mykey -file cert.der -keypass <passwd> -keystore keystore -storepass <passwd> -alias <myalias>

结果我在密钥库中只有 1 个证书。 但是应该有3个。 有什么问题?

解决方案: CA 向我发送了 PKCS#7 格式的证书。 我将它们存储在 certificate.p7b 文件中,然后通过以下命令成功将它们添加到密钥库:

keytool -import -trustcacerts -file certificate.p7b -keystore keystore -storepass <mypasswd> -alias "myalias"

【问题讨论】:

使用了哪个版本的 KeyTool? 6-b14版本无法导入证书链因为:// we can only store one user cert per identity.看源码:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/security/tools/KeyTool.java#KeyTool.doImportIdentityDatabase%28java.io.InputStream%29 想为后代添加我的场景。在尝试将证书安装到 WildFly 16 的密钥库中时偶然发现了这篇文章。我的 CA 给了我 2 个 .cer 文件和一个 .p7b 链文件。我错误地首先导入了一个 .cer 文件,并且使用了错误的别名,因此我收到了不受信任的证书错误。为了解决这个问题,我删除了我导入的 .cer 记录,并使用与私钥相同的别名导入了 .p7b 文件。像魅力一样工作! 根据我的经验,关注了许多不同的在线帖子,演示了将可信证书的 PEM 链导入 JKS 密钥库的各种方法,无论有多少证书捆绑在 .p7b 或 .pem 中文件,它只是keytool import 命令添加到密钥库文件的最上面的一个。 【参考方案1】:

我通过将所有的 pem 放在一起解决了这个问题:

cat cert.pem chain.pem fullchain.pem >all.pem
openssl pkcs12 -export -in all.pem -inkey privkey.pem -out cert_and_key.p12 -name tomcat -CAfile chain.pem -caname root -password MYPASSWORD
keytool -importkeystore -deststorepass MYPASSWORD -destkeypass MYPASSWORD -destkeystore MyDSKeyStore.jks -srckeystore cert_and_key.p12 -srcstoretype PKCS12 -srcstorepass MYPASSWORD -alias tomcat
keytool -import -trustcacerts -alias root -file chain.pem -keystore MyDSKeyStore.jks -storepass MYPASSWORD

(keytool 不知道如何处理 PKCS7 格式的密钥)

我从letsencrypt获得了所有的pem

【讨论】:

也为我工作。要获得该私钥,这个其他答案很有用:security.stackexchange.com/a/66865/141918 请注意,如果证书末尾缺少换行符(发生在我身上),cat 将创建一个损坏的 pem。所以最好在之后检查all.pem的内容。 为我工作。请注意,存储、源和目标证书密钥的 MYPASSWORD 不一定相同。 我一直在寻找这个答案的日子。如果您拥有 .pem 格式的证书链、密钥和证书本身,这就是有效的方法。谢谢!【参考方案2】:

从 keytool man - 它导入证书链,如果输入以 PKCS#7 格式给出,否则只导入单个证书。 您应该能够通过 openssl crl2pkcs7 命令使用 openssl 将证书转换为 PKCS#7 格式。

【讨论】:

我已经拥有 PKCS#7 格式的证书。 CA 已通过电子邮件将它们发送给我。通过以下命令将证书成功添加到密钥库: keytool -import -trustcacerts -file certificate.p7b -keystore keystore -storepass -alias "myalias" 谢谢! 对我不起作用。我收到错误消息:keytool error: java.lang.Exception: Input not an X.509 certificate。 p7p 文件是通过以下方式创建的:openssl crl2pkcs7 -nocrl -certfile cacert.pem -certfile client-cert.pem -out outfile.p7b 这里的帖子:http://***.com/a/22028156/1817029 告诉 keytool 无法导入 p7p 文件! 我也无法使用 keytool 来导入 p7b 文件

以上是关于如何将证书链添加到密钥库?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用keytool将证书创建到PKCS12密钥库?

将证书链保存在 pkcs12 密钥库中

jarsigner 找不到XXX的证书链。xxx必须引用包含私有密钥和相应的公共密钥证书链的有效密钥库密钥条目

jarsigner 找不到XXX的证书链。xxx必须引用包含私有密钥和相应的公共密钥证书链的有效密钥库密钥条目

jarsigner 找不到XXX的证书链。xxx必须引用包含私有密钥和相应的公共密钥证书链的有效密钥库密钥条目

如何使用 keytool 在 PKCS12 密钥库中创建证书?