27

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

使用 Windows 8 SDK 的签名工具:

例如:

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

4

7 回答 7

19

我知道它有点老了,但我登陆了这个线程,也许其他人也会。

如果您先使用 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,不知道它是否适用于以前的版本。

于 2015-09-17T21:22:10.020 回答
17

我一直在尝试做这件事,并发现以下方法可以解决问题。此方法依赖于使用两个 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"
于 2015-06-05T16:25:34.737 回答
6

这个问题实际上要简单得多。

问题出在时间戳服务器上。

而不是使用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
于 2017-01-14T23:34:33.047 回答
2

尝试使用

signtool.exe sign /as /fd sha256 /tr http://timestamp.geotrust.com /td sha256 /f certificate.pfx /p XXXXXX file.dll

/tr 用于 RFC3161 时间戳, /td 显然用于使用哈希。

于 2013-09-27T21:29:43.943 回答
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"
于 2015-08-31T16:01:36.550 回答
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

于 2015-04-24T07:35:29.643 回答
0

我认为这个链接有一些很好的指示。martin_costello 的回答中提到了其中一些,但本文提供了更多详细信息。尤其是:

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

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

于 2016-04-20T10:11:09.810 回答