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

时间:2016-04-08 09:06:47

标签: windows certificate code-signing signtool

我有一个我绝对不明白的问题。几天前,我从我们的供应商(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"

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

一个。如何找到旧证书的存储位置并将其删除? 湾如何强制signtool使用新证书,或者至少失败?!

2 个答案:

答案 0 :(得分:1)

使用PFX文件并参考它的解决方法是一个很好的解决方案。

但是,您可以尝试以下方法:

  • 将参数/s MY添加到signtool参数链中。 " MY"链接到个人商店。

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

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

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

答案 1 :(得分: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证书,所以在我的signtool命令(使用SHA256发行者名称)中添加一个适当的/ i参数解决了我的问题。