首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动代码签名-保护私钥

自动代码签名-保护私钥
EN

Stack Overflow用户
提问于 2014-03-16 00:31:58
回答 3查看 4.5K关注 0票数 12

我想自动化一些ClickOnce部署构件的代码签名-应用程序的exe和清单。我正在使用signtool来完成这个任务。为了使私钥可以用于签名并保护包含私钥(.pfx文件)的证书文件,我的计划是使用不可导出的密钥将证书安装到本地机器证书存储区。(我知道,即使密钥标记为不可出口,也有出口密钥的方法。)这台机器是一个连续的集成服务器,可供少数人访问。我希望能以这样的方式设置它:在任何需要使用私钥的时候,它都需要输入私钥密码。然后,我将设置一个自动作业(使用Jenkins),它将需要一个收集私钥密码的构建参数。在输入和控制台输出时,将使用Mask Passwords plugin来隐藏密码。

然而,我遇到了几个路障。首先,即使存在“启用强私钥保护。如果启用此选项,每次应用程序使用私钥时,都会提示您”。导入证书时,只在将证书导入到当前用户存储区时才可用,而不是本地计算机存储。其次,即使该选项可用,签名工具工具也不提供在使用存储中的证书进行签名时设置密码的选项。密码参数'/p‘仅在使用pfx文件作为私钥源('/f’选项)时才适用。有鉴于此,这似乎不是一个可行的选择。注意:即使“启用强私钥保护”。可以用于计算机存储中的证书,我的测试表明,尝试使用带有此选项的证书时,只会弹出一个请求允许使用它的对话框,这显然不适用于自动化作业。我原本以为“提示”意味着它会问密码。

我考虑过的另一个选项是创建ACL来保护证书存储区中的私钥。这可以通过右键单击证书并选择所有任务来完成。管理私人钥匙..。对话。这将限制私钥的使用仅限于那些授权的。(注意:当没有私钥权限的用户尝试使用它进行签名时,他们会收到消息"SignTool错误:没有发现符合所有给定条件的证书“)。但是,我不希望访问Jenkins构建服务所使用的凭据,因为这样任何构建作业都可以对代码进行签名。我可以创建一个作业来执行脚本,以特定用户的身份运行签名命令。这将需要将域用户名和密码作为构建参数。我可以使用Jenkins密码插件来完成这个任务。不过,我不太喜欢这一点,因为Mask密码对暴露域凭据是足够的保护,如果受到破坏,访问权限将不仅仅是私钥。

如果我放弃了将证书存储在机器存储中的最初想法,则可以选择将证书pfx文件放置在生成机器上的ACL安全文件夹中,只有生成进程和签名用户才有权限。这样做将允许我创建一个构建作业来使用包含的私钥,同时不向其他访问该机器的人公开该文件。要使用私钥,构建参数需要收集私钥密码。

最后,可以选择使用智能卡来存储证书,但我们决定不这样做。

因此,我的问题是,是否有其他方法可以做到这一点: 1)保护私钥不被复制;2)防止私钥被未经授权的用户使用来签署代码;3)如果私钥密码是由授权用户提供的,则使私钥通过构建服务进行签名?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-16 20:29:03

首先,我将试着分别回答你们的问题:

  1. 保护私钥不被复制: 只有加密硬件(智能卡或hsm)才能真正保护密钥不被复制。Windows证书存储区(即使有不可出口选项,正如您正确指出的那样)或PKCS#12 (PFX)文件只提供错误的保护感。
  2. 防止私钥被未经授权的用户使用来签名代码: IMO这需要用户交互,例如输入密码或PIN。如果您将密码作为参数传递,则其他进程总是有可能获得密码,如进程信息、日志等。
  3. 如果私钥密码是由授权用户提供的,则通过构建服务使私钥用于签名: 通过具有交互输入的PIN的CSP (windows证书存储)访问的密码硬件(智能卡或hsm)应该与签名工具一起工作,没有任何问题。

我同意,对于自动构建服务来说,用户交互的需求可能不太方便,但是您可能不得不在有用户交互的安全解决方案和没有用户交互的不太安全的解决方案之间进行选择。

方便但不太安全的解决方案1号:在我看来,您已经找到了一个可接受的解决方案,因为您没有提供它的任何缺点。

如果我放弃了将证书存储在机器存储中的最初想法,则可以选择将证书pfx文件放置在生成机器上的ACL安全文件夹中,只有生成进程和签名用户才有权限。这样做将允许我创建一个构建作业来使用包含的私钥,同时不向其他访问该机器的人公开该文件。要使用私钥,构建参数需要收集私钥密码。

但是,请注意,PFX文件不仅可以从活动系统复制,而且可以从备份复制。

方便但不太安全的解决方案2号:将私钥存储在不需要输入PIN的智能卡上,只允许系统访问受信任的用户。这将确保您的私钥不能被复制,而签名工具仍然可以很容易地访问它。然而,这可能需要您有两个单独的构建服务器-一个没有智能卡可访问所有用户和一个与智能卡只能访问受信任的用户。

不方便安全解决方案:将私钥存储在智能卡上,该智能卡要求输入PIN并在构建过程中要求用户交互(输入PIN)。

您还可以考虑在自动模式下使用自签名协同设计证书对开发生成进行签名,并在手动模式下使用可信的协同设计证书对公共发布版本进行签名。

票数 5
EN

Stack Overflow用户

发布于 2014-03-16 17:46:27

我看到的唯一选择是使用HSM。

您可以生成由运算符卡/卡集保护的私钥(例如,Thales有这类HSM)。运算符卡集可以使用法定量设置,该仲裁指定在私钥可供请求使用此私钥的应用程序使用之前,必须插入多少运算符卡。Thales也有一个CSP支持这个特性。

问题可能是CSP将调用窗口来向用户显示必须插入一张卡(输入该卡的密码)。当您在具有可登录桌面的某个用户帐户下运行生成服务器时,此问题可能会得到解决。当您以此用户身份登录并启动构建服务器时,它必须请求使用私钥(例如,通过签名某个虚拟文件或其他方式)。窗口将弹出,操作员(根据法定人数的要求)将一个接一个地插入他们的卡片并可选择地输入他们的密码。在插入了所有所需的卡之后,您的生成服务器将可以使用该密钥。任何其他应用程序(可能由其他用户启动)都将通过相同的过程来使用该密钥。如果生成服务器崩溃(生成服务器崩溃吗?)你也会经历同样的过程。

HSM也有篡改保护,所以私钥在那里是IMHO的安全。抱歉,我只谈了Thales HSMs,但我个人没有任何其他HSM的经验。

票数 0
EN

Stack Overflow用户

发布于 2016-06-23 18:07:50

似乎依赖密码保护的PFX文件而不是证书存储是安全的。即使在PFX所在的硬盘驱动器文件夹上没有ACL保护,也没有人可以使用PFX文件签名任何东西,除非他们也有密码。

然后,在那台计算机上设置一个参数化的Jenkins“签名”作业,完全封装PFX密码,这样就没有人能看到它。(我正在考虑某种脚本,Powershell,可能转换成一个黑匣子EXE。)授权的Jenkins作业可以链接到签名作业以完成签名。EXE每次被用作审核功能时都会进行日志记录。只需要弄清楚如何防止未经授权使用的签名job...there必须是一种方法来做到这一点?

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22431526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档