Inno Setup代码签名未覆盖所有文件 如何修复实现全文件签名?
问题原因
Inno Setup默认不会给所有打包文件自动调用签名工具,只有[Files]段条目带signonce或signifexists标志时,才会触发你在SignTool配置栏填写的签名命令。你当前的ISS脚本里,只有主程序EXE的条目加了signonce标志,其余通过通配符*匹配的DLL、OCX等文件没有加签名标志,自然不会被签名。
另外你当前配置的签名命令里存在拼写错误:signtol.exe应为signtool.exe,少写了一个字母l,该错误会直接导致签名调用失败。
解决方案
你可以任选以下一种方案实现全文件签名:
方案1:直接修改ISS脚本(推荐,无需额外工具)
给通配符匹配文件的[Files]条目补上signonce标志即可,Inno Setup会在打包前自动递归遍历匹配到的所有支持格式的文件,调用签名工具完成签名,且signonce会自动跳过已经签过名的文件,不会重复执行。
修改后的[Files]段参考如下:[Setup] SignTool=ASIAMX_signtool [Files] Source: "{#APP_EXE_NAME}"; DestDir: "{app}"; \ Flags: ignoreversion signonce; Permissions: everyone-full ; 给通配符条目追加signonce标志 Source: "*"; DestDir: "{app}"; \ Flags: ignoreversion recursesubdirs createallsubdirs signonce; \ Permissions: everyone-full如果不想给目录下所有文件都签名,可以单独写匹配规则指定要签名的文件类型,示例:
; 单独对所有DLL、OCX文件执行签名 Source: "*.dll"; DestDir: "{app}"; \ Flags: ignoreversion recursesubdirs createallsubdirs signonce; Permissions: everyone-full Source: "*.ocx"; DestDir: "{app}"; \ Flags: ignoreversion recursesubdirs createallsubdirs signonce; Permissions: everyone-full方案2:使用批处理提前批量签名
你找到的批处理方案需要在Inno执行打包编译前运行,先给所有待打包的源文件完成签名,再走打包流程。- 先修正原批处理的语法错误,替换其中的路径、证书密码参数为你自己的配置,保存为
sign_files.bat放到待打包程序的源文件根目录:
@echo off :: 以下参数替换为你本地的实际配置 set SIGNTOOL="c:\{path}\signtool.exe" set CERT="{Certificate path}\DMCC_Microsoft_Key.pfx" set PWD="你的证书密码" set TS="http://timestamp.digicert.com" :: 递归遍历当前目录下所有exe、dll、ocx文件执行签名 FOR /f "tokens=*" %%G IN ('dir /s /b *.dll *.ocx *.exe') DO ( echo Signing: %%G %SIGNTOOL% sign /f %CERT% /tr %TS% /p %PWD% "%%G" ) echo All files signed.- 你可以选择手动双击运行这个批处理,等所有文件签名完成后再编译ISS脚本;也可以在ISS脚本开头加预处理指令,让Inno编译前自动执行批处理,无需手动操作:
; 编译前自动运行签名批处理 #expr Exec("sign_files.bat", "", SourcePath, , SW_HIDE, ewWaitUntilTerminated, ResultCode)- 先修正原批处理的语法错误,替换其中的路径、证书密码参数为你自己的配置,保存为
验证方式
打包生成安装文件后,可先通过资源管理器查看安装包内打包的DLL文件属性,若存在「数字签名」选项卡且显示你的签名证书信息,即为配置成功。
内容的提问来源于stack exchange,提问作者Prageeth Liyanage
相关产品推荐
相关产品推荐

