【发布时间】:2014-11-19 17:02:15
【问题描述】:
有许多网站解释了如何在 .pfx 证书文件上运行 signtool.exe,归结为:
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 个构建代理和构建作为非交互式用户帐户运行)?还有什么?
【问题讨论】:
-
您使用的是哪个版本控制?在像 TFS 这样的集中式 VC 中,您甚至可以保护单个文件并将访问权限限制为仅限管理员。
-
Git。不过,这确实给了我一个想法——我也许可以将该文件存储在具有不同安全性的单独存储库中,并让 Teamcity 也对其进行检查。如果我没有得到任何更好的答案,我会用我最终做的任何事情来更新帖子。
标签: continuous-integration teamcity code-signing signtool authenticode