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

Create java keystore from private key and CA certificate bundle

我不熟悉为 SSL 配置 Jetty 服务器。我按照 digcert 中的步骤创建了 私钥文件 证书请求 CSR 文件。

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

当我按照 Oracle docs 步骤 4、5 和 6 使用 keytool 创建 keystore 时,出现错误

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.

错误。

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

旁白:您有一个由 CA 签名的证书,但证书是不是签名的 CSR。证书中的 Some 数据与 CSR 中的 some 数据相同,但不是全部。另外,我想知道为什么您遵循 Apache/OpenSSL 的 digicert 说明而不是 Tomcat/Java 的说明,后者会简单得多,因为 Jetty 也是 Java.

无论如何:只有您按照步骤 1、2、3 中的说明使用 Java keytool 生成了私钥和 CSR ,Oracle 页面上的说明才有效。而且,步骤4和5+6是备选方案;尽管文本不是很清楚,但您可以做其中之一,而不是同时做这两个——而且只能在完成 1、2、3 之后。

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

你说你尝试过这个但没有给出你做了什么的细节,但我猜你拥有的 "Digicert CA" 文件很可能是一个 中级 CA不是根,要获得完整的链,您需要添加根。 (pkcs12 格式实际上并不需要完整的链,因此 openssl pkcs12 子命令,但对于 SSL/TLS 非常可取,例如 Jetty,因此您应该这样做。)

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

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

如果您的证书颁发者与 DigicertCA、 的主题匹配,它们(两者)都包含类似 "intermediate CA" 或 "SSL CA"、and DigicertCA 的颁发者有 "CN",它是 DigiCert Assured ID Root CADigiCert Global Root CADigiCert High Assurance EV Root CA then 你的任何一个幸运的是,只要您(或其他任何人)没有从 Java (JRE) 安装中的默认 cacerts 中删除 digicert root。使用 keytool -exportcert 将该数字证书根从 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

这里是我安装证书的步骤。

1.Created 一个 PKCS12 包含三个文件(私钥文件、我的证书、CA 证书),使用 OPENSSL 工具。

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

2.Created 来自 PKCS12 的 java keystore 使用 Keytool 工具。

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

3.added 这个密钥库到服务器并且它有效。

我尝试从 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