我想要自动执行一些 ClickOnce 部署工件(应用程序 exe 和清单)的代码签名。我在用signtool http://msdn.microsoft.com/en-us/library/windows/desktop/aa387764%28v=vs.85%29.aspx来实现这一目标。为了使私钥可用于签名并保护包含私钥的证书文件(.pfx 文件),我的计划是使用不可导出的密钥将证书安装到本地计算机证书存储中。 (我知道有一些方法可以导出密钥,即使它被标记为不可导出。)该机器是一个持续集成服务器,可供少数人访问。我希望以这样的方式设置它,每当需要使用私钥时,都需要输入私钥密码。然后我会设置一个自动化工作(使用Jenkins http://jenkins-ci.org/)这需要一个构建参数来收集私钥密码。这掩码密码插件 https://wiki.jenkins-ci.org/display/JENKINS/Mask+Passwords+Plugin将用于在输入时和在控制台输出中屏蔽密码。
然而,我遇到了一些障碍。首先,尽管有“启用强私钥保护。如果启用此选项,每次应用程序使用私钥时都会提示您”。导入证书时,它似乎仅在将其导入当前用户存储而不是本地计算机存储时可用。其次,即使此选项可用,signtool 工具也不提供在使用商店中的证书进行签名时设置密码的选项。密码参数“/p”仅在使用 pfx 文件作为私钥源(“/f”选项)时适用。鉴于此,这似乎不是一个可行的选择。注意:即使“启用强大的私钥保护”。可用于机器商店中的证书,我的测试表明,尝试使用启用此选项的证书只会弹出一个对话框,询问使用它的权限,这显然不适用于自动化作业。我原本以为“提示”意味着它会要求输入密码。
我考虑过的另一种选择是创建 ACL 来保护证书存储中的私钥。这可以通过右键单击证书并选择“所有任务...”来完成。管理私钥...对话框。这将限制私钥的使用仅限于授权的人。 (注意:当没有私钥权限的用户尝试使用它进行签名时,他们会收到消息“SignTool 错误:未找到满足所有给定条件的证书。”)但是,我不想授予访问权限Jenkins 构建服务使用的凭据,因为这样任何构建作业都能够对代码进行签名。我可以创建一个作业来执行脚本以以特定用户身份运行签名命令。这需要将域用户名和密码作为构建参数。我可以使用 Jenkins 掩码密码插件来做到这一点。不过,我不太喜欢这一点,因为我不舒服,因为掩码密码足以防止暴露域凭据,如果域凭据被泄露,将提供比私钥更多的访问权限。
如果我放弃将证书存储在计算机存储中的最初想法,可以选择将证书 pfx 文件放置在构建计算机上的 ACL 安全文件夹中,只有构建过程和签名用户有权访问该文件夹。这样做将允许我创建一个构建作业来使用包含的私钥,同时不会将该文件暴露给有权访问该计算机的其他人。要使用私钥,构建参数需要收集私钥密码。
最后,可以选择使用智能卡来存储证书,但我们决定不这样做。
所以,我的问题是,是否有其他方法可以做到这一点:1)保护私钥不被复制,2)防止私钥被未经授权的用户用来签名代码,3),假设私钥密码是由授权用户提供,生成用于构建服务签名的私钥?
首先我尝试分别回答一下大家的问题:
-
保护私钥不被复制:
只有加密硬件(智能卡或 hsm)才能真正保护密钥不被复制。 Windows 证书存储(即使使用您正确注明的不可导出选项)或 PKCS#12 (PFX) 文件仅提供错误的保护感觉。
-
防止未经授权的用户使用私钥对代码进行签名:
IMO 这需要用户交互,例如输入密码或 PIN。如果您将密码作为参数传递,其他进程总是有可能从进程信息、日志等中获取它。
-
鉴于私钥密码是由授权用户提供的,使私钥由构建服务签名:
通过 CSP(Windows 证书存储)通过交互式输入 PIN 访问的加密硬件(智能卡或 hsm)应该可以与 Signtool 配合使用,不会出现任何问题。
我同意用户交互的要求对于自动构建服务来说可能并不完全方便,但是您可能必须在具有用户交互的安全解决方案和没有用户交互的不太安全的解决方案之间进行选择.
方便但不太安全的解决方案没有。 1:在我看来,你已经找到了一个可以接受的解决方案,因为你没有提供它的任何缺点。
如果我放弃将证书存储在计算机存储中的最初想法,可以选择将证书 pfx 文件放置在构建计算机上的 ACL 安全文件夹中,只有构建过程和签名用户有权访问该文件夹。这样做将允许我创建一个构建作业来使用包含的私钥,同时不会将该文件暴露给有权访问该计算机的其他人。要使用私钥,构建参数需要收集私钥密码。
但请注意,PFX 文件不仅可以从实时系统复制,而且还可以从备份复制,且无法被检测到。
方便但不太安全的解决方案没有。 2:将私钥存储在不需要输入 PIN 的智能卡上,并且仅允许受信任的用户访问系统。这将确保您的私钥无法被复制,同时 Signtool 仍可以轻松访问它。但是,它可能需要您拥有两台独立的构建服务器 - 一台没有所有用户都可以访问的智能卡,另一台则只有受信任的用户可以访问智能卡。
不方便的安全解决方案:将私钥存储在智能卡上,需要输入 PIN 并在构建过程中需要用户交互(输入 PIN)。
您还可以考虑在自动模式下使用自签名协同签名证书签署开发版本,并在手动模式下使用受信任的协同签名证书签署公共发布版本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)