我一直在尝试做这件事,并发现以下方法可以解决问题。此方法依赖于使用两个 Authenticode 证书,一个用于 SHA-1,另一个用于 SHA-256,以确保文件被不支持由 SHA-256 证书签名的 Windows Vista 和 Windows Server 2008 接受为有效即使使用 SHA-1 算法:
signtool.exe sign /sha1 SHA1_Thumprint /v /d "FileDescription" /du "CompanyURL" /fd sha1 /tr http://timestamp.comodoca.com/rfc3161 /td sha1 "FileName.dll"
signtool.exe sign /sha1 SHA256_Thumprint /as /v /d "FileDescription" /du "CompanyURL" /fd sha256 /tr http://timestamp.comodoca.com/rfc3161 /td sha256 "FileName.dll"
/sha1
请注意,使用开关为每个签名步骤明确指定 SHA-1 指纹,/as
用于附加SHA-256 签名。否则 SHA-256 签名将覆盖 SHA-1 签名。
我在这个过程中发现的另一个问题是只有 DLL 和 EXE 支持双重签名。MSI 安装程序没有。
29/12/15 更新:
SHA-1/SHA-256 指纹的格式是 40 个字符的十六进制大写字符串,没有空格。例如:
signtool.exe sign /sha1 0123456789ABCDEF0123456789ABCDEF01234567 /as /v /d "FileDescription" /du "CompanyURL" /fd sha256 /tr http://timestamp.comodoca.com/rfc3161 /td sha256 "FileName.dll"
2015 年 12 月 30 日更新
要使用 SHA-256 证书但使用 SHA-1 哈希对 MSI 文件进行签名,请使用类似于以下的命令:
signtool.exe sign /sha1 SHA256_Thumprint /v /d "FileDescription" /du "CompanyURL" /t http://timestamp.comodoca.com/authenticode "FileName.msi"