从私钥和CA证书包创建Java密钥库

mad*_*ati 7 java keystore keytool ssl-certificate

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

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

当我使用keytool通过遵循Oracle文档步骤4,5和6 创建密钥库时,我收到了一个错误

keytool error: java.lang.Exception: Certificate not imported, alias already exists. 
Run Code Online (Sandbox Code Playgroud)

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

Loading 'screen' into random state - done 
Error unable to get issuer certificate getting chain.
Run Code Online (Sandbox Code Playgroud)

错误.

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

dav*_*085 6

旁白:您拥有由CA签署的证书,但证书不是已签名的CSR.一些在证书数据是一样的一些在CSR的数据,而不是整个事情.另外我想知道你为什么遵循Apache/OpenSSL的digicert指令而不是Tomcat/Java的指令,因为Jetty也是Java,因此会更加简单.

无论如何:如果您使用Java keytool生成私钥和CSR ,则该Oracle页面上的说明仅适用于步骤1,2,3中所述.此外,步骤4和5 + 6是替代方案 ; 虽然文本不是那么清楚,但你做的是其中之一,而不是两者兼而有 - 并且只做完1,2,3之后.

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

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

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

 openssl x509 -in $yourcert.crt -noout -issuer 
 openssl x509 -in DigicertCA.crt -noout -subject -issuer
Run Code Online (Sandbox Code Playgroud)

如果您的证书的颁发者DigicertCA的主题相符,他们(双方)包括像"中间CA"或"SSL CA", DigicertCA的发行人"CN",这是任何一个DigiCert Assured ID Root CA,DigiCert Global Root CADigiCert High Assurance EV Root CA 你很幸运,只要你(或其他任何人)没有从cacertsJava(JRE)安装中的默认值中删除digicert根目录.使用keytool -exportcert该digicert根从匹配条目中复制JRE/lib/security/cacerts到文件中.将您的私钥,您的证书,中间"DigicertCA"证书和相应的根证书连接到一个文件中,并将其提供给文件openssl pkcs12 -export [-name whatever]并将其定向到文件,并提供非空密码.

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

使用pkcs12文件,可以

keytool -importkeystore -srckeystore p12file -srcstoretype pkcs12 -destkeystore newjksfile
Run Code Online (Sandbox Code Playgroud)


mad*_*ati 6

在这里,我按照步骤安装证书。

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

openssl pkcs12 -export -out j2vproject.pkcs12 -inkey my_privatekeyfile.key -in star_xyz_abc.crt -certfile DigiCertCA.crt
Run Code Online (Sandbox Code Playgroud)

2. 使用Keytool工具从PKCS12 创建一个Java 密钥库

keytool -v -importkeystore -srckeystore j2vproject.pkcs12 -srcstoretype PKCS12  -destkeystore j2vprojectkeystore.jks -deststoretype JKS
Run Code Online (Sandbox Code Playgroud)

3.将此密钥库添加到服务器,并且可以正常工作。

  • 这个答案也帮助我让它工作,虽然不清楚哪个文件应该代表你的第一个命令中的哪个,但我认为它应该是这样的:my_privatekeyfile.key = private.key, star_xyz_abc.crt = site.crt, DigiCertCA.crt = site.ca-bundle (2认同)