GoDaddy颁发的 .spc 和 .key 文件如何合并成完整的 .pfx / .cer 证书

25
我有一个GoDaddy签发的代码签名证书,存在于一个.spc文件中。同时,我有一个.key文件中的私钥。代码签名证书已经发行了大约13个月,然后过期了并且被GoDaddy续订了。在续订过程中没有请求私钥,只是重新颁发了一个新的.spc文件。
现在我面临的问题是将原始的私钥文件与颁发的证书合并,以形成适合安装到Windows证书存储中的.pfx(或.cer?)文件。
我正在尝试的命令是:
openssl.exe pkcs12 -inkey my.key -in my.spc -out my.pfx -export

然而,我收到了一个错误信息,显示为“No certificate matches private key”

我已经遵循了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。请使用火狐浏览器。 - Nick
1
不,我正在使用Chrome 9和FireFox 9。然而,我看不到IE8和我的问题之间的任何联系。 - Ondrej Tucny
6个回答

40

最终我设法找出一个可行的程序。以下是从SPC和KEY文件生成新的PFX和CER代码签名证书的步骤:

  1. 从GoDaddy获取您的新的CodeSign.spc证书。
  2. 从过期的PFX导出一个PEM格式的私钥:

    openssl.exe pkcs12 -in CodeSign.pfx -nocerts -out CodeSign.pem
    
  3. 将以PEM格式的私钥转换为PVK格式:

  4. pvk.exe -in CodeSign.pem -topvk -strong -out CodeSign.pvk
    
  5. 将PVK和SPC合并为PFX:

  6. pvk2pfx.exe -pvk CodeSign.pvk -pi <passphrase> -spc CodeSign.spc -pfx CodeSign.pfx -po <passphrase> -f
    
  7. 将生成的PFX文件导入Windows证书存储区。记得使其可导出。

  8. 从证书存储区中将其导出为二进制CER格式,名称为CodeSign.cer
  9. 可选地,从Windows证书存储区中删除证书。

如果您定期更新证书,则可以存储PVK文件并跳过步骤(2)和(3)。

更新:如果您恰好拥有CRT格式而非SPC格式的证书,请执行以下操作将其转换为SPC格式:

openssl crl2pkcs7 -nocrl -certfile CodeSign.crt -outform DER -out CodeSign.spc

来源:

您需要的工具:


1
不,正如我在答案中提到的那样,我必须使用 pfx 文件将私钥导出为 PEM 格式。自那以后我就再也没有使用过 key 文件了;每年续订代码签名证书时都会按照上述步骤进行操作。 - Ondrej Tucny
3
明白了 - 这是假定有一个原始的 pfx(已过期)来开始操作,对吗?在我的情况下,我没有 PFX - 那就是我想要解决的问题。基本上,我从pvk.exe -in CodeSign.pem -topvk -strong -out CodeSign.pvk开始按照您的说明进行操作,但在我的情况下,CodeSign.pemCodeSign.key(据我所知,它只是一个PEM格式的私钥,也可以叫做 CodeSign.pem)。感谢您的帮助! - Ryan Griffith
1
是的,我有原始(过期)的PFX。我有一个习惯,将所有这样重要的文件存储在Subversion存储库中,以便我们不会失去它们(包括历史记录)。所有私钥都被加密,确保了安全性。另一方面,我们避免将完整的公钥/私钥对导入到具有可导出私钥的Windows证书存储中,因此保持PFX分开非常重要。 - Ondrej Tucny
2
使用新的密钥文件(使用@Ryan的方法,将.pem替换为.key文件)成功完成了指令,但证书实际上无法用于创建强名称程序集,它显示“无法从密钥对中提取公钥 - 密钥集不存在”(旧的.pfx文件可以正常工作)。 - BrainSlugs83
4
Ondrej Tucny的回答对我有帮助,但需要做一处修改:第一步(openssl.exe)需要添加"-nodes"参数。若要转换为P12格式,请使用Firefox: Tools, Options, Advanced, Certificates, View Certificates, Import PFX, Backup to P12。 - Pierre
显示剩余6条评论

14

我遇到了类似的问题并花费了至少几个小时搜寻解决方案。Godaddy 提供了 .spc 和 .pem 文件,但我使用 OpenSSL 无法创建 .pfx 文件。最终,我使用 MMC 在本地计算机中导入了 .spc 文件。一旦证书被导入到我的本地计算机中,我发现它连同 Code Sign Cert 文件一起带入了Godaddy的链文件。

MMC View

现在,选择这两个文件,右键单击将其导出为 .pfx 文件。提供密码以保护文件,再次确认即可完成操作。迄今为止,这是最简单和直接的解决方案。希望这篇文章能帮助许多人。


谢谢!在搜索了几个小时后,这解决了我的问题。你真是我的救星。 - Christopher Nuccio

11

您只能使用openssl创建PFX。

  1. 从过期的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

  • 1
    我一直在尝试通过WSL命令行执行这些步骤,但无法成功(第二步会失败,并抱怨私钥)。最终我意识到必须为第一步提供PEM密码。这是除了原始PFX文件可能有的任何导入密码之外的另一个密码。 - Paul Mrozowski

    3

    这篇回答对我非常有帮助,特别是在我需要将过期的证书文件(.pfx或.p12)替换为新证书时。但是,我发现它缺少了如何从原始的证书文件生成证书签名请求(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错误0x80070490 - 找不到与密钥匹配的证书

    2
    对于仍在寻找如何执行此操作的任何人,我花了一整天的时间去弄清楚这个问题,并且不得不做一些在此帖子中列出的混合操作。如果您正在Windows上使用 git-bash,则必须在所有使用 openssl 的调用之前添加 winpty,否则它将陷入虚无中。伪步骤如下:
    1. 使用 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
    
    1. 在Godaddy上生成代码签名证书时使用CSR。
    2. 从Godaddy下载Zip文件并提取SPC文件(正如OP所提到的)。
    3. 使用pvk2pfx将PVK和SPC文件合并为代码签名证书。这个工具与signtool本身一样,包含在同一个SDK(和目录)中:
    pvk2pfx.exe -pvk codesign.pvk -spc SPC_FILEPATH_HERE -pfx codesign.pfx -pi PVK_PASSWORD -po PFX_PASSWORD
    

    -1
    如果您是在Windows 2012服务器上的IIS中生成证书请求,请按照以下步骤在生成请求的服务器/计算机上执行: - 打开IIS - 单击顶级节点(服务器节点) - 打开服务器证书设置 - 在右侧操作下单击“完成证书请求” - 将您的spc文件导入服务器。
    从这里,您可以将其导出为PFX文件。

    这个问题涉及到代码签名证书。很遗憾,您的回答与此无关。 - Ondrej Tucny

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接