旧证书过期时在 WiX 补丁中提供新证书

Supplying a new certificate in WiX patch when old one expires

背景

我正在研究确定 WiX 是否是 InstallShield 的可行替代品。所以我一直在测试我们的工作遇到的每一个场景,以确保 WiX 可以处理它们。但是,我对一个问题感到困惑。当证书即将过期时,我们需要创建一个包含新证书的补丁,并在旧证书过期前对其进行签名,以便在没有管理员提升提示的情况下进行无缝修补。

问题

互联网上没有太多关于如何准确执行此操作的文档。我试过添加

<DigitalCertificate Id="MyNewCertificate" SourceFile="{PATH_TO_NEW_CERTIFICATE}"/>

到wxs文件中的PatchCertificates元素生成MSI文件,然后使用旧的和新的MSI文件生成一个MSP文件。当我用 7zip 打开 MSP 文件时,我可以看到新证书嵌入其中。当我在一个锁定的帐户上测试它时,应用此补丁时没有提升提示,但下一个由新证书签名的补丁显示了提升提示。

我试过的

我尝试按照 https://wyrdfish.wordpress.com/2012/07/20/writing-a-parallel-update/ 中的步骤创建 "parallel" 更新,但进行了修改以使其与 PatchCreation 一起使用,而不是与 Patch 一起使用。我匹配了所有的属性变化,但它仍然显示提升提示。

Wyrdfish 在 http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/Require-admin-rights-to-msp-td7586837.html 中评论说 "It's fun when the certificate expires though as you need to use a hotfix to deliver the new certificate which is signed by the old certificate before it expires so you can then sign by the new certificate in future patches. ",但没有提供详细说明。该线程已有两年历史,所以我非常怀疑我会在那里得到回应。

我也尝试在 signtool.exe 中使用新证书提供 /ac 参数,但出现交叉签名错误。

我到底做错了什么?在新的 MSI 文件中,没有其他更改,只有新的 DigitalCertificate 元素反映在 MSP 中。我是否需要包含某种文件更改或其他内容?还是签名过程有问题?

发现我的补丁有问题。对于遇到类似问题的任何人,您需要在 PatchCreation 的 PatchSequence 元素中指定 ProductCode,它与用于构建 MSI 的产品 ID 的 GUID 相同。我没有这个参考,这显然导致了问题。现在它不会为管理员提升。将其与相关 link 中指示的步骤相结合,您就可以进行 LUA 修补。