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


29

关于此主题的资源很多,但是我没有找到涵盖这个特例的资源。

我有4个档案;

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

我希望将它们导入到新的密钥库中。

某些站点建议使用DER格式,并将它们一个接一个地导入,但这失败了,因为无法识别密钥。

另一个站点建议运行一个特殊的“ ImportKey”类以进行导入,并且该类一直起作用,直到我看到链条损坏。即,证书上的链长为1,忽略中间部分和ca。

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

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

Answers:


26

这可能并不完美,但是我对我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 
    
  2. 在导入之前,将证书和私钥合并到一个文件中。

    cat certificate.pem privatekey.pem > combined.pem
    

    这将导致文件类似于以下格式。

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

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

    keytool -import -trustcacerts -alias yourdomain -file combined.pem -keystore yourkeystore.jks
    

2
哪个版本的keytool允许您像这样进行链接?此语法给出同时带有-import和-importcert的“ keytool错误:java.lang.Exception:证书未导入,别名<root>已经存在”
ctpenrose 2014年

确切地说,很难说。但是考虑到年份/月份,很可能是Java 6?(不知道次要版本。)您使用的是哪个版本?该错误显示为类似于密钥库本身的问题。(alias <root> already exists)您可以尝试使用新的空密钥库吗?
亚伦·科普利2014年

1
Keytool不允许我使用已经存在的别名“ root”导入证书。但是我认为这是一个错字。有趣的是,当keytool在密钥库中(在任何别名下)找到签名者的证书时,它会为证书本身创建一个链。Java工具“ Portecle”可方便地管理Java密钥库。
豪特曼2014年

Keytool不能像这样工作,并且不允许您多次导入别名。(是的,我已经尝试过了)。请参阅下面的senajqerib的答案,以确保其正常工作。
史蒂夫·塞尔

1
这是一个三年的答案。很有可能情况有所变化,但是我向您保证,截至2013年2月,它已经正常工作(或已接近正常工作,因为我指出这可能并不完美)。请随时提交修改或举报以引起版主注意。
亚伦·科普利

42

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

openssl pkcs12 -export -inkey private.key -in all.pem -name test -out test.p12

然后将p12导出到jks

keytool -importkeystore -srckeystore test.p12 -srcstoretype pkcs12 -destkeystore test.jks

谢谢。这是唯一完整且正确的答案。正如您所建议的,将证书串联到一个文件中要容易得多。
史蒂夫·索瑟

这对我来说就像一种享受!! 我使用这些指令来转换在nodejs-self-signed-certificate-example存储库中使用的密钥链,以与基于Java的TLS服务器通信。太感谢了!
GalderZamarreño16年

这是正确的答案。
sfThomas

8

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.