从私钥和 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 CA
、DigiCert Global Root CA
或 DigiCert 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
我不熟悉为 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 CA
、DigiCert Global Root CA
或 DigiCert 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