从私钥和CA证书包

时间:2015-06-17 19:41:01

标签: java ssl-certificate keystore keytool

我是新手为Jetty Server配置SSL。我按照digcert的步骤创建了私钥文件证书申请 CSR文件。

我向CA发送了证书申请,并将我签署的CSR归还。但是CA给我发了一个包含两个证书的包,一个是我的CA签名证书,第二个是CA证书。(1.star_xyx_abc_com crt文件,2.DigiCertCA crt文件)。现在我遇到了从这些文件创建密钥库的麻烦。

当我使用 keytool 按照Oracle docs步骤4,5和6创建密钥库时,我收到了错误

keytool error: java.lang.Exception: Certificate not imported, alias already exists. 

当我使用 openssl 创建 pkcs12 时,我得到了

Loading 'screen' into random state - done 
Error unable to get issuer certificate getting chain.

错误。

如何从私钥文件生成KeyStore,我的证书由CA和CA证书签名?

3 个答案:

答案 0 :(得分:6)

旁白:您有一个由CA签名的证书,但证书不是已签名的CSR。 证书中的某些数据与CSR中的某些数据相同,但不是全部。另外我想知道你为什么要遵循Apache / OpenSSL的digicert指令而不是Tomcat / Java的指令,因为Jetty也是Java,所以会更简单。

无论如何:该Oracle页面上的说明仅在您使用Java密钥工具生成私钥和CSR 时才有效,如步骤1,2,3所述。此外,步骤4和5 + 6是替代;尽管文本不尽如人意,但你做的是其中之一,而不是两者兼而有 - 而且只有在1,2,3之后才能完成。

鉴于您现在的位置,您唯一的选择是将OpenSSL文件转换为pkcs12,然后可能使用keytool将pkcs12转换为JKS。 (Java加密本身可以直接使用pkcs12,但并非所有Java加密应用都可以调用此选项,我不知道Jetty是否可以。)

你说你试过这个并没有详细说明你做了什么,但我猜你很可能你的“Digicert CA”文件是中间 CA而不是root,并且获得一个完整的链,你需要添加根。 (pkcs12格式实际上并不需要完整的链,因此openssl pkcs12子命令也是如此,但是对于像Jetty这样的SSL / TLS非常需要,因此你应该这样做。)

首先检查您的(直接)CA是什么以及DigicertCA.crt

的关系
 openssl x509 -in $yourcert.crt -noout -issuer 
 openssl x509 -in DigicertCA.crt -noout -subject -issuer

如果您的证书的颁发者与DigicertCA的主题匹配,他们(两者)都包含类似DigicertCA的“中间CA”或“SSL CA”,颁发者“CN”是DigiCert Assured ID Root CADigiCert Global Root CADigiCert High Assurance EV Root CA 中的任何一个然后你运气好,只要你(或其他任何人)没有'删除了Java(JRE)安装中默认cacerts的digicert根目录。使用keytool -exportcert将该JRE/lib/security/cacerts中匹配条目中的digicert根复制到文件中。将您的私钥,您的证书,中间“DigicertCA”证书和相应的根证书连接到一个文件中,并将其提供给openssl pkcs12 -export [-name whatever]并将输出定向到文件,并提供非空密码。

(其他情况:如果DigicertCA.crt实际上是根与您的证书的颁发者匹配,那将是非常奇怪的。如果它是根并且与您的证书的颁发者不匹配,你错过了中间CA证书(或者甚至可能不止一个);你应该能够从Digicert得到它们(如果它)(DigicertCA.crt)与你的证书的发行者相匹配而不是根证书发行人不是上面提到的根源之一,你需要更多的证书给你的链,但没有更多的数据我不能建议哪个。)

使用pkcs12文件,执行

keytool -importkeystore -srckeystore p12file -srcstoretype pkcs12 -destkeystore newjksfile

答案 1 :(得分:5)

这是我安装证书所遵循的步骤。

1.使用 OPENSSL 工具,使用三个文件(私钥文件,我的证书,CA证书)处理 PKCS12

openssl pkcs12 -export -out j2vproject.pkcs12 -inkey my_privatekeyfile.key -in star_xyz_abc.crt -certfile DigiCertCA.crt

2.使用 Keytool 工具从PKCS12处理java 密钥库

keytool -v -importkeystore -srckeystore j2vproject.pkcs12 -srcstoretype PKCS12  -destkeystore j2vprojectkeystore.jks -deststoretype JKS

3.将此密钥库添加到服务器并且它有效。

答案 2 :(得分:0)

我尝试从SSL发行版附加CA证书链和cacerts,并将结果用作ca证书链,并且它有效!

cat yourCACert.crt /etc/ssl/certs/ca-certificates.crt > fullCAChain.crt

openssl pkcs12 -export -chain -CAfile fullCAChain.crt -in customercert.cer -inkey customercert.key -out customercert.keystore -name tomcat