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

我们需要使用signtool.exe对SHA1和SHA2进行双重签名,我们的证书支持256位SHA2。

使用Windows 8 SDK的signtool:

例如:

signtool.exe sign / 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机器上试过了,并试图使用命令行选项,但无济于事。 有没有人在这个问题上打过?

Solutions Collecting From Web of "signtool无法对具有时间戳的SHA2和SHA1进行双重签名"

我一直在努力做到这一点,并发现下面的伎俩。 此方法依赖于使用两个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安装程序不。

更新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" 

更新30/12/2015

要使用SHA-256证书签署MSI文件,但使用SHA-1哈希,请使用类似于以下的命令:

 signtool.exe sign /sha1 SHA256_Thumprint /v /d "FileDescription" /du "CompanyURL" /t http://timestamp.comodoca.com/authenticode "FileName.msi" 

我知道这有点老,但是我登陆这个线程,也许别人也会。

如果先用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,不知道它是否能与之前的版本兼容。

这个问题实际上比较简单。

问题是与时间戳服务器。

而不是使用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" 

我也得到了上面的错误,但是它使用osslsigncode实用程序时使用“-nest”选项:

 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分叉 。

我认为这个链接有一些不错的指针。 其中一些在martin_costello的答案中提到,但这篇文章提供了一些更多的细节。 尤其是:

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

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