[每天解决一问题系列 - 0005] WiX Burn 如何校验chained package的合法性

问题描述:

项目中使用Wix burn打包,内部包含了多个MSI。有时候会遇到如下错误

Error 0x80091007: Failed to verify hash of payload: SetupProject1.msi 。

问题解析:

首先需要了解Wix Brun校验其payload的原理,主要有如下两种情况:

1)如果MSI有数字签名,则根据MSI的数字签名进行校验,也就是说如果数字签名没有变,Burn不会校验MSI的内容是否变化

2)如果MSI无数字签名,则获取该MSI的SHA1 hash,在安装的时候校验hash。这种情况下,如果MSI的内容发生变化,则无法使用该burn进行安装,必须重新编译。

WIX Brun 源代码 (burn\engine\cache.cpp)

static HRESULT VerifyThenTransferPayload(
    __in BURN_PAYLOAD* pPayload,
    __in_z LPCWSTR wzCachedPath,
    __in_z LPCWSTR wzUnverifiedPayloadPath,
    __in BOOL fMove
    )
{
。。。
 // If the payload has a certificate root public key identifier provided, verify the certificate.
    if (pPayload->pbCertificateRootPublicKeyIdentifier)
    {
        hr = CacheVerifyPayloadSignature(pPayload, wzUnverifiedPayloadPath, hFile);
        ExitOnFailure1(hr, "Failed to verify payload signature: %ls", wzCachedPath);
    }
    else if (pPayload->pCatalog) // If catalog files are specified, attempt to verify the file with a catalog file
    {
        hr = VerifyPayloadWithCatalog(pPayload, wzUnverifiedPayloadPath, hFile);
        ExitOnFailure1(hr, "Failed to verify payload signature: %ls", wzCachedPath);
    }
    else if (pPayload->pbHash) // the payload should have a hash we can use to verify it.
    {
        hr = VerifyHash(pPayload->pbHash, pPayload->cbHash, wzUnverifiedPayloadPath, hFile);
        ExitOnFailure1(hr, "Failed to verify payload hash: %ls", wzCachedPath);
    }
。。。
}

解决方法:

了解了问题的原理,方法就显而易见了。

时间: 2024-10-15 05:17:42

[每天解决一问题系列 - 0005] WiX Burn 如何校验chained package的合法性的相关文章

[每天解决一问题系列 - 0013] 如何修改WiX Burn内置的窗口

问题描述: 我们产品的burn安装包仅支持.net 3.5 sp1以上,在只有.net 2.0的机器上会给用户弹一个窗口,告诉用户为什么不能够安装的原因.本来burn已经内置了,但是在日文操作系统下,由于内置字体和窗口大小的原因,导致字出现重叠. 如何调整内置的窗口内容及布局呢? 解决方案: 直接上代码. <BootstrapperApplicationRef Id="ManagedBootstrapperApplicationHost"> <bal:WixManag

[每天解决一问题系列 - 0012] 如何通过程序获取IIS站点信息

问题描述: 在WiX中需要判断某个站点是否存在,WiX没有这个能力,该怎么做呢? 解决方案: 解决方法就是写一个Custom Action来检测,实现的途径也有很多,现在想到了这么几个 1)PowerShell 需要考虑操作系统的兼容性,只有Vista以上的操作系统才支持 2)WMI 3).net 提供的库以及IIS自己的库, 注意需要区分版本 IIS 6 的代码(需引用System.DirectoryServices.dll) DirectoryEntry Services = new Dir

[每天解决一问题系列 - 0003] 如何创建并应用自签名的证书

现象: 现在有一个发布在IIS上的网站,使用的https协议,CA的证书太贵,所以买不起.但是访问网站的时候来时老谈个warning又太烦,怎么办? 解决方法: 创建一个根证书 makecert -r -pe -n "CN=My Root" -ss CA -sr CurrentUser -a sha1 -sky signature -cy authority -sv CA.pvk CA.cer 创建Server证书  makecert -pe -n "CN=*.mysite.

[每天解决一问题系列 - 0008] 关于.net framework 路径最大长度的问题

问题描述: 有时候,在copy文件的时候,会提示目录长度太大,无法copy 解决方法: 可以使用Long Path Tool 解决问题 相关解释: http://blogs.msdn.com/b/bclteam/archive/2008/07/07/long-paths-in-net-part-3-of-3-redux-kim-hamilton.aspx

[每天解决一问题系列 - 0006] MSBuild 和Visual Studio并行编译

问题描述: 有的项目会有上百个.net工程,编译时间会很长,如何缩短编译的时间呢? 解决方法: 如果使用MSbuild, 指定/maxcpucount 或者/m,如果不指定值,则取当前机器逻辑CPU的个数. 如果使用Visual Studio, 通过菜单  “Tools->Options” 打开Options对话框, 点击 “Projects and Solutions - > Build and Run”, 设置 “ maximum number of parallel project bu

[每天解决一问题系列 - 0004] Excel 公式中拼接字符串

问题描述: 之前很少用excel的formula,今天用户发过来一个文件,里边存储了很多字段对应的编号.想把这些生成我想要的格式,然后导入代码中,当然可以使用第三方的excel操作库来做.最简单直接的方法自然是用excel强大的formula功能了. 解决方法: 假如A1的值为aaa,B1的值为bbb,我想要的结果是(“aaa","bbb"); 其实很简单,只需要用&来拼接字符串即可,比如 = A1&B1.要得到我想要的结果,只需这么做就可以 = "

[每天解决一问题系列 - 0001] Javascript apply和 call对比

相同点: 每个函数都包含这两个原生的方法 他们两个的效果是一样的,用于在特定的作用域下执行函数,本质上是设置函数内this对象的值. 不同点: 传入的参数类型不同 . apply(函数作用域,array[参数]), call(函数作用域,参数1, 参数2, 参数3...). 注意:函数作用域 参数不传或者null,默认为window:在严格模式下则为undefined, 即无效的作用域. 应用场景: 这两个函数最大的作用在于扩充函数赖以运行的作用域,其好处在于对象不需要与方法有任何的耦合关系,用

[每天解决一问题系列 - 0010] ADB Not Responding - Android Studio

问题描述: 最近安装了Android Studio v1.0,运行的时候老是这个错误 解决方案: 网上有人说是已经有adb的进程在运行,可是打开任务管理器,找不到对应的adb 进程. 无奈之下,想到adb运行的默认端口是5037, 因此通过命令行 netstat -aon |findstr "5037" 找到了PID,通过PID看到原来是百度自己包装了一个adb(百度手机助手),果断杀掉这个进程,运行android studio,一切恢复正常.

vue webpack 脚手架项目详细解析系列(二,项目依赖说明 package.json)

继续上一篇, 上一篇讲了 vue 的webpack脚手架的项目结构.那接下来我们看一下他的package.json 文件,看一下.他都用到了那些依赖. "dependencies": { "vue": "^2.5.2", "vue-router": "^3.0.1" }, "devDependencies": { "autoprefixer": "^7.1.