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

44

我有一个证书链文件 - 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无法导入证书链,因为://我们只能为每个标识存储一个用户证书。请查看源代码:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/security/tools/KeyTool.java#KeyTool.doImportIdentityDatabase%28java.io.InputStream%29 - My-Name-Is
想要为后人记录我的情况。在尝试将证书安装到WildFly 16的密钥库时,我偶然发现了这篇文章。我的CA给了我2个.cer文件和一个.p7b链文件。我错误地先导入了其中一个.cer文件,并使用了错误的别名,因此一直收到不受信任的证书错误。为了解决问题,我删除了我导入的.cer记录,并使用与私钥相同的别名导入了.p7b文件。完美解决! - Rob Streeter
1
根据我的经验,在遵循了许多不同的在线帖子演示将PEM信任证书链导入JKS密钥库的各种方法后,无论在.p7b或.pem文件中捆绑了多少证书,只有顶部的证书才会被keytool导入命令添加到密钥库文件中。 - RZet
3个回答

42

我通过将所有的pem文件合并在一起使用cat命令解决了这个问题:

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格式的密钥)

我从Let's Encrypt获取了所有PEM文件。


我也试过了,要获取私钥,这个答案很有用:https://security.stackexchange.com/a/66865/141918 - Raul Santelices
5
请注意,如果证书末尾缺少换行符,cat命令将创建一个损坏的pem文件(我曾遇到过这种情况)。因此最好在执行完cat all.pem命令后检查其内容。 - Marcus
对我有用。请注意,MYPASSWORD 不一定适用于存储、源和目标证书密钥。 - Mathieu Diepman
1
我已经搜索了好几天才找到这个答案。如果您拥有证书链、密钥和证书本身的.pem格式,以下是可行的解决方案。谢谢! - FerdTurgusen
非常感谢,这对我很有用。但在我的情况下,我修改了这个:-deststoretype JCEKS,因为在我的代码中它无法识别PKCS12格式。 - danisupr4

13

根据keytool的说明,如果以PKCS#7格式输入,则导入证书链,否则仅导入单个证书。您可以使用openssl通过openssl crl2pkcs7命令将证书转换为PKCS#7格式。


1
我已经获得了 PKCS#7 格式的证书。CA 已经通过电子邮件将它们发送给我。使用以下命令成功将证书添加到密钥库中:keytool -import -trustcacerts -file certificate.p7b -keystore keystore -storepass <mypasswd> -alias "myalias"。谢谢! - Volodymyr Bezuglyy
20
对我来说没有起作用。我收到了错误: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 - My-Name-Is
4
这篇帖子:https://dev59.com/jWkw5IYBdhLWcg3wbqKZ#22028156 说明了keytool无法导入p7p文件! - My-Name-Is
我也无法让 keytool 导入 p7b 文件。 - nont

2
我使用以下内容解决了我的密钥库链问题,感谢@nont。
echo -e 'Concat certs'
cat "${DIR_PATH}/tls/server/public/server.cert.pem" "${DIR_PATH}/tls/intermediate/certs/ca-chain-bundle.cert.pem" > "${DIR_PATH}/tls/server/tomcat/all.cert.pem"
echo -e "Creating new tomcat keystore"
openssl pkcs12 -inkey "${DIR_PATH}/tls/server/private/server.key.pem" -in "${DIR_PATH}/tls/server/tomcat/all.cert.pem" -export -out "${DIR_PATH}/tls/server/tomcat/tomcat.pfx" -password pass:changeit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接