我们需要使用signtool.exe对SHA1和SHA2进行双重签名,我们的证书支持256位SHA2。
使用Windows 8 SDK的signtool:
e.g:
signtool.exe签名/ as / fd sha256 / t http://timestamp.verisign.com/scripts/timstamp.dll / f“certificate.pfx”/ p XXXXXXX“file.dll”
(其中XXXXXXX是我们的证书密码)
因隐秘错误而失败:
SignTool错误:SignedCode :: Sign返回错误:0x80070057 参数不正确。 SignTool错误:尝试签名时发生错误:file.dll
在没有时间戳的情况下进行签名,单独签名为SHA1或SHA256可以正常工作,但我们需要双重签名,并且想象没有时间戳是不行的。
我已经尝试了32位和64位版本的signtool.exe,在Win7和Win8机器上试过它,并尝试使用命令行选项,但无济于事。有没有人在此之前遇到过这个问题?
答案 0 :(得分:16)
我一直在努力做到这一点,并发现以下诀窍。此方法依赖于使用两个Authenticode证书,一个用于SHA-1,另一个用于SHA-256,以确保Windows Vista和Windows Server 2008接受的文件无效,不支持由SHA-256证书签名即使使用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安装程序没有。
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"
答案 1 :(得分:13)
我知道它有点老了,但我登陆了这个帖子,也许其他人也会这样。
如果先使用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中的signtool,不知道它是否适用于以前的版本。
答案 2 :(得分:4)
问题实际上更简单。
问题在于时间戳服务器。
而不是使用 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
答案 3 :(得分:2)
尝试使用
signtool.exe sign /as /fd sha256 /tr http://timestamp.geotrust.com /td sha256 /f certificate.pfx /p XXXXXX file.dll
/ tr用于RFC3161时间戳,/ td显然是要使用的哈希值。
答案 4 :(得分:2)
添加到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"
答案 5 :(得分:1)
我也遇到了上述错误,但在使用' -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。
答案 6 :(得分:0)
我认为this link有一些不错的指示。在martin_costello的回答中提到了一些,但本文提供了更多细节。特别是:
(我自己没有测试过这一切。)