将证书链添加到 p12(pfx) 证书

Posted

技术标签:

【中文标题】将证书链添加到 p12(pfx) 证书【英文标题】:Adding certificate chain to p12(pfx) certificate 【发布时间】:2013-09-18 05:03:32 【问题描述】:

我在 java 和 cxf 中有一个应用程序,它使用客户端证书连接到 WebServices。

我从 WebService 所有者那里获得了证书

证书.p12 certificate.pem certificate.crt trusted_ca.cer root_ca.cer

我无法将此 p12 证书直接转换为 java 所需的工作 jks 密钥库。

我这样做了:

keytool -importkeystore -srckeystore certificate.p12 -srcstoretype PKCS12 -destkeystore certificate1.jks -deststoretype JKS -storepass secret
keytool -import -alias root -file root_ca.cer -trustcacerts -keystore certificate1.jks -storepass secret
keytool -import -alias trusted -file trusted_ca.cer -trustcacerts -keystore certificate1.jks -storepass secret

但是这个 jks 不起作用,我在使用这个 certificate1.jks 时收到 HTTP 响应 '403: Forbidden'

但是,如果我将此 p12(pfx) 证书导入 Internet Explorer,然后将此证书从 IE 导出为 pfx 格式,选择“在证书路径中包含所有证书”复选框并使用:

keytool -importkeystore -srckeystore certificate.pfx -srcstoretype PKCS12 -destkeystore certificate2.jks -deststoretype JKS -storepass secret
keytool -import -alias root -file root_ca_kir.cer -trustcacerts -keystore certificate2.jks -storepass secret
keytool -import -alias trusted -file trusted_ca_kir.cer -trustcacerts -keystore certificate2.jks -storepass secret

然后一切正常,我可以使用 certificate2.jks 连接到 WebService。

我发现原来的 certificate.p12(pfx) 只包含一个条目(证书链长度:1):

keytool -list -keystore certificate.p12 -storepass secret -storetype PKCS12 -v


*******************************************
*******************************************

Alias name: alias
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=MyCompany, EMAILADDRESS=my.email@domain.com, O=bla, C=PL
Issuer: CN=Trusted CA, O=ble, C=PL
Serial number: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Valid from: ... until: ...
Certificate fingerprints:
         MD5:  XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
         SHA1: XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
         Signature algorithm name: SHA1withRSA
         Version: 3

Extensions:

#1: ObjectId: X.X.XX.XX Criticality=false
KeyUsage [
  DigitalSignature
  Key_Encipherment
]

...

*******************************************
*******************************************

虽然从 IE 导出的带有“包括证书路径中的所有证书”的 certificate.pfx 包含具有第二个受信任 CA 证书的证书链(证书链长度:2):

keytool -list -keystore certificate.p12 -storepass secret -storetype PKCS12 -v



*******************************************
*******************************************

Alias name: alias
Entry type: PrivateKeyEntry
Certificate chain length: 2
Certificate[1]:
Owner: CN=MyCompany, EMAILADDRESS=my.email@domain.com, O=bla, C=PL
Issuer: CN=Trusted CA, O=ble, C=PL
Serial number: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Valid from: ... until: ...
Certificate fingerprints:
         MD5:  XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
         SHA1: XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
         Signature algorithm name: SHA1withRSA
         Version: 3

Extensions:

#1: ObjectId: X.X.XX.XX Criticality=false
KeyUsage [
  DigitalSignature
  Key_Encipherment
]

...

Certificate[2]:
Owner: CN=Trusted CA, O=ble ble ble, C=PL
Issuer: CN=ROOT CA, O=ble ble ble, C=PL
Serial number: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Valid from: ... until: ...
Certificate fingerprints:
         MD5:  XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
         SHA1: XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
         Signature algorithm name: SHA1withRSA
         Version: 3

Extensions:


*******************************************
*******************************************

因此,为了解决我的问题,我需要拥有 p12 证书以及链到受信任的 CA 证书。 我可以通过将 p12 导入 IE,然后使用“在证书路径中包含所有证书”导出回来来做到这一点。

在没有 IE 的情况下如何使用 keytool 或其他工具来做到这一点?

巴里

【问题讨论】:

【参考方案1】:

自己的答案。

我想出了如何用 OpenSSL 做到这一点:

openssl pkcs12 -in certificate.p12 -out clientcert.pem -nodes -clcerts
openssl x509 -in trusted_ca.cer -inform DER -out trusted_ca.pem
openssl x509 -in root_ca.cer -inform DER -out root_ca.pem
cat clientcert.pem trusted_ca.pem root_ca.pem >> clientcertchain.pem
openssl pkcs12 -export -in clientcertchain.pem -out clientcertchain.pfx

【讨论】:

添加以将-nokeys 选项添加到最后一个命令。我有 OpenSSL 1.0.1e-fips 2013 年 2 月 11 日 我花了几个小时寻找这个功能。极好的!我需要它用于 Windows 2008 R2 上的 Tomcat 7.0.63。 @ixe013 如果您希望将私钥存储在生成的 pfx 文件中,则只能使用 -nokeys 选项【参考方案2】:

如果您在 Windows 操作系统中工作,您可以像往常一样通过 IIS 安装证书,然后打开 mmc.exe -> 文件 -> 添加/删除 Snap In -> 双击“证书”选择“计算机帐户” ,下一步,完成,OK。

扩展证书,如果需要,将来自 CA 的证书添加到“中间证书颁发机构”或“受信任的根证书颁发机构”中。

然后转到“虚拟主机”,这里必须是您的网站证书,选择证书,左键单击它,选择导出并按照向导进行操作,要检查的重要事项是“包含私钥”,包括所有证书链,导出所有扩展属性,必须设置密码,选择输出苍蝇名称,就是这样。现在你有一个证书,上面有完整的链。 Facebook 或类似网站没有更多问题。

【讨论】:

以上是关于将证书链添加到 p12(pfx) 证书的主要内容,如果未能解决你的问题,请参考以下文章

将证书转换为 pfx 或 p12 文件格式

使用OpenSSL创建多级CA证书链签发证书并导出为pkcs12/p12/pfx文件

使用OpenSSL创建多级CA证书链签发证书并导出为pkcs12/p12/pfx文件

使用OpenSSL创建多级CA证书链签发证书并导出为pkcs12/p12/pfx文件

如何以编程方式将带有证书链的 pfx 导入证书存储区?

苹果证书导出p12文件