将 PEM 证书链和密钥导入 Java Keystore

Tro*_*ane 34 certificate openssl x509 keystore

有很多关于这个主题的资源,但我发现没有一个能涵盖这个稍微特殊的情况。

我有 4 个文件;

  • 私钥.pem
  • 证书.pem
  • middle_rapidssl.pem
  • ca_geotrust_global.pem

我希望将它们导入一个新的密钥库。

有的站点建议使用DER格式,并一一导入,但由于无法识别密钥而失败。

另一个站点建议使用一个特殊的“ImportKey”类来运行导入,这一直有效,直到我看到链断裂。即证书上的链长为1,忽略中间和ca。

一些网站建议使用 PKCS7,但我什至无法从中获得链条。其他人建议使用 PKCS12 格式,但就我的测试而言,获取整个链也失败了。

非常欢迎任何建议或提示。

小智 54

将所有 *.pem 文件连接成一个 pem 文件,如 all.pem 然后使用私钥 + all.pem 创建 p12 格式的密钥库

openssl pkcs12 -export -inkey private.key -in all.pem -name test -out test.p12
Run Code Online (Sandbox Code Playgroud)

然后将 p12 导出到 jks

keytool -importkeystore -srckeystore test.p12 -srcstoretype pkcs12 -destkeystore test.jks
Run Code Online (Sandbox Code Playgroud)


Aar*_*ley 30

这可能并不完美,但我有一些关于我keytool为您的场景修改的使用说明。

  1. 将根或中间 CA 证书导入现有的 Java 密钥库:

    keytool -import -trustcacerts -alias root -file ca_geotrust_global.pem -keystore yourkeystore.jks
    keytool -import -trustcacerts -alias root -file intermediate_rapidssl.pem -keystore yourkeystore.jks 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 导入前将证书和私钥合并到一个文件中。

    cat certificate.pem privatekey.pem > combined.pem
    
    Run Code Online (Sandbox Code Playgroud)

    这应该会产生类似于以下格式的文件。

    开始证书
    ...
    结束证书 开始
    RSA 私钥
    ...
    结束 RSA 私钥

  3. 将签名的主证书和密钥导入现有的 Java 密钥库:

    keytool -import -trustcacerts -alias yourdomain -file combined.pem -keystore yourkeystore.jks
    
    Run Code Online (Sandbox Code Playgroud)

  • 什么版本的 keytool 允许您像这样链接?此语法给出了“keytool 错误:java.lang.Exception:证书未导入,别名 <root> 已存在”,同时包含 -import 和 -importcert (2认同)

小智 10

如上所述,keytool 不提供从单个(组合)文件导入证书 + 私钥的方法。它运行良好,但只导入了证书,而忽略了私钥。您可以通过以下方式进行检查keytool -list -v -keystore yourkeystore.jks-您的域条目类型是 TrustedCertEntry,而不是 PrivateKeyEntry。

因此,要解决最初的问题,首先应使用 openssl(或类似工具)创建一个 PKCS#12 密钥库,然后使用keytool -importkeystore.