我们需要使用signtool.exe用SHA1和SHA2对二进制文件进行双重签名,我们的证书支持256位SHA2。
使用Windows8SDK的签名工具:
例如:
signtool.exe sign/as/fd sha256/thttp://timestamp.verisign.com/scripts/timstamp.dll/f"certificate.pfx"/p XXXXXXX"file.dll"
(其中XXXXXXX是我们的证书密码)
失败并出现神秘错误:
SignTool错误:SignedCode::Sign返回错误:0x80070057参数不正确。SignTool错误:尝试签名时出错:file.dll
没有时间戳的签名有效,单独签名为SHA1或SHA256有效,但我们需要双重签名,想象一下没有时间戳是不可能的。
我尝试过signtool.exe的32位和64位版本,在Win7和Win8机器上尝试过,也尝试过使用命令行选项,但都无济于事。以前有人讨论过这个问题吗?
我知道它有点旧,但我在这个线程中着陆了,也许其他人也会。
如果你先用SHA1然后用SHA256:签名,它就会起作用
signtool.exe sign /f cert_file.pfx /t http://timestamp.comodoca.com/authenticode /p cert_password
signtool.exe sign /f cert_file.pfx /as /fd sha256 /tr http://timestamp.comodoca.com/rfc3161 /td sha256 /p cert_password
它在两个签名中使用相同的证书。我使用了Windows 10 SDK中的签名工具,不知道它是否适用于以前的版本。
我一直在尝试做这件事,发现下面的方法成功了。这种方法依赖于使用两个Authenticode证书,一个用于SHA-1,另一个用于SHA-256,以确保文件被Windows Vista和Windows Server 2008接受为有效文件,即使使用了SHA-1算法,它们也不支持由SHA-256证书签名:
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安装程序没有。
2015年12月29日更新:
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"
这个问题实际上要简单得多。
时间戳服务器出现问题。
与此一起使用signtool.exe
/t http://timestamp.comodoca.com
你需要像这样为SHA1 使用它
/tr http://timestamp.comodoca.com /td sha1
对于SHA256
/tr http://timestamp.comodoca.com/?td=sha256 /td sha256
尝试使用
signtool.exe sign /as /fd sha256 /tr http://timestamp.geotrust.com /td sha256 /f certificate.pfx /p XXXXXX file.dll
/tr用于RFC3161时间戳,/td显然用于要使用的哈希。
添加到martin_costello答案中,XP和Vista不支持RFC时间戳。您需要对sha1签名使用/t选项。
signtool.exe sign /sha1 SHA1_Thumprint /v /d "FileDescription" /du "CompanyURL" /fd sha1 /t http://timestamp.verisign.com/scripts/timestamp.dll "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"
我也得到了上面的错误,但是当使用'-nest'选项时,它与osslsigncode实用程序一起工作:
osslsigncode sign -pkcs12 cert1.pfx -h sha1 -t http://timestamp.verisign.com/scripts/timestamp.dll -in original.exe -out intermediate.exe
osslsigncode sign -pkcs12 cert2.pfx -nest -h sha1 -t http://timestamp.verisign.com/scripts/timestamp.dll -in intermediate.exe -out final.exe
官方项目是针对Unix的,但我已经建立了自己的windows fork。
我认为这个链接有一些不错的指针。martin_costello在回答中提到了其中的一些,但本文提供了更多细节。特别是:
- 如果您先对SHA1进行签名,然后对SHA256使用/as,则可以进行"双重签名并包含SHA1文件摘要"。不过,它只能与Windows 8.1 SDK(或更高版本)中的signtool v6.3配合使用
- XP sp3之前的windows版本需要具有"完整SHA1签名"的双重签名,需要两个不同的证书
(不过我自己还没有测试过所有这些。)