将 GoDaddy 颁发的 .spc 和 .key 文件加入完整的 .pfx / .cer 证书
Posted
技术标签:
【中文标题】将 GoDaddy 颁发的 .spc 和 .key 文件加入完整的 .pfx / .cer 证书【英文标题】:Joining GoDaddy-issued .spc and .key files into a complete .pfx / .cer certificate 【发布时间】:2011-06-08 15:11:22 【问题描述】:我在 .spc
文件中有一个 GoDaddy 颁发的代码签名证书。另外,我在.key
文件中有一个私钥。代码签名已在大约 13 个月前发布,然后过期并与 GoDaddy 续订。在续订过程中,没有请求任何私钥,只是一个新的.spc
文件出现了问题。
现在我面临的问题是,将原始私钥文件与问题证书结合起来,形成一个适合安装到 Windows 证书存储中的.pfx
(或.cer
?)文件。
我正在尝试的命令是:
openssl.exe pkcs12 -inkey my.key -in my.spc -out my.pfx -export
但是,我收到一条错误消息,内容为“没有证书与私钥匹配”。
我已关注this answer on SO 以验证.key
文件是有效的私钥。但是,当我尝试验证 .spc
是有效证书时,我得到了
unable to load certificate
5436:error:0906D06C:PEM routines:PEM_read_bio:no start line:.\crypto\pem\pem_lib.c:650:Expecting: TRUSTED CERTIFICATE
从我的输入生成.pfx
文件的正确方法是什么?我正在使用 OpenSSL 0.9.8k。
【问题讨论】:
你用的是IE8吗? Godaddy 代码签名脚本不适用于 IE8。使用火狐 没有。我正在使用 Chrome 9 和 FireFox 9。不过,我看不到 IE8 与我的问题之间有任何联系。 【参考方案1】:最后我设法找出一个可行的程序。以下是从 SPC 和 KEY 文件生成新 PFX 和 CER 代码签名证书的步骤:
-
从 GoDaddy 获取新的
CodeSign.spc
证书。
从过期的 PFX 中导出 PEM 格式的私钥:
openssl.exe pkcs12 -in CodeSign.pfx -nocerts -out CodeSign.pem
将 PEM 格式的私钥转换为 PVK 格式:
pvk.exe -in CodeSign.pem -topvk -strong -out CodeSign.pvk
将 PVK 和 SPC 组合成 PFX:
pvk2pfx.exe -pvk CodeSign.pvk -pi <passphrase> -spc CodeSign.spc -pfx CodeSign.pfx -po <passphrase> -f
将生成的 PFX 文件导入 Windows 证书存储区。请记住使其可导出。
将其从证书存储导出为二进制 CER 格式为CodeSign.cer
。
可选择从 Windows 证书存储中删除证书。
如果您定期更新证书,您可以存储 PVK 文件并跳过步骤 (2) 和 (3)。
更新:如果您碰巧拥有 CRT 而不是 SPC 格式的证书,请执行以下操作将其转换为 SPC:
openssl crl2pkcs7 -nocrl -certfile CodeSign.crt -outform DER -out CodeSign.spc
来源:
http://www.tech-pro.net/export-to-pvk-spc.html http://ellisweb.net/2008/08/signing-code-using-pvk-and-spc-files/ http://www.drh-consultancy.demon.co.uk/ https://www.sslshopper.com/ssl-converter.html http://russenreaktor.wordpress.com/2010/06/10/solved-convert-signing-certificate-crt-to-spc/您需要的工具:
OpenSSLpvk.exe
— 请参阅该页面底部的下载链接(原始位置可能无法访问;在这种情况下,请参阅 this article 以及指向镜像站点的链接或其他直接下载 link here)
pvk2pfx.exe
— Microsoft SDK 的一部分,随 Visual Studio 2010 安装
【讨论】:
不,正如我的回答中提到的,我必须使用pfx
文件将私钥导出为 PEM 格式。从那以后我再也没有使用过key
文件;每年更新我们的代码签名证书时,请始终遵循上述步骤。
了解 - 这是假设有一个原始 pfx(过期)开始,对吗?就我而言,我没有 PFX - 这就是我想要达到的目标。我基本上在pvk.exe -in CodeSign.pem -topvk -strong -out CodeSign.pvk
上收到了您的指示,但在我的情况下CodeSign.pem
是CodeSign.key
(据我所知,这只是一个PEM 格式的私钥,也可以很容易地命名为CodeSign.pem
)。感谢您的帮助!
是的,我有原始(过期)PFX。我有将所有这些重要文件存储在 Subversion 存储库中的做法,因此我们不会丢失它们(包括历史记录)。所有被加密的私钥也确保了这也是安全的。另一方面,我们避免使用可导出的私钥将完整的公钥/私钥对导入 Windows 的证书存储区,因此单独保留 PFX 非常重要。
能够使用新密钥文件完成说明(使用@Ryan 的方法,将 .pem 替换为 .key 文件)——但证书实际上并不能创建强名称程序集显示“无法从密钥对中提取公钥——密钥集不存在”(旧的 .pfx 文件可以正常工作)。
Ondrej Tucny 的答案对我有用,但有一个修改:我需要在第一步(openssl.exe)中添加“-nodes”参数。要转换为 P12,请使用 Firefox:工具、选项、高级、证书、查看证书、导入 PFX、备份到 P12。【参考方案2】:
我遇到了类似的问题,我花了至少几个小时四处寻找解决方案。 GoDaddy 为我提供了 .spc 和 .pem 文件,如果使用 OpenSSL,我无法创建 .pfx 文件。最后,我使用 MMC 在本地计算机中导入了 .spc 文件。将证书导入我的本地计算机后,我注意到它引入了 GoDaddy 的链文件以及代码签名证书文件本身。 MMC View
现在,选择这两个文件并右键单击以导出为 .pfx 文件。提供一个密码来保护文件,你就完成了。到目前为止,这是最简单直接的解决方案。希望这篇文章能帮助很多人。
【讨论】:
谢谢!经过数小时的搜索,这也解决了我的问题。你是一个救生员。【参考方案3】:您只能使用 openssl 创建 PFX。
从过期的 PFX 中导出 PEM 格式的私钥:
openssl pkcs12 -in CodeSign.pfx -nocerts -out CodeSign.pem
创建 PFX
openssl pkcs7 -in CodeSign.spc -inform der -print_certs | openssl pkcs12 -export -inkey CodeSign.pem -out CodeSign.pfx
【讨论】:
我一直通过 WSL 命令行尝试这些步骤,但它不起作用(第二步会失败,抱怨私钥)。我最终意识到,第一步必须提供 PEM 密码短语。这是您在原始 PFX 文件中可能拥有的任何导入密码的补充。【参考方案4】:在从过期证书文件(.pfx 或 .p12)迁移到使用 GoDaddy 的新证书文件的最后步骤中,当前的答案帖子对我非常有帮助,但我发现它缺少有关如何进行初始步骤的信息从我的原始证书文件生成证书签名请求 (CSR)。
对于寻找类似信息的其他人,这是我最终使用的...
获取私钥:
openssl pkcs12 -in certs-and-key.p12 -out privateKey.key
获取证书:
注意:这会给你 CA 证书
openssl pkcs12 -in certs-and-key.p12 -out certificate.crt -nokeys
更好:使用此命令仅打印客户端证书
openssl pkcs12 -in MacCossLabUW.p12 -clcerts
然后将输出复制到:
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
将其保存到名为 certificate.crt 的文件中
现在检查私钥和证书是否与命令匹配:
openssl rsa -noout -modulus -in privateKey.key | openssl md5
openssl x509 -noout -modulus -in certificate.crt | openssl md5
然后生成一个新的CSR:
openssl x509 -x509toreq -in certificate.crt -out CSR.csr -signkey privateKey.key
使用 CSR 重新加密证书。
下载 GoDaddy 软件发布证书 (.spc) 文件。
验证生成的证书是否与请求私钥匹配:
openssl pkcs7 -inform DER -in certificate.spc -print_certs
然后为您的证书复制输出(注意:输出还将包含 CA 证书):
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
保存到名为 certificate-new.crt 的文件
然后运行命令:
openssl x509 -noout -modulus -in certificate-new.crt | openssl md5
输出应该与使用私钥和请求证书的先前调用相匹配。
要完成该过程,请按照 pvk2pfx 答案中概述的步骤操作。
我还发现这篇文章中的示意图很有帮助:
PVK2PFX Error 0x80070490 - Cannot find certificates that match the key
【讨论】:
【参考方案5】:对于仍在寻找有关如何执行此操作的答案的任何人,我只是花了一天时间弄清楚这一点,并且不得不做这篇文章中列出的各种事情。如果您在 Windows 上使用 git-bash,我必须使用 openssl 将 winpty
添加到所有调用的开头,否则它会卡在空白中。伪步骤如下:
-
使用 openssl 生成私钥和 CSR
openssl req -newkey rsa:2048 -keyout private.key -out my.csr
-
通过 openssl 使用私钥生成 PVK
openssl rsa -in private.key -outform PVK -pvk-strong -out codesign.pvk
-
在 Godaddy 上使用 CSR 生成代码签名证书
从 Godaddy 下载 Zip 并提取 SPC 文件(如 OP 所述)
使用 pvk2pfx 将 PVK 和 SPC 文件组合成代码签名证书。这包含在与 signtool 本身相同的 SDK(和目录)中:
pvk2pfx.exe -pvk codesign.pvk -spc SPC_FILEPATH_HERE -pfx codesign.pfx -pi PVK_PASSWORD -po PFX_PASSWORD
【讨论】:
【参考方案6】:如果您从 IIS 生成证书请求(我在 Windows 2012 Server 上的 IIS 上执行此操作),请在您生成请求的服务器/PC 上执行以下步骤 - 打开 IIS - 点击顶层节点(服务器节点) - 打开服务器证书设置 - 单击右侧操作下的“完成证书请求” - 将您的 spc 文件导入服务器。
然后您可以从这里导出到 PFX 文件
【讨论】:
问题是关于代码签名证书。不幸的是,您的回答无关紧要。以上是关于将 GoDaddy 颁发的 .spc 和 .key 文件加入完整的 .pfx / .cer 证书的主要内容,如果未能解决你的问题,请参考以下文章
使用 Godaddy 颁发的证书时“公钥证书和私钥不匹配”[关闭]
如何从 .SPC(代码签名证书)和 .PKCS12(私钥)生成 PKCS12 (.p12)?