signtool无法对带有时间戳的SHA2和SHA1进行双重签名

时间:2013-08-30 22:09:09

标签: windows sha256 authenticode signtool verisign

我们需要使用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机器上试过它,并尝试使用命令行选项,但无济于事。有没有人在此之前遇到过这个问题?

7 个答案:

答案 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的回答中提到了一些,但本文提供了更多细节。特别是:

  • 如果先签署SHA1,则可以进行双重签名并包含SHA1文件摘要,并使用/作为SHA256。它仅适用于Windows 8.1 SDK(或更高版本)中的signtool v6.3。
  • 在XP sp3之前的Windows版本需要使用'完全SHA1签名'进行双重签名,需要2个不同的证书。

(我自己没有测试过这一切。)