将.p7b密钥转换为.pfx


10

我有一个.p7b格式的SSL证书,需要将其转换为.pfx。如果我通过Windows证书管理尝试此操作,则将禁用专家作为.pfx的选项。

尝试使用openssl我发现以下两个命令可以进行转换:

openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
openssl pkcs12 -export -in certificate.cer -inkey privateKey.key -out certificate.pfx -certfile CACert.cer

但我不确定用于第二个命令的密钥是什么,或CACert.cer所指的证书。

如何将该密钥转换为.pfx格式?

Answers:


20

PKCS#7不包括证书/私有密钥对的私有(密钥)部分,它通常用于证书分发(例如,作为对PKCS#10证书请求的响应,作为分发S / MIME证书的一种方式)用于加密邮件或验证签名邮件等)。重要的是要记住,它仅适用于定义为公共项目的证书。

PKCS#12是一个更通用的容器-它旨在将私钥和公用证书部分存储在一起,以便可以随意移动。它具有受密码保护的功能,可以对密钥提供某种保护。

PFX是PKCS#12的前身。

您不能(如Anitak所指出的那样)在没有其他数据(私钥部分)的情况下从PKCS#7转换为PKCS#12,因为PKCS#7没有所有数据。

马克·萨顿(Mark Sutton)指出了为什么您无法导出为PFX-所涉及的证书的私钥被标记为不可导出。加密服务提供商(CSP)不允许移动该密钥,这是有意的。可以获取可导出证书\密钥对的唯一*方法是,如果原始证书是使用可导出标志集颁发的。也有可能没有与证书关联的私钥,但我假设这里不是这种情况。

Wikipedia上有各种PKCS类型的完整摘要。

  • 至少是唯一合法的方法。根据CSP \ Crypto硬件的不同,可能存在一些机制,尤其是仅针对软件的CSP,但这只是我所关注的安全漏洞研究领域,而不是系统管理员。

谢谢-根据我们与第三方交易所需的时间,看来购买新证书可能比收回新证书便宜。
DrStalker

12

我每2年(当我续签代码签名证书时)都要经历一次,每次都很痛苦。

关键信息是您可以将.p7b文件重命名为.spc(如此处所述:http : //support.microsoft.com/kb/269395)。

然后,您可以使用pvk2pfx.exe工具将PVK + SPC转换为PFX。

pvk2pfx.exe -pvk input.pvk -pi <existing_input.pvk_password> -spc input.spc -pfx output.pfx -po <new_output.pfx_password>

(您可能可以跳过p7b重命名步骤并直接使用它;我没有尝试过...)


这比公认的答案有用得多。我对代码签名废话的状态感到惊讶。我担心在证书过期时必须一遍又一遍地重复。
蒂姆(Tim)

3

使用Windows工具,如果禁用了pfx选项,则意味着不能从本地存储中导出私钥。这是因为它不存在(因为未在使用的盒子上生成密钥),或者是在生成密钥时,私钥未标记为可导出,并且Windows证书模板未配置为允许导出。

我假设您使用Microsoft证书颁发机构来颁发您的证书。这个对吗?

如果是这样,则:

1.确保证书模板允许导出私钥。
2.如何生成证书申请,可以使用以下方法

按如下所示创建INF文件

[版本]
签名=“ $ Windows NT $

[NewRequest]
主题=” etc“
KeySpec = 1
Exportable = 1
MachineKeySet = TRUE
ProviderName =” CSPName“
ProviderType = 1

[RequestAttributes] CertificateTemplate =

注意Exportable = 1
然后在命令提示符下使用以下命令

certreq -new infile.inf reqfile.req //其中infile.inf是上面的文件,reqfile是输出请求文件

certreq -submit -config \ reqfile.req //将证书请求提交给CA

一旦完成,您将能够将证书导出为pfx

或者转到http://www.blacktipconsulting.com/Site/Products.html,我在其中放置了我的免费命令行工具,该工具可以为您完成所有操作,并在完成后将证书导出为pfx


2

正如Helvick指出的那样,PKCS10的响应是PKCS7,它不包含私钥。因此,在生成CSR时,您应该已经生成了privatekey.key文件。您可以使用以下命令。(我知道这是一个有四年历史的问题,但是在按照页面上的讨论进行时我无法做到)。

openssl pkcs7 -inform DER -in PK7BDownloadedArchive.p7b -text -print_certs -out intermediateCert.pem

openssl pkcs12 -export -in intermediateCert.pem -inkey privateKey.key -out FinalPKCS12Cert.p12

祝好运!

问候,JE


您可能不需要-inform参数。
palswim

1

我可能是错的,但我认为您的PCKCS#7文件仅包含证书的公开部分。

PKCS#12文件需要两个部分-因此为什么需要该-inkey选项。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.