Windows signtool为代码签名选择了错误(旧)证书

Windows signtool为代码签名选择了错误(旧)证书,windows,certificate,code-signing,signtool,Windows,Certificate,Code Signing,Signtool,我有一个我完全不明白的问题。几天前,我从我们的供应商(GlobalSign)那里发布了一个新的代码签名证书 与执行生成/代码签名的用户一起登录到生成服务器后,我启动了certmgr,导航到个人证书存储并删除了旧证书。然后我使用导入对话框导入新证书,包括它的私钥 测试构建表明signtool仍然使用旧的证书对应用程序进行签名。但是,我无法在certmgr中的任何位置找到此证书,即使是通过搜索该证书SHA1校验和也无法找到 通过谷歌搜索,我发现了这篇博文: 它声明如下: 删除旧证书。如果您正在续订现

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

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

测试构建表明signtool仍然使用旧的证书对应用程序进行签名。但是,我无法在certmgr中的任何位置找到此证书,即使是通过搜索该证书SHA1校验和也无法找到

通过谷歌搜索,我发现了这篇博文: 它声明如下:

删除旧证书。如果您正在续订现有证书,则保留已安装的旧证书通常并不有用,如果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"
“我的公司名称”是包含在旧证书和新证书中的名称

"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文件并引用它的变通方法是一个很好的解决方案

但是,您可以尝试以下操作:

  • 将参数
    /s MY
    添加到signtool参数链。个人商店的“我的”链接

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

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

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


我的情况似乎类似,但在我的情况下,将证书文件的密码放入构建脚本中不是一个选项。我在使用任何MMC管理单元查看(如certmgr.msc)证书存储时遇到问题,因为Windows Server 2012 R2不允许我的非管理员生成用户使用这些管理单元。我尝试了在这里()找到的PowerShell脚本的变体:

它向我显示了为我创建冲突的证书。(奇怪的是,尝试使用
certutil-viewstore My
产生了一组不同的证书。(不幸的是,证书存储的位置仍然让我感到困惑。)


在我的例子中,问题是我想要一个较新的SHA256证书而不是较旧的SHA1证书,因此在我的signtool命令中添加一个适当的/I参数(使用SHA256颁发者名称)修复了我的问题。

我通过直接使用.pfx文件而不是证书存储解决了这个问题,就像我读到的一篇博文中描述的那样:
signtool.exe sign/f codesign.pfx/p PASSWORD-tr”http://www.startssl.com/timestamp“你好,World.exe”
在此处找到:感谢您的回答!但是,我现在将坚持我的解决方案,因为:a.)证书现在已经过期,我无法轻松可靠地测试您的解决方案b.)我已经在certmgr中搜索了所有存储区多次,但找不到旧证书c.)解决方案对我来说,似乎比添加更多的“神秘”参数更为清晰;)