无法使用WiX对安装程序进行签名

后端开发 2026-07-10

我正在使用Wix Toolset构建安装程序。我制作了4 个MSI文件,以及一个打包这4 个MSI的 bundle。所有这些都能正常工作。我使用Azure Trusted Signing(Artifact Signing)对所有包含的DLL和 EXE文件进行签名,使用dotnet sign工具。这也运行得相当好。

这是我用来签名文件的命令:

sign code artifact-signing --verbosity warning --timestamp-url http://timestamp.acs.microsoft.com --artifact-signing-endpoint https://weu.codesigning.azure.net --artifact-signing-account MY_ACCOUNT --artifact-signing-certificate-profile MY_PROFILE $unsignedFiles 
# $unsignedFile are the files to be signed, deperated by space

安装程序工作正常。然而,一旦我对bundle安装程序进行签名,安装就会失败:在运行安装程序时,它会弹出一个“打开文件”对话框。关闭该对话框后,安装就会终止。安装日志显示:

[1A34:1EA4][2026-03-28T13:04:01]e311: Failed to acquire container: WixAttachedContainer to working path: 
C:\Users\WDAGUtilityAccount\AppData\Local\Temp\...

(我在Windows Sandbox中进行测试,因此使用WDAGUtilAccount。)

经过一番调查,我认为问题可能是由于Wix bootstrappers需要一种“特殊”的签名方式引起。文档指出,应将“引擎”从引导程序中分离,签名引擎,重新附加引擎,最后对引导程序进行签名。(https://docs.firegiant.com/wix/tools/signing/

我这样分离引擎:

$enginePath = "C:\baustatik\installer\bundle-complete\bin\x64\Release\engine.exe"    
wix burn detach $bundlePath -engine $enginePath

接下来,我在 $enginePath对引擎进行签名,方法与对其他文件签名相同。

我从trusted-signing收到以下错误:

fail: Sign.Core.IDataFormatSigner[0]
      Das Signieren ist mit Fehler -2147024703 fehlgeschlagen.

我无法理解这个错误代码的含义,而且似乎没有关于该错误的文档。提高sign tool的 --verbosity也不会提供除该错误之外的更多信息。(我甚至不知道对这个引擎进行签名是否能解决根本问题——安装程序在签名后仍无法工作。)

我也尝试在MSBuild过程中使用 和 "SignBundle" 目标进行签名,但这也产生了同样的错误。

你是否有任何想法,可能是什么原因导致根本问题,以及我如何使用artifact-signing对 Wix引导程序进行签名?

解决方案

原来这两个问题都与签名顺序有关。你绝对需要按以下顺序进行签名:

  • 构建引导程序包(Bootstrapper bundle)
  • (此阶段不要对引导程序进行签名)
  • 移除“引擎”,命令如下:
    wix burn detach PATH_TO_BUNDLE -engine PATH_TO_EXTRACT_ENGINE_TO
  • 对引擎进行签名(无论使用signtool、dotnet sign、本地证书还是受信任签名/artifact signing均可)
  • 将引擎重新加入到bundle中(会创建一个新文件),命令如下:
    wix burn reattach PATH_TO_BUNDLE -engine PATH_TO_SIGNED_ENGINE -o PATH_TO_SIGNED_BUNDLE

(其中PATH_TO_SIGNED_ENGINE == PATH_TO_EXTRACT_ENGINE_TO)。

如果你只对引导程序进行签名而不对引擎签名,工具都不会报错,但引导程序会被损坏,运行它时会弹出“文件打开”对话框。

如果你在分离“引擎”之前对引导程序进行签名,工具都不会报错,但你得到一个损坏的引擎,signtool也好、dotnet sign也好都无法对其签名。(signtool会返回ERR_BAD_EXEIMAGE错误,这也是帮助我找到根本原因的线索。)

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章