使用signtool.exe对多个文件进行签名

6
我有一份从第三方CA购买的数字证书,想用它来签署大量的库文件/软件包(.bpl)。然而,逐个签署这些文件需要很长时间,我想知道是否有方法可以让我在更短的时间内签署所有文件?
我目前使用的签名命令如下:
signtool.exe sign /tr http://timestamp.sectigo.com /td sha256 /fd sha256 /a "插入要签名的文件路径"

1
signtool接受文件名通配符。如果您的目标文件集可以用通配符表示(如*.bpl),则将其传递给signtool,而不是"Insert_path_to_the_file_you_wish_to_sign" - dxiv
哦,我明白了...谢谢。 - Leong
只是好奇,如果我有1000个.bpl文件需要签名,那么命令还是一个一个地签名吗?有没有可能一次签名多个文件的方法? - Leong
对二进制文件进行代码签名需要修改它以插入数字证书,因此无论如何都必须逐个完成该部分。根据我的经验,在同一次 signtool 运行中批处理文件比单独为每个文件运行 signtool 要快得多,但我无法确定您的环境,因此您需要尝试并查看它在那里的工作情况。 - dxiv
我尝试启动几个命令并签署不同批次的文件,但似乎它是逐个签署文件而不是同时签署。 - Leong
显示剩余2条评论
1个回答

2
我正在使用signtool在并行循环中签署多个文件。看起来工作正常,但我注意到我们的证书提供商(DigiCert)建议您避免并发请求。 https://dev.digicert.com/best-practices/ 因此,现在我正在使用一个命令中的signtool - 在一个命令行参数中传递所有文件。根据Microsoft的文档,您可以在每个文件之间使用“|”符号。

signtool [command] [options] [file_name | ...]

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


也许对某些人有用,Digicert的DigiCertUtil在每个文件之间使用“*”。
文件名是要进行代码签名的文件列表。要指定多个文件,请使用星号字符*分隔每个文件名或文件路径。如果文件路径包含空格,请用引号括起来。
例如:DigiCertUtil.exe sign /kernelDriverSigning "example.exe * driver.sys" 例如:DigiCertUtil.exe sign /sha1 "054D9508B364A02A068FA5C6153847B6" "example.exe * driver.sys"
基于避免并发请求的建议,我假设即使在SignTool或DigiCertUtil中指定了多个文件,这些文件仍然是一个接一个地签名的。

2
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
@itsho,我在哪里可以找到这个限制? - HellBaby
@HellBaby 我希望我知道。我是通过反复试验才弄明白的。还有一件事情需要注意 - 避免使用完整路径,在相同的目录下运行命令,可以得到最短的命令 - 这也为某种未知原因提供了帮助。 - itsho
如果可以的话,@itsho...我想从Azure DevOps管道中应用此功能,该管道有许多入口项目;因此,相对路径并不是一个真正的选择。 - HellBaby
@HellBaby 我正是通过使用 PowerShell 任务来做到这一点的。 - itsho
显示剩余2条评论

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