让我解释一下我的困境。我有我的主要软件,可以选择安装较小的软件模块,让用户保存其MSI安装程序,然后在远程计算机上运行它。
MSI安装程序最初是由我的代码签名证书进行数字签名的。
我遇到的问题是如何在MSI中传递一些可以从主应用程序动态生成的最小数据?像注册名称和用户通过UI选择的一些最小软件相关参数一样。
首先,我想从应用程序动态修改MSI内容,但这会破坏数字签名。 (我显然无法重新签名,因为我不愿意在该应用中公开我的私钥以获取数字证书。)
所以在这一点上,我很好奇,如果MSI文件的任何部分没有受到数字签名的影响?我知道文件名不会受到影响,但这不会给我提供更多空间来添加我的数据。
答案 0 :(得分:1)
我确信您无法绕过已签名的文件,因为这将是一个巨大的安全问题。您使用什么工具来构建MSI?这也会影响到这一点。
如果这是您可以在安装时执行的操作,则有几个选项应该有效,但是不清楚数据究竟是什么以及您在MSI文件中的位置。
自定义操作可以在安装时收集数据并填充现有表(例如Registry),结果是内存中的MSI数据库在安装产品时进行所需的更改。
< / LI>通常,您要创建转换文件(.mst文件)并使用TRANSFORMS = [mst文件]安装MSI,但mst文件可能需要签名才能安装了签名的MSI,但我不确定。这是一个简单的测试 - 使用Orca生成一个mst文件,该属性更改Property表中的某些内容然后使用TRANSFORMS = .....安装MSI并查看它是否禁止无符号转换。
答案 1 :(得分:0)
在不破坏数字签名的情况下,您无法修改MSI内的单个字节,因为这正是签名的目的 - 确保不修改内容。请注意,它并非特定于MSI,而是实际上对任何已签名的文件。
作为一个想法,如果您不想“给”客户私钥,您可以考虑在服务器上生成MSI(并在服务器上保留密钥私钥)吗?