突然我的 Inno Setup 编译器停止工作。自从我上次使用它以来,我刚刚安装了仍然颁发给同一家公司的新证书。
我已经以这种方式配置了签名工具(NAME 是证书中主题字符串的开头):
mysigntool="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin\signtool.exe" sign /v /a /s my /n NAME /t http://timestamp.verisign.com/scripts/timestamp.dll
然后在 Inno Setup .iss 文件中我有:
SignTool=mysigntool
SignedUninstaller=yes
如果我删除 /t 和时间戳,该标志总是会失败,退出代码为 0x1。请注意,如果我从命令提示符运行相同的命令,则签名工作正常。
您需要将
$f
添加到 SignTool 的末尾(在 IDE 设置中,而不是脚本中),以便实际传递要签名的文件的名称。这就是为什么您收到“缺少文件名”错误的原因。
请参阅 Inno 帮助文件中的示例。
显然,首先要尝试的是独立运行
signtool.exe
,看看它输出什么错误。
(我知道您已经尝试过)。
如果您无法通过这种方式重现问题,请从命令行运行 Inno Setup 编译器。您将看到
signtool
的输出以及其他编译器的输出。
如果
signtool
失败,当从Inno Setup GUI编译时,它的控制台只是短暂闪烁,所以你没有机会看到它的输出。
或者,您可以将
signtool.exe
包装到批处理文件中,并从 Inno Setup 中调用该批处理而不是 signtool
。在批处理文件末尾,如果签名失败,请调用 pause
。这样你甚至可以在 Inno Setup GUI 中看到错误。
批处理文件可能如下所示:
@echo off
c:\path\signtool.exe %*
set SIGN_RESULT=%ERRORLEVEL%
if %SIGN_RESULT% equ 0 (
echo Signing succeeded
exit /B 0
)
echo Signing failed with %SIGN_RESULT%
pause
exit /B %SIGN_RESULT%
在 Windows 10 SDK 及更高版本中,您需要指定
fd
参数。例如:
signtool.exe sign /debug /fd SHA256 /f "C:\selfcert.pfx" /t http://timestamp.comodoca.com/authenticode /p mypassword1234! myfile.exe
来自 https://learn.microsoft.com/en-us/windows/win32/seccrypto/signtool:
Windows 10 SDK、Windows 10 HLK、Windows 10 WDK 和 Windows 10 ADK 构建 20236 及更高版本需要指定摘要算法。这 SignTool 签名命令需要
文件摘要算法和/fd
签名期间指定的时间戳摘要算法选项 和时间戳。警告(错误代码 0,最初) 如果在签名期间未指定/td
并且 /td 为 时间戳期间未指定。在 SignTool 的更高版本中, 警告将变成错误。推荐并考虑使用 SHA256 业界认为比 SHA1 更安全。/fd