在Inno Setup中,我的签名工具定义为:
cmd /k "C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64\signtool.exe" sign /t http://timestamp.comodoca.com /n "My Company" $f
前置
cmd /k
(如 Inno Setup - 签名失败并显示“签名工具失败,退出代码 0x1” 中建议的那样)表明签名工具本身实际上没有问题,而是 Inno Setup 调用它的方式有问题,生成以下消息:
'C:\Program' is not recognized as an internal or external command, operable program or batch file.
显然,它在第一个空格处切断了通往
signtool
的路径,即使我将其放在引号中。我什至尝试用 $q
替换引号,看看这是否有什么不同。 (事实并非如此。)我认为解析器不尊重引号是不正确的行为,因为说明明确指出要粘贴您在命令行上使用的确切文本,并且示例本身包含引号( https://revolution.screenstepslive.com/s/revolution/m/10695/l/563371-signing-installers-you-create-with-inno-setup)。
命令行中的一切都运行良好。由于某种原因,Inno Setup 无法正确调用
signtool
。
添加于 2020-07-14:
Inno Setup 的示例,从其网站复制:
"C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Bin\signtool.exe" sign /f "C:\MY_CODE_SIGNING.PFX" /t http://timestamp.comodoca.com/authenticode /p MY_PASSWORD $f
我的版本,没有使用
cmd /k
:
"C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64\signtool.exe" sign /t http://timestamp.comodoca.com /n "My Company" $f
如您所见,我们以相同的方式使用引号。我会检查更新 - 我可能应该先这样做。当我有时间时,我将恢复signtool定义并看看更新是否可以修复它。
另外,我应该说得更清楚。我是 Inno Setup 的新手,我没有想到要澄清这一点。我正在通过
Inno Script Studio
进行编译。我觉得这有可能与 Script Studio 的特定版本中的行为有关,而不是编译器本身,但我对内部工作原理了解不够,只能推测。
我用:
#define SignedDesc "$q" + MSA + "$q"
#define SignedPfx "$qd:\My Certificate\2018\My Certificate.pfx$q"
#define SignedTimeStamp "$qhttp://timestamp.verisign.com/scripts/timestamp.dll$q"
#define SignedPw "$q~~~~~~~$q"
SignTool=SignTool /d {#SignedDesc} /du $q{#AppURL}$q /f {#SignedPfx} /p {#SignedPw} /t {#SignedTimeStamp} /v $f
我的签名工具配置为:
$qC:\Program Files (x86)\Windows Kits\10\bin\10.0.16299.0\x86\Signtool.exe$q sign $p
您必须使用
$q
,这是一个引号。如果你看这里:
它说:
签名工具参数中可以使用以下特殊序列 和命令:
,替换为要签名的文件的带引号的文件名。 (必填)$f
,替换为签名工具参数。$p
,替换为引号,对于定义签名工具很有用 包含来自命令行的引号。$q
,替换为单个 $ 字符。$$
做了一些更多的修补后,我现在相当确定这一定是 Inno Setup 的错误。我实施了一个解决方法,如下所示:
cd \bin
signtool.exe
所在目录的“无空间”符号链接:mklink /d "Windows10SDK" "C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64"
C:\bin\Windows10SDK\signtool.exe sign /t http://timestamp.comodoca.com /n "My Company" $f
就是这样!由于
signtool.exe
的路径中不再有空格字符,Inno Setup 现在可以正确执行签名,一切都运行良好。
我会将其报告为错误并根据需要进行更新。