signtool 无法使用时间戳对 SHA2 和 SHA1 进行双重签名

Posted

技术标签:

【中文标题】signtool 无法使用时间戳对 SHA2 和 SHA1 进行双重签名【英文标题】:signtool failing to dual sign SHA2 and SHA1 with timestamps 【发布时间】:2013-08-30 22:09:09 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

如果你先用 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 Windows 8.1 SDK 和 MIS 对我有用。 MSI 在 Windows 2008 上显示受信任。 This 说“请注意,您确实需要 6.3 版本的 Signtool 才能执行此操作。它带有 Windows 8.1 SDK”。【参考方案2】:

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

请注意,SHA-1 指纹是使用/sha1 开关为每个签名步骤明确指定的,/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"

【讨论】:

这是否意味着需要购买两个不同的证书?还是复制和重命名就足够了? 是的,不幸的是(除非有人知道得更好)。我无法获得用于生成 SHA-1 签名以在 Windows Server 2008 上被接受为有效的 SHA-256 证书。 您是否有机会使用指纹的格式 进行更新?简单地从 certmgr.msc 复制字符串是行不通的。 我会更新对此的评论。从记忆中,它都是大写的,没有空格。【参考方案3】:

问题实际上要简单得多。

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

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

【讨论】:

【参考方案4】:

尝试使用

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

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

【讨论】:

【参考方案5】:

添加到 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"

【讨论】:

【参考方案6】:

我也收到上述错误,但是在使用“-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。

【讨论】:

【参考方案7】:

我认为this link 有一些不错的建议。 martin_costello 的回答中提到了其中一些,但本文提供了更多详细信息。特别是:

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

(虽然我自己没有测试过所有这些。)

【讨论】:

以上是关于signtool 无法使用时间戳对 SHA2 和 SHA1 进行双重签名的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2017 使用哪个版本的 SignTool?

ClickOnce 发布 Signtool 错误

使用 MSBuild 从 Visual Studio 2013 命令行发布 Clickonce 找不到 SignTool.exe

Signtool.exe /dg /ds /di 选项和时间戳

我该如何扭转这个? - “签名时出错:找不到 SignTool.exe”

Visual Studio 签名失败(signtool.exe 错误)