我已经使用 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)上签署应用包。
如果你想读完整篇文章请看这里:
答案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 中的根本不支持多重签名)
- 使用 SHA1 签名:
signtool sign /v /f my.pfx /p 1234 test.exe
- 使用 SHA256 签名:
signtool sign /v /f my.pfx /p 1234 /as /fd sha256 test.exe