Signtool选择了错误(旧)的证书进行代码签名。

3

我有一个问题,完全不理解。几天前,我从我们的供应商(GlobalSign)颁发了一个新的代码签名证书。

在使用执行构建/代码签名的用户登录到构建服务器后,我启动了 certmgr,导航到个人证书存储并删除了旧的证书。然后,我使用导入对话框导入了新证书,包括它的私钥。

测试构建显示,signtool 仍然使用旧证书来签署应用程序。但是,我无法在 certmgr 中找到此证书的任何位置,甚至无法通过搜索该证书的 SHA1 校验和来查找。

经过一些谷歌搜索,我找到了这篇博客文章:http://qualapps.blogspot.de/2008/07/installing-code-signing-certificate.html 它陈述了以下内容:

删除旧证书。如果您正在更新现有证书,则保留旧证书通常没有用处,并且具有多个证书会破坏 SIGNTOOL(如果 signtool 正在搜索证书存储)。转到“控制面板/Internet 选项/内容”,单击“证书”,选择旧证书,然后单击“删除”。如果您允许 PVKIMPRT 决定将其放在哪里,则旧证书可能会出现在“个人”页面上。

我遵循了这些说明,但我能找到的只有新证书。

"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin\signtool" sign /v /sm /n "my company name" /tr http://tsa.starfieldtech.com "the-setup.exe"

"

我的公司名称"是旧证书和新证书中都包含的名称。

a. 我该如何找出旧证书仍存储在哪里并删除它? b. 我该如何强制signtool使用新证书,或者至少失败?!

"

我通过直接使用.pfx文件而非证书存储来解决了这个问题,就像我在一篇博客文章中所描述的那样:signtool.exe sign /f codesign.pfx /p PASSWORD -tr "http://www.startssl.com/timestamp" "Hello World.exe"。博客链接:https://www.pierschel.com/de/software-blog/18-code-signing-tutorial-de - Vertigo
2个回答

2
使用PFX文件并引用它的解决方法是一个很好的方案。
但是,您可以尝试以下操作:
  • 将参数/s MY添加到signtool参数链中。 "MY"链接到个人存储。

  • 在certmgr.msc中查看其他存储,如果它们不包含旧证书的副本

  • /a添加到参数链中。这将导致“自动选择最佳签名证书”(无论这意味着什么:))

  • 您可以等待旧证书过期。之后,它应该自动只使用新证书


谢谢你的回答!但是,我现在还是会坚持我的解决方法,因为: a.) 证书已经过期了,我无法可靠地测试你的解决方案 b.) 我已经多次搜索了certmgr中的所有存储区,但找不到旧证书 c.) 对我来说,“解决方法”似乎比添加更多“神秘”的/a参数更清晰一些 ;) - Vertigo

1

虽然我遇到的情况看起来很相似,但在我的情况下,在我的构建脚本中放置证书文件的密码不是一个选项。我无法使用任何MMC快照查看证书存储(例如certmgr.msc),因为Windows Server 2012 R2不允许我的非管理员构建用户使用快照。我尝试了这里找到的PowerShell脚本的变体(https://social.technet.microsoft.com/Forums/windowsserver/en-US/7ed48943-22e2-4afd-aa77-2424d2a9eee1/how-to-delete-archived-certificates-using-the-certutil-command?forum=winserversecurity):

$store = New-Object  System.Security.Cryptography.X509Certificates.X509Store "My","CurrentUser"

$MaxAllowedIncludeArchive = ([System.Security.Cryptography.X509Certificates.openflags]::MaxAllowed –bor [System.Security.Cryptography.X509Certificates.openflags]::IncludeArchived)
$store.Open($MaxAllowedIncludeArchive)

[System.Security.Cryptography.X509Certificates.X509Certificate2Collection] $certificates = $store.certificates

foreach ($cert in $certificates)
{
  Write-Host $cert
}

$store.Close()

它向我展示了制造冲突的证书。奇怪的是,尝试使用certutil -viewstore My会产生不同的证书集。(证书存储的位置仍然令人困惑。)
在我的情况下,问题是我想要一个更新的SHA256证书而不是我旧的SHA1证书,所以将适当的/i参数添加到我的signtool命令中(带有SHA256颁发者名称)解决了我的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接