使用 .cer 文件对 .exe 进行签名(signtool.exe 要求的证书名称是啥?)

Posted

技术标签:

【中文标题】使用 .cer 文件对 .exe 进行签名(signtool.exe 要求的证书名称是啥?)【英文标题】:Signing .exe with .cer file (what is my certificate's name that signtool.exe is asking for?)使用 .cer 文件对 .exe 进行签名(signtool.exe 要求的证书名称是什么?) 【发布时间】:2013-11-21 16:30:49 【问题描述】:

我已经为我的程序购买了证书。

我购买它的网站向我发送了一个 .cer 文件 (43-some-really-long-name-9962812767788.cer)。没有发送其他文件,但我几乎 100% 确定我不需要更多文件。

当我点击那个 .cer 文件时,会有如下信息:

用于:(我的数据) 作者:Certum 代码签名 CA 过期:2014-10-24

所有这些信息似乎都很好。

我有我的 .exe 文件,我想用它签名(所以当用户在 Windows 上以管理员身份运行它时,他将能够看到证书信息)。

我发现我可以使用signtool.exe,但是它总是返回一个错误,没有找到满足所有条件的证书。

那么,如何签署我的程序(将 .cer 添加到我的 .exe仅使用 .cer 文件(以及我可以从该 .cer 文件生成的所有文件)?

我没有证书、.cer 和所有证书术语方面的经验,因此请在回答时考虑到这一点(我是一个简单的人...;)


到目前为止,根据MSDN blog,我已经在您的计算机帐户的Trusted Root Certification Authorities 商店中安装了(我认为我以正确的方式).cer:

    开始->运行->MMC 文件 -> 添加/删除 Sanp... 从“添加或删除管理单元”窗口中选择“证书”并单击“添加>”。选择“计算机帐户”,然后单击“下一步”。 选择“本地计算机”并点击“完成”。 打开左侧窗格中的“Trusted Root Certification Authorities”存储并单击“Certificates”,如图 7 所示。然后右键单击右侧窗格并选择“All Task -> Import”。 导入您创建的上述 .cer 文件并安装它。

我现在确实在 MMC 看到了我的 cer:

不过,我不知道如何正确使用 signtool.exe。 命令:

Signtool sign /v 
/t http://timestamp.verisign.com/scripts/timstamp.dll 
/n CER_NAME_HERE FileToSign.exe

失败,因为我不知道我的证书的“CER_NAME_HERE”是什么。

【问题讨论】:

【参考方案1】:

从您的示例中,您实际上并未指定证书文件。

首先,您需要 create a pfx file 包含证书和任何签名 CA 证书,然后使用 /f 选项传递:

signtool.exe sign /f "blah.pfx" /t http://timestamp.comodoca.com/authenticode "filetosign.exe"

/n 选项仅用于从证书存储中选择特定证书。

【讨论】:

当我使用它时(使用正确的 /f "file.cer"),出现错误:SignTool 错误:未找到符合所有给定条件的证书(当我使用不正确的文件名时,例如 / f "badfile.cer" 我收到文件未找到的错误,所以它是不同的)。 @PolGraphic 您可能需要将其转换为包含证书和任何签名 CA 证书的 pfx(证书存储)。我不知道该怎么做。 确实,我需要一个 pfx 文件。您可以将其添加到您的答案中,以便我将其标记为正确答案吗? /f tip 和 pfx tip 共同构成完整的解决方案。 @PolGraphic 改写并链接到另一个答案。 @Deanna 直接使用 pfx 文件是不好的做法。此外,pfx 不是证书存储,请按顺序获取您的术语。请参阅我的答案,了解使用实际存储在证书存储中的密钥签署可执行文件的正确方法。【参考方案2】:

没有看到清晰简洁的答案,所以我会添加这个。

对于 Certum,当您申请证书时,有一个安装选项。使用它安装在您的计算机上。然后,您可以转到浏览器的证书存储,从那里选择证书,然后选择导出。从那里,您可以选择导出 pfx 格式的私钥。

希望这对某人有所帮助, 〜技术老兄。

【讨论】:

【参考方案3】:

将证书保存在证书存储中是正确的方法。直接使用.pfx 文件的想法只是简单地邀请密钥被盗。我敢肯定,为方便起见,提供此类答案的同一个人也会保留保护在某些批处理文件中公开的私钥的密码。无论如何,我敦促每个人都使用证书存储,这就是它们最初创建的原因。

您只需将带有私钥的.pfx 导入Personal 存储。将私钥标记为不可导出以增加安全性。然后您可以使用/n 开关和Issued To 字段的值调用signtool.exe。不再需要密码。如果您使用machine scope 而不是user scope,则还必须包含/sm 开关。

signtool.exe sign /a /n "<Issued_To>" /t "<TimeStamp_Server>" <File_Name>

【讨论】:

【参考方案4】:

我遇到了同样的问题,并通过使用 p12 而不是 pfx 文件类型来修复它。我使用 Firefox 证书管理器和 Comodo 的 user.crt 创建了 p12 文件。命令行是:

signtool sign /f "C:\Test.p12" /p password1 /t http://timestamp.comodoca.com/authenticode /v "C:\Test.msi"

【讨论】:

以上是关于使用 .cer 文件对 .exe 进行签名(signtool.exe 要求的证书名称是啥?)的主要内容,如果未能解决你的问题,请参考以下文章

使用.sig签名验证文件

如何做插件xydii.dlld的数字签名

如何从 pfx / cer 创建 snk?

使用SignTool.exe对文件进行数字签名

.cer 和 .pfx 文件有啥区别

如何对使用 py2exe 生成的二进制文件进行数字签名?