有许多网站解释了如何signtool.exe
在.pfx
证书文件上运行,归结为:
signtool.exe sign /f mycert.pfx /p mypassword /t http://timestamp.server.com \
/d "My description" file1.exe file2.exe
我有一个持续集成 CI 流程设置(使用 TeamCity),它像大多数 CI 流程一样,做所有事情:检查源代码、编译、签署所有 .exe、打包到安装程序中,并签署安装程序 .exe。当前有 3 个构建代理,运行相同的虚拟机,其中任何一个都可以运行此过程。
不安全的实施
今天为了实现这一点,就安全性而言,我做了几件坏事(TM):.pfx 文件在源代码管理中,它的密码在构建脚本中(也在源代码管理中)。这意味着任何有权访问源代码存储库的开发人员都可以获取 pfx 文件并做他们想做的任何邪恶的事情。(我们是一个相对较小的开发商店,相信每个人都可以访问,但显然这仍然不好)。
终极安全实施
关于“正确”执行此操作,我所能找到的只是您:
- 将 pfx 和密码保存在某个安全介质上(例如具有基于手指解锁功能的加密 USB 驱动器),并且可能不会放在一起
- 仅指定几个人有权访问签名文件
- 仅在未连接的专用机器上签署最终版本,该机器保存在锁定的保险库中,直到您需要将其拿出来参加此代码签名仪式。
虽然我可以看到这个安全性的优点..这是一个非常繁重的过程,并且在时间方面很昂贵(运行这个过程,安全地保存证书备份,确保代码签名机处于工作状态等)。
我敢肯定有些人会跳过步骤,只是使用存储在他们个人系统上的证书手动签署文件,但这仍然不是很好。
它也与随后在安装程序中使用的签名文件(也由构建服务器构建)不兼容 - 当您安装了具有 UAC 提示以获取管理员访问权限的 .exe 时,这一点很重要。
中间地带?
我更关心的是不向用户提供可怕的“不受信任的应用程序”UAC 提示,而不是证明它是我的公司。同时,将私钥和密码存储在每个开发人员(加上 QA 和高级技术支持)都可以访问的源代码存储库中显然不是一个好的安全实践。
我希望 CI 服务器在构建过程中仍然像今天一样签名,但没有密码(或证书的私钥部分),每个有权访问源代码存储库的人都可以访问。
有没有办法让密码不被构建或以某种方式保护?我是否应该告诉 signtool 使用证书存储(以及如何使用 3 个构建代理和构建作为非交互式用户帐户运行)?还有什么?