将 .p7b 密钥转换为 .pfx

将 .p7b 密钥转换为 .pfx

我有一个 .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 格式?

答案1

PKCS#7 不包括证书/私钥对的私钥部分,它通常用于证书传播(例如作为对 PKCS#10 证书请求的响应、作为分发用于加密消息的 S/MIME 证书的手段、或验证签名消息等)。重要的是要记住,它仅适用于根据定义属于公共项目的证书。

PKCS#12 是一种更通用的容器 - 它旨在将私钥和公钥部分存储在一起,以便可以移动它们。它具有密码保护功能,可以为密钥提供一定程度的保护。

PFX 是 PKCS#12 的前身。

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

Mark Sutton 指出了无法导出为 PFX 的原因 - 相关证书的私钥被标记为不可导出。加密服务提供商 (CSP) 不允许移动该密钥,这是故意的。获得可导出证书\密钥对的唯一*方法是,原始证书是在设置了可导出标志的情况下颁发的。也可能证书没有关联的私钥,但我假设这里的情况并非如此。

有一个很好的总结各种维基百科上的 PKCS 类型

  • 至少这是唯一合法的方法。根据 CSP\Crypto 硬件,可能会有机制,尤其是对于纯软件 CSP,但就我而言,这只是安全漏洞研究的领域,而不是系统管理员。

答案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 重命名步骤并直接使用它;我还没有尝试过......)

答案3

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

我假设您使用 Microsoft 证书颁发机构颁发证书。这是正确的吗?

如果是这样,那么:-

1.确保证书模板允许导出私钥。2
.如何生成证书请求,您可以使用以下技术

创建 INF 文件如下

[Version]
Signature="$Windows NT$

[NewRequest]
Subject="etc"
KeySpec=1
Exportable=1
MachineKeySet=TRUE
ProviderName="CSPName"
ProviderType=1

[RequestAttributes] CertificationTemplate=

注释 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

答案4

正如 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

相关内容