自动代码签名 - 保护私钥

2024-01-08

我想要自动执行一些 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),假设私钥密码是由授权用户提供,生成用于构建服务签名的私钥?


首先我尝试分别回答一下大家的问题:

  1. 保护私钥不被复制:
    只有加密硬件(智能卡或 hsm)才能真正保护密钥不被复制。 Windows 证书存储(即使使用您正确注明的不可导出选项)或 PKCS#12 (PFX) 文件仅提供错误的保护感觉。
  2. 防止未经授权的用户使用私钥对代码进行签名:
    IMO 这需要用户交互,例如输入密码或 PIN。如果您将密码作为参数传递,其他进程总是有可能从进程信息、日志等中获取它。
  3. 鉴于私钥密码是由授权用户提供的,使私钥由构建服务签名:
    通过 CSP(Windows 证书存储)通过交互式输入 PIN 访问的加密硬件(智能卡或 hsm)应该可以与 Signtool 配合使用,不会出现任何问题。

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

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

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

但请注意,PFX 文件不仅可以从实时系统复制,而且还可以从备份复制,且无法被检测到。

方便但不太安全的解决方案没有。 2:将私钥存储在不需要输入 PIN 的智能卡上,并且仅允许受信任的用户访问系统。这将确保您的私钥无法被复制,同时 Signtool 仍可以轻松访问它。但是,它可能需要您拥有两台独立的构建服务器 - 一台没有所有用户都可以访问的智能卡,另一台则只有受信任的用户可以访问智能卡。

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

您还可以考虑在自动模式下使用自签名协同签名证书签署开发版本,并在手动模式下使用受信任的协同签名证书签署公共发布版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动代码签名 - 保护私钥 的相关文章

  • Jenkins 无法访问 SVN (https://)

    我创建了 Jenkins 项目 该项目在 SVN 上有文件 https repo xxx xxx svn priv 项目名称 https repo xxx xxx svn priv projectname 证书是自签名的 我的问题是 Jen
  • 从远程主机自动下载 X509 证书链

    我正在构建一些 net 代码 这些代码将在我们的一台服务器上按计划无人值守地运行 其执行的一部分要求它执行一个 Java 可执行文件 该可执行文件通过 SSL 与某些 Web 资源和服务进行通信 如果 Java 通过 SSL 执行某些操作并
  • Medium Trust 中允许哪些反射权限?

    我想问一下Medium Trust中允许使用哪些方法 类 例如 这些方法是否被允许 获取属性 获取方法 激活器 CreateInstance 汇编版本 程序集名称 名称 请告诉我哪些方法是允许的 GetMethods 和 Activator
  • 如何使用 QWAC 和 QSealC 配置文件(PSD2 特定属性)创建 eIDAS 证书以进行测试

    我想使用 QWAC 和 QSealC 配置文件创建一个 eIDAS 证书 并具有文档中提到的 PSD2 特定属性 请帮助我 这只是为了测试目的 https docbox etsi org ESI Open Latest Drafts ts
  • Lisp reader 输入中的关键字有危险吗?

    在 Doug Hoyte 的 Let Over Lambda 的第 102 页上 作者这样描述他的安全读取字符串函数 这意味着向量 位向量 gensym 循环引用 和所有其他的都被淘汰了 安全读取字符串甚至不允许关键字或外国包符号 我绞尽脑
  • 如何让用户以 root 权限运行脚本?

    鉴于SUID shell 脚本的危险 http www drdobbs com dangers of suid shell scripts 199101190 是否有更安全的方法可以在 Linux 中以 root 权限对脚本 bash PH
  • 有条件地启用 Jenkins 声明式管道选项吗?

    Jenkins 是否提供任何功能来实现下述管道 pipeline agent any options when branch master disableConcurrentBuilds stages 我有两个状态的存储库 这个单一管道必须
  • 即使从 ca 目录删除 CA 后,starttls 仍成功

    我无法验证我的软件的正确行为 以下是我为验证操作是否正确而执行的步骤 我有使用 openldap 库并对 ldap 服务器执行启动 tls 的示例代码 我第一次设置了 ca cert 目录和 tlx 上下文的全局选项 之后 我对服务器执行了
  • 无法使用 jenkins 运行 python 脚本

    我正在尝试运行 Python 作业 我创建了以下文件夹 C Users herod jenkins ws workspace window testing 并向其中添加脚本 testing py 该脚本非常简单 if name main p
  • Mac 加载命令损坏

    在我们的一个应用程序上签名 代码设计 失败malformed object unknown load command 9 在网上做了一些研究后 我发现加载命令是可执行文件头中的特殊命令 内核使用它们来进行段加载 http 0xfe blog
  • 如何将 openssl_pkey_get_public 和 openssl_verify 转换为 C# .NET

    PHP 代码验证来自银行的 iPizza 签名 key openssl pkey get public file get contents preferences bank certificate if openssl verify dat
  • 让 PHPmailer 成为 Gmail 的“更安全的应用程序”

    我们可以在 PHPmailer 中实施哪些安全措施 使其成为更安全的 Gmail 应用程序 https support google com accounts answer 6010255 https support google com
  • 对于向 XSS 漏洞开放 JWT,我应该有多担心?

    我正在构建一个 Node js Web 应用程序 该应用程序使用用于 GUI 的 React 和由 Apollo 提供的 graphQL 用于连接到 AWS 上的 RDS MySQL 实例的后端 我正在对用户进行身份验证 然后返回 JWT
  • 动态创建的 Jenkins 管道脚本

    我正在使用詹金斯管道项目 在脚本中我想写parallel以动态方式阻止 因为节点数量可以改变 例如 从此 parallel node1 node stage1 stage2 node2 node stage1 stage2 像这样的事情 f
  • ulimit -r 返回不同的值

    我将以下两行添加到系统范围的 etc security limits conf 中 soft rtprio 55 hard rtprio 55 系统重新启动后 根据我在计算机上访问用户帐户的方式 我会得到两个不同的结果 user clien
  • 由于无法确认开发者身份而无法打开

    我在 Mac OSX 中开发了一个应用程序和守护进程 并且我已经在 xcode 中与开发者 ID 签署了应用程序和守护进程源代码 在守护进程中 我已经对每个框架进行了签名并打包 并且我使用软件包安装程序对所有框架进行了 pkg 现在我的应用
  • 为什么我应该使用 $_GET 和 $_POST 而不是 $_REQUEST? [复制]

    这个问题在这里已经有答案了 除此之外 REQUEST从 cookie 读取 有什么理由我应该使用 GET and POST代替 REQUEST 这样做的理论和实践理由是什么 当我只想让用户的某些数据返回某些数据时 我使用 REQUEST 当
  • 是否应该用于 JSF 2.2 CSRF 保护?

    我很困惑 我看到 JSF 2 0 有隐式 CSRF 保护 JSF 2 0 如何防止 CSRF https stackoverflow com questions 8704612 how jsf 2 0 prevents csrf 根据文章的
  • 用于存储和检索每个用户敏感数据的.Net 设计模式

    Net 服务器应用程序是否有与存储和检索敏感的每个用户信息 例如第 3 方凭据 相关的参考模式 我的初步设计思路是 生成具有适当强私钥的自签名 X509 证书 导出证书和密钥并将其存储在 USB 密钥中 该 USB 密钥将被锁在宝箱中并由龙
  • 阻止对单个 Mercurial 存储库中特定分支的写访问

    是否可以在 Mercurial 中编写某种方式的钩子来拒绝影响存储库中特定命名分支的变更集 我们有一个托管项目 并希望允许任何开发人员将他们的更改推送到我们的存储库 只要他们位于他们自己的命名分支中 这使我们能够在同一存储库中管理单个构建机

随机推荐

  • 如何在Javascript中仅使用过滤器获取唯一数组[重复]

    这个问题在这里已经有答案了 我有一个数组 var a 2 3 4 5 5 4 我想从给定的数组中获取唯一的数组 例如 b 2 3 4 5 我努力了 a filter function d return b indexOf d gt 1 而且
  • 如何实现brew 配方的安装或升级?

    我想安装一个酿造配方或升级它 如果已经使用 bash 安装 仅当最后未安装配方时 该命令才应返回非零退出代码 附言 应该注意的是brew install xxx返回错误代码如果xxx已安装 背景 https github com Homeb
  • 如何从存储中获取准确的容量

    我想以编程方式从实习存储中读取确切的容量 我使用的是 Samsung Galaxy S7 Edge 32GB 设备 在预装的三星文件管理器 德语 Eigene Dateien 中 它显示了 32GB 的总容量 即使在菜单 gt 设置 gt
  • 实体框架 - 通过同一列中的多个条件进行选择 - 引用表

    示例场景 两张表 order and 订单项目 关系一对多 我想选择至少有一个价格为 100 的 orderItem 和至少一个价格为 200 的 orderItem 的所有订单 我可以这样做 var orders from o in ko
  • 用于查找给定文档的词频的 Python 脚本

    我正在寻找一个简单的脚本 可以找到给定文档的单词频率 可能通过使用便携式词干分析器 是否有任何库或简单的脚本可以执行此过程 use nltk http www nltk org import nltk YOUR STRING Your wo
  • Typescript Node.js 最简单的设置不起作用 - 错误 TS2307:找不到模块“fs”

    我已经全局安装了 TS 和节点类型 PS C Projects Test gt npm list global depth 0 C Users Jan AppData Roaming npm types email protected cd
  • 我知道react-native的TextInput有一个onsubmit回调函数,但是我实际上如何制作那个提交按钮?

    我想知道如何呈现此按钮 如果是的话 它是否会自动绑定到输入字段中的文本 基本上onSumbitEditing当从 Android 软键盘上单击 go 按钮时 将触发并提供事件 如下例所示
  • 承诺:转到下一个错误函数[重复]

    这个问题在这里已经有答案了 如何使用 Promise 链调用下一个错误函数 我认为错误函数内的返回会自动调用下一个错误函数 Called in a controller dataService saveRequest then functi
  • 如何在VSCODE中设置tasks.json文件来编译Fortran程序?

    我想设置 VScode 操作系统 Windows 10 来创建并编译用 Fortran 90 95 编写的程序 我可以通过在终端中输入以下内容来完成此操作 gfortran o Example exe Example f90进而 Examp
  • 捕获 python 程序的标准输出

    我正在尝试编写一个 C 程序来捕获 python 程序中的标准输出 我的问题是所有输出都是在程序执行之后而不是实际发生时出现的 举个例子 对于这个 python 程序 print Hello time sleep 2 print Hello
  • 在 net core 控制台应用程序中使用 Web 服务器进行简单路由

    我在使用 kestrel 进行路由时遇到问题 我找不到任何关于如何在 netcore 控制台应用程序内部实现此功能的好的教程 我想构建一个简单的 Web 服务器 它有 2 3 个可以访问的端点 public class WebServer
  • 由于非 Ascii 字符,顶点着色器无法编译?

    因此 我开始使用 OpenGL 与 glew 和 GLFW 来创建游戏引擎 在开始使用着色器时我几乎立即遇到了问题 它们没有被使用或者即使被使用也没有任何效果 我一直在用大量其他示例检查我的代码 它们都匹配 没有任何看起来不合适的地方 我开
  • 访问控制允许来源语法

    我希望允许所有的跨源资源共享from example com 的子域 因此 我将如下所示的跨源资源共享标头添加到了页面中subdomain1 to example com
  • 如何将全部破坏限制为仅长单词?

    我正在尝试全部打破很长的单词 还有一些很长的uuid col在基于引导程序的模板中 但是当我对所有列使用以下样式时 它会破坏所有内容 在示例中检查不良破坏 即使单词正常换行的地方工作得很好 在示例中检查预期破坏 有没有办法我可以尽可能使用正
  • Webpack 无法加载字体(ttf)

    目前我有 3 种字体想要添加到我的 React 项目中 一个 一个光 一个大胆 我的文件结构 src fonts A ttf A light ttf A bold ttf styles base base scss styles scss
  • 限制对 C++ 中特定类的方法访问

    我有两个密切相关的类 我将其称为 Widget 和 Sprocket Sprocket 有一组方法 我希望可以从 Widget 调用它们 但不能从任何其他类调用它们 我也不想仅仅将 Widget 声明为 Spocket 的友元 因为这将使
  • 如何访问 OpenCV Matcher 上的点位置?

    我正在使用这个 FLANN 匹配器算法来匹配 2 张图片中的兴趣点 代码如下所示 有时代码会找到匹配点的列表 std vector
  • 向 Python 添加宏

    我想调用以下代码in situ无论我提到什么MY MACRO在我下面的代码中 MY MACRO frameinfo getframeinfo currentframe msg We are on file frameinfo filenam
  • 归并排序,递归部分

    研究了几天合并排序后 我从概念上理解了它 但有一点我不明白 我得到什么 1 它需要一个列表 例如一个数字数组 将其分成两半并对两半进行排序 最后将它们合并在一起 2 因为它是一种递归算法 所以它使用递归来做到这一点 因此 上述数组的分割如下
  • 自动代码签名 - 保护私钥

    我想要自动执行一些 ClickOnce 部署工件 应用程序 exe 和清单 的代码签名 我在用signtool http msdn microsoft com en us library windows desktop aa387764 2