3

我试图找出在我的一个项目中对二进制文件进行 Authenticode 签名的最简单和最安全的方法。

我能看到的最简单的方法是获取编译的结果——一个包含我所有二进制文件的完整安装包——从中提取程序集,对其进行签名,然后将这些签名的程序集重新打包到 MSI 中,然后再进行签名。

那里有很多关于从 MSI 解压文件的信息,但没有关于重新打包它们的信息。我该怎么做?

4

2 回答 2

2

编辑我的原始回复....

如果您想将签名嵌入到无人参与的构建过程中,您可以只使用 MSBuild SignFile 任务,它包装了身份验证签名 API http://msdn.microsoft.com/en-us/library/ms164304.aspx

或者,只需调用 SignTool.exe。

您需要使用 certmgr.exe 或证书 mmc 管理单元将软件发布证书安装到计算机上。将其安装到本地证书存储后,您只需使用 SHA 指纹来引用它,您可以在证书属性中找到它,或者只需在 certmgr.exe 中列出证书即可。

我们必须定期更新我们的证书,因此我们在构建中有额外的步骤来在构建开始时在本地重新导入证书,并拉入证书哈希。我建议不要将哈希存储在源代码管理中,以防您必须返回并构建旧版本 - 它应该是您的环境配置的一部分,例如 env var 或其他可以与源代码分离的东西。

另外,不要忘记给签名的文件加上时间戳,这样可以保证签名的有效性。我还建议您将签名与时间戳分离。时间戳是一种偶尔会出错的网络操作,因此能够区分签名失败和时间戳失败是很有用的,因为时间戳失败只是可能公开发布的黄金构建的问题。

于 2011-04-11T23:13:40.447 回答
1

您没有说明您的构建系统是什么,但我的项目经历的(过度简化的)流程如下(我使用 nant 任务完成几乎所有事情,从 CruiseControl.net 触发)

  1. 从源代码控制中获取所有内容
  2. 构建干净的项目
  3. 抓取未签名的文件
  4. 使用signtool.exe签名所有相关文件(例如 exe、dll、ocx)
  5. 构建 MSI(使用 WiX)
  6. 在 MSI 上执行一些自定义的构建后任务
  7. 对 MSI 进行数字签名
  8. (取决于构建参数)使用引导程序压缩 MSI
  9. 签署引导程序
  10. 上传到暂存区
  11. 向已准备好进行测试的开发人员和质量保证团队发送电子邮件。

如果它在任何地方都失败了,那么只需给开发团队发电子邮件。

您应该能够使用 MSBuild、Nant 或各种其他工具来执行此操作。它可能会涉及一些地方的自定义工作,但最终结果是一个可靠的构建系统,它需要与构建人工交互(除非有人想要“强制”构建,即使这只是点击网页上的一个按钮或者其他的东西)

于 2011-04-12T07:19:59.530 回答