Signtool 无法在 Windows 7 上进行 SHA256 签名

Signtool 无法在 Windows 7 上进行 SHA256 签名

我已经使用 SHA1 签名很多年了,但是从 2016 年开始,Windows 强制开发人员使用 SHA256。

Windows 强制实施 Authenticode 代码签名和时间戳

使用 Windows 7 SDK signtool 签署 SHA-256 的功能是“未知命令”,因此此 signtool 作为 signtool 已经过时,不应再使用。

为了使用 SHA256 进行签名,我下载了 Windows 8.1 SDK 以获取 signtool.exe,它具有新功能(/fd 和其他功能)。BAT 文件和 signtool 可以在 Windows 8 和 10 上运行,所以我知道它可以运行,但在 Windows 7 上尝试为文件添加时间戳时会崩溃。

签名失败

我使用一个 bat 文件来签署文件,它看起来像这样(我编辑了 BAT 文件,因此它不显示变量、完整路径、公司名称和密码):

Path\signtool.exe sign /f "Path\Certificate.p12" /fd sha256 /p *password* /du "URL" /tr "timestampServer?td=sha256" /td sha256 /d "Product name" "Filename"

我想,我没有合适的 SDK 来支持某些功能,但我在互联网上找不到有关如何在 Windows 7 上进行设置的任何信息。我​​尝试安装 MS Visual C++ 2015 Redistributable (x64),但仍然无法解决问题。

答案1

我终于找到了在 Windows 7 中双重签名文件的解决方案。

诀窍是使用Windows 8 SDK不是8.1 或 10)!我使用了这个下载: https://developer.microsoft.com/windows/downloads/windows-8-sdk

在 Windows 7 x64 中,确保指向 x64 二进制文件(...\8.0\bin\x64\signtool.exe

作为奖励,这是我制作的一个方便的批处理脚本。只需将其保存为 doublesign.bat 并将要签名的文件拖到该 bat 文件上即可。

@ECHO OFF

set signtool="C:\path to signtool\signtool.exe"
set certfile="C:\path to certificate\cert.p12"
set certpass="Password"
set company="Optional"

echo Signing with SHA-1
%signtool% sign /f %certfile% /p %certpass% /t http://timestamp.comodoca.com/authenticode %1
timeout /T 3
echo. & echo Signing with SHA-256
%signtool% sign /f %certfile% /p %certpass% /as /fd sha256 /tr http://timestamp.comodoca.com/rfc3161 /td sha256 %1

@PAUSE

答案2

这个问题其实要简单得多。

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

而不是使用签名工具有了这个

/t http://timestamp.comodoca.com 

您需要像这样使用 SHA1

/tr http://timestamp.comodoca.com /td sha1

对于 SHA256

/tr http://timestamp.comodoca.com/?td=sha256 /td sha256

答案3

看来我不擅长阅读,而且我正在回答我自己的问题,因为其他人可能很难找到,就像我一样。

Windows 不再支持 Windows 7 上的 signtool.exe,这就是为什么 SHA-1 签名等旧/过时的功能仍然有效,但 SHA-256 时间戳却是一个问题的原因。我在 MSDN 上找到了这个:

引用 MSDN 的话:注意您只能使用 SignTool 在 Windows 8 及更高版本或 Windows Server 2012 及更高版本上签署 Windows 应用商店应用包。您不能使用 SignTool 在低级操作系统(例如 Windows 7 或 Windows Server 2008 R2)上签署应用包。

如果你想读完整篇文章请看这里:

如何使用 SignTool 为应用包签名

答案4

引用我在这里的回答:https://stackoverflow.com/questions/35249059/signtool-dual-signing-failure/71632583#71632583
如果有人碰巧遇到同样的问题,那么解决方案就真的很愚蠢。

我遇到了同样的问题,并且 SDK 8.1(6.3.9600.17298)中的 signtool 似乎对命令行选项的顺序非常讲究!

如果我用signtool sign /v /f my.pfx /p 1234 /fd sha256 /as test.exe

双重签名失败,错误如下: "Multiple signature support is not implemented for this filetype" 该错误实际上与 W10 SDK 中的错误相同,因为-2147024846/0x80070032转换为 (HRESULT)ERROR_NOT_SUPPORTED

但是,如果我使用signtool sign /v /f my.pfx /p 1234 /as /fd sha256 test.exe它,它就有效!

看看我做了什么?我只是交换了 /as 和 /fd sha256 的顺序!

我的意思是,当你正在处理重要的事情时,这些东西简直就是噩梦,而到了生产的时候,它似乎毫无理由地不起作用。幸运的是,这次情况并非如此,因为我只是在测试,但我想我疯了,因为我第一次让它工作了一次,但第二次就不行了。

要清楚的是,这是我使用 Windows 8.1 SDK 中的 signtool.exe 使用 SHA1 和 SHA256 对文件进行双重签名的确切顺序,这里(W10 SDK 中的仍然不起作用,V7.1 SDK 中的根本不支持多重签名)

  1. 使用 SHA1 签名:signtool sign /v /f my.pfx /p 1234 test.exe
  2. 使用 SHA256 签名:signtool sign /v /f my.pfx /p 1234 /as /fd sha256 test.exe

相关内容