使用 signtool.exe 签署多个文件

Posted

技术标签:

【中文标题】使用 signtool.exe 签署多个文件【英文标题】:Sign multiple files with signtool.exe 【发布时间】:2021-05-05 05:32:38 【问题描述】:

我有一个从第三方 CA 购买的数字证书,我想用它来签署包含大量库文件/包 (.bpl) 的软件。但是,一一签名需要很长时间,我想知道有什么方法可以让我使用更短的时间来签署所有文件?

我用于签署文件的当前命令如下:signtool.exe sign /tr http://timestamp.sectigo.com /td sha256 /fd sha256 /a "Insert_path_to_the_file_you_wish_to_sign"

【问题讨论】:

signtool 接受文件名的通配符。如果您的目标文件集可以用通配符(如*.bpl)表示,则将其传递给signtool,而不是"Insert_path_to_the_file_you_wish_to_sign" 哦,我明白了...,谢谢 只是好奇,如果我有 1000 个 .bpl 文件要签名,该命令仍然会一个一个地签名对吗?有没有办法一次签署多个文件? 无论如何,文件都必须单独签名,但它们将全部在一个“会话”中批量处理,只有一个连接到您的提供商。这通常比为每个文件单独运行signtool 更快,但如果连续收到许多请求,一些提供商可能会“限制”签名过程。 即使我启动了几个cmd运行signtool对不同的文件进行签名,它仍然会一个一个地签名对吧? 【参考方案1】:

我在并行循环中使用 signtool 签署了多个文件。它似乎有效,但我注意到我们的证书提供商 (DigiCert) 建议您避免并发请求。 https://dev.digicert.com/best-practices/

因此,我现在在一个命令中使用 signtool - 在一个命令行参数中传递所有文件。根据 Microsoft 的文档,您可以使用“|”每个文件之间。

signtool [命令] [选项] [文件名 | ...]

https://docs.microsoft.com/en-us/dotnet/framework/tools/signtool-exe


也许对某些人有用,Digicert 的 DigiCertUtil 在每个文件之间使用“*”。

Filenames 是要进行代码签名的文件列表。指定更多然后 一个文件,用星号分隔每个文件名或文件路径 特点 *。如果文件路径包含空格,请用引号将其括起来。

示例:DigiCertUtil.exe 签名 /kernelDriverSigning “example.exedriver.sys”示例:DigiCertUtil.exe 签名 /sha1 "054D9508B364A02A068FA5C6153847B6" "example.exedriver.sys"


根据避免并发请求的建议,我假设即使在 SignTool 或 DigiCertUtil 中指定多个文件时,文件仍将一次签署一个。

【讨论】:

signtool不需要需要管道。只需将文件与中间的 空格 连接起来。例如:signtool sign /tr servername.com /td sha256 /f pfxFile.pfx /p password /fd sha256 file1.dll file2.dll file3.dll file4.dll 'file with spaces.dll'。另一个注意事项:我怀疑某些服务器有文件限制 - 我的文件大约是 300 个。 @itsho 我在哪里可以找到这个限制? @HellBaby 我希望我知道。我以艰难的方式发现了它 - 反复试验。还有一件事需要注意 - 避免使用完整路径并在同一目录上运行命令以获得尽可能短的命令 - 它也有助于未知原因。 @itsho 如果可以选择的话...我想从 Azure DevOps 管道应用它,它有很多入口点项目;所以相对路径并不是一个真正的选择。 @HellBaby 我正是通过使用 PowerShell 任务完成的

以上是关于使用 signtool.exe 签署多个文件的主要内容,如果未能解决你的问题,请参考以下文章

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

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

Signtool.exe /dg /ds /di 选项和时间戳

如何为 VS 2017 安装 SignTool.exe?

自动化扩展验证 (EV) 代码签名

使用 Visual Studio 2012 时 SignTool.exe 或“Windows Kits”目录的路径