17

我刚刚从 THAWTE 购买了代码签名证书(MS 验证码),并且显然已将其安装在我的构建机器上。我以用户身份登录,当我打开 cmd 提示符时,我可以使用带有 signtool.exe 的证书对 EXE 进行签名。

不幸的是,同样的命令行在机器上运行的 hudson 进程中不起作用。

我得到的错误信息是:

SignTool 错误:未找到满足所有给定条件的证书。

我认为这是因为 hudson 服务运行的帐户与我从用于从 thawte 获取证书的帐户运行 signtool.exe 的帐户不同。

所以,我的问题是:我该如何解决这个问题?我以为我要从 thawte 下载一个文件,但它只是使用 IE 以某种方式神奇地将证书安装在用户的缓存中。我可能想导出(或任何正确的术语)到我可以在任何其他机器上存储/保存或使用的文件。

我该怎么做以及如何使用系统/服务帐户中其他用户的文件或证书正确调用signtool?

4

5 回答 5

15

取自signtool sign -h输出:

/s <name>   Specify the Store to open when searching for the cert. The default
is the "MY" Store.
/sm         Open a Machine store instead of a User store.

让它工作有点痛苦......我能够通过将证书添加到本地机器存储并使用 /sm 开关来让它工作。

/s 开关允许您选择要使用的预定义存储。不幸的是,我找不到任何列出实际可用选项的文档(@Microsoft signtool 维护者:请记录一下!)。另一个复杂因素是很难确定 Hudson 提供访问哪个商店 - 它不是您可能期望的本地安全 hudson 帐户。

注意:当从 signtool 访问时,mmc 视图中列出的“个人”存储是“我的”存储。

幸好 /sm 开关为我们提供了一张越狱卡。不幸的是,如果您的构建服务器为多个组织或部门运行作业,这将是一个安全风险。就我而言,它仅由我的团队使用,所以这不会打扰我。

于 2011-11-17T20:57:10.850 回答
4

出于参考目的,我将在这里添加我们的经验。我们正在使用 TeamCity 构建签名的 ClickOnce 应用程序。我花了几个小时才把它弄好,所以我希望这可以节省其他人一些时间。

注意:我在 Windows 2k3 服务器上运行它,它也是一个域服务器(是的,我知道)。

  1. 我们使用来自 GoDaddy 的代码签名证书。CSR 是使用 Internet Explorer 生成的。因此,使用 Internet Explorer 完成发行后,我基本上将代码签名证书安装在我自己的帐户下。

  2. 因为我需要构建服务器上的证书,所以我选择了 IE:

    [额外] > [Internet 选项] > [内容] > [证书]

    然后我右键单击证书并[Export] 'ed。我勾选了[导出个人密钥]并选择了 PFX 格式并启用了[导出所有证书][导出所有属性](不确定最后一个是否真的需要)。最后,在指定位置后,我有了我的 Precious。

  3. 现在我已经准备好承受一些真正的痛苦了,但是为了省去你的细节,我会跳过那些讨厌的打嗝。由于 TeamCity 在 System 帐户下运行,因此我需要在我们的构建服务器上以相同的帐户拥有此证书。所以在构建服务器上,我调用了:

    C:\> psexec -i -s cmd

  4. 这向我抛出了一个命令行,以系统用户身份运行。现在我再次调用了我生锈的 IE:

    C:\> C:\Program Files (x86)\Internet Explorer\iexplore.exe

  5. 我导航到证书,而不是导出,我选择了导入并选择了我之前导出的证书。我让 Windows 选择存储它们的位置。

  6. 现在一切就绪,让 ClickOnce 使用证书签署我们的应用程序。我们只需要确保 ClickOnce 知道它。我不想将我们的密钥文件放在代码存储库中,因此在我的本地 Visual Studio 中项目属性的[签名]选项卡上,我勾选了[ClickOnce 清单]并使用[从商店中选择...]而不是 [从文件中选择...]。这使我可以选择本地安装的证书。在那一刻,VS 创建了一个属性 <ManifestCertificateThumbprint>,这是让它在构建服务器上运行的最重要的事情。

    请注意,我还添加了一个时间戳服务器,它不是强制性的,但强烈建议用于签名软件。否则,当您的证书过期时,您的软件可能会停止验证。对于 GoDaddy,时间服务器是http://tsa.starfieldtech.com

    另请注意,我没有签署程序集(还)。只是告诉你知道这是可能的。

  7. 现在构建服务器将获取项目文件和新的 ManifestCertificateThumbprint 属性,并将其提供给 SignTool 任务。为了让它运行,我必须将 signtool.exe从 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin 复制到构建服务器上的相同位置。

    严重令人讨厌的调试已经进入了弄清楚为什么signtool不工作的原因。我拿出了像ProcMonProcess Explorer这样的工具来找出哪些注册表项是由哪些命令行请求的。我重新创建了 SignTool 调用的实际命令行,并使用这些工具观察了效果。

最后,经过大量紧张的开发和系统管理员的痛苦,我能够部署我们签名的 ClickOnce 应用程序。干杯!

于 2013-03-21T17:02:37.060 回答
1

这现在有点老了,但我只是有一个类似的问题,我认为值得记录。

我有一个在 Win2008R2 上运行的 Jenkins CI 服务器作为运行作业时找不到证书的服务,但手动我可以在同一台机器上签署任何内容。

signtool sign /sha1 ### file.dll  
SignTool Error: No certificates were found that met all the given criteria.

问题是 Jenkins 服务作为本地机器运行 - 所以我认为使用上述答案会起作用。

signtool sign /sm /sha1 ### file.dll

同样的错误。/a也没有做任何事情。

我通过创建用户“Jenkins”作为管理员组成员、以用户“Jenkins”运行服务、以 Jenkins 用户身份登录并在用户存储中安装证书来使其工作。

是的,我确实安装了本地机器存储的证书。mmc我什至通过使用和添加服务帐户 - Jenkins 商店来确认服务商店拥有证书。

于 2012-12-03T06:15:45.213 回答
0

我认为这将是一个简单的问题来解决。相反,它正在变成一场希腊悲剧。

提供商 Thawte 显然认为要求所有证书操作在发起请求的同一台机器和浏览器上进行是很有用的。不幸的是,就我而言,我是从 Windows7 机器上完成的。由于一些 MS 的废话,这意味着当我获得证书时,我无法使用私钥导出它。这只能在 Win2000 和 XP 上实现。所以我需要使用一个 7 岁的操作系统来为我的业务做一些基本的事情。这是令人兴奋的。

事实证明,现在我正在等待证书的第三个请求得到满足。

于 2010-04-24T03:03:50.683 回答
0

尝试通过 Windows 上的 Jenkins slave 签署可执行文件时,我遇到了类似的问题。问题是,由于 jenkins 在 windows slave 上作为服务运行,签名工具无法在个人证书存储中找到导入的证书(根据微软参考,这应该是签名工具选择的默认存储)

我从詹金斯控制台收到以下错误:

SignTool Error: No certificates were found that met all the given criteria.

通过以下解决方法,我能够修复 jenkins 上的签名问题:

  • 远程桌面到您的 Windows 从站
  • 打开 windows mmc(从开始菜单中选择运行,然后输入mmc
  • 创建一个新的证书管理单元(文件 -> 添加/删除管理单元)
  • 选择Certificates管理单元并添加它
  • 配置管理单元以管理证书Computer Account
  • 点击OK然后Finish
  • 通过单击添加新的管理单元OK
  • 现在去展开Trusted Root Certificates Authorities,右键单击 Certificats->All Tasks->Import
  • 导入您的签名证书,按照说明进行操作,您应该一切就绪
于 2019-09-20T10:58:22.987 回答