【问题标题】:Sign multiple files with signtool.exe使用 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对不同的文件进行签名,它仍然会一个一个地签名对吧?

标签: windows certificate digital-signature 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 任务完成的
猜你喜欢
  • 2011-01-12
  • 2021-05-21
  • 2018-09-08
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 2017-12-21
  • 2014-05-15
相关资源
最近更新 更多