Signtool错误:找不到Windows Store应用程序满足所有给定条件的证书?


293

我正在尝试使用我拥有的pfx文件对Windows 8 appx软件包进行签名。我正在使用这样的命令:

signtool.exe sign /fd sha256 /f "key.pfx" "app.appx"

然后,我得到:

SignTool错误:找不到符合所有给定条件的证书。

我没有满足什么“标准”?这仅用于测试,因此它们是自签名证书。我尝试导入密钥,然后对其进行签名,但是它始终会导致相同的错误。我该如何解决?


我认为这Signtool是在受信任的根证书存储中查找证书,并且您那里没有代码签名证书。
crea7或

15
我遇到此错误是因为用于签名的证书已过期
Mark Homer 2015年

1
我遇到了类似的问题,并在此处发布了答案。希望这可以帮助。
SurenSaluka

Answers:


589

通过Visual Studio收到此错误时,是因为存在与原始开发计算机匹配的签名证书设置。

您可以通过转到项目属性>签名选项卡并检查证书详细信息来进行检查。

您可以取消选中“签署ClickOnce清单”,以禁用签署。

签名属性

如果您不想关闭此选项,则必须安装证书。


12
只是添加到@JDandChips的建议中:为了进行调试和测试,您还可以通过单击上方屏幕快照中所示的“创建测试证书”按钮来使用临时测试证书。
2015年

您是什么意思“安装证书”?
肖恩·肯德尔

在我的情况下,可以从最初开发该证书的计算机上获得该证书,因此我可以选择“从文件中选择...”来安装缺少的证书。另外,您始终可以创建一个新的并使用它!
JDandChips '16

@JDandChips如何创建新证书?
erotavlas

3
对于VS新手。确保右键单击项目而不是解决方案,因为这将弹出一个完全不同的菜单!
B5A7

109

尝试使用/ debug。1,2如下:

signtool sign /debug /f mypfxfile.pfx /p <password> (mydllexectuable).exe

它将帮助您了解正在发生的事情。您应该获得如下输出:

The following certificates were considered:
    Issued to: <issuer>
    Issued by: <certificate authority> Class 2 Primary Intermediate Server CA
    Expires:   Sun Mar 01 14:18:23 2015
    SHA1 hash: DD0000000000000000000000000000000000D93E

    Issued to: <certificate authority> Certification Authority
    Issued by: <certificate authority> Certification Authority
    Expires:   Wed Sep 17 12:46:36 2036
    SHA1 hash: 3E0000000000000000000000000000000000000F

After EKU filter, 2 certs were left.
After expiry filter, 2 certs were left.
After Private Key filter, 0 certs were left.
SignTool Error: No certificates were found that met all the given criteria.

您可以查看导致您的证书不起作用的过滤器,或者是否未考虑任何证书。

我更改了哈希值和其他信息,但您应该明白了。希望这可以帮助。


1 请注意:请signtool特别注意该/debug选项的放置位置。它需要遵循sign声明。
2 另请注意:该/debug选项仅适用于的某些版本signtool。WDK版本具有该选项,而Windows SDK版本则没有。


3
为我工作。我不是了解signtool的响应,但是/ debug做了应有的工作。赞!
noelicus 2015年

1
此命令在/ debug放置的地方特别有用。如果您按顺序放置/ debug,它将报告错误。
丹尼尔

12
/ debug仅适用于signtool.exe的特定版本。WDK附带的一个提供此选项,而Windows SDK则不提供。
Paul Kertscher

3
此外,/ debug必须在signtool标志之后,而不是在两者之间。
Denis V

显示我的证书已过期。做得好。
avantprime 2015年

36

请务必先检查您的证书的有效期限,因为大多数证书都有有效期限。就我而言,证书已过期,我正在尝试构建项目。


2
要检查证书的到期时间,请转到命令行,导航到证书所在的位置,然后输入certutil -dump mycertificate.pfx。查看最后一个条目,因为第一个条目是CA,而不是您的代码签名证书。
HockeyJ

23

如果您不必签署应用程序,请右键单击您的项目

Project Properties -> Signing -> uncheck "Sign the ClickOnce Manifest"

就像这篇 MS文章所建议的那样,

如果您使用的是Visual Studio 2008,并且以.NET 3.5为目标并使用自动更新,则只需更改证书并部署新版本,


1
您也可以单击创建测试证书进行。谢谢
MindRoasterMir

16

只需在项目属性的“签名”选项卡中取消选中“对单击一次的迹象进行签名”,它将消除该错误,您可以从那里创建一个新的错误。


15

遇到了同样的问题,结果证明证书的私钥没有许可。
要修复-打开证书管理,找到您的证书,右键单击->管理私钥,然后在顶部的安全性中确保您的用户已添加并具有授予的权限,该权限已为我修复。


15

就我而言,我尝试关联的证书类型错误。
我使用的是“服务器身份验证”,而不是“代码签名”
您应该能够在“目标用途”部分的“证书捕捉”中看到此内容。
在那之后,它工作正常。


1
是的,就是说,我在寻找答案的过程中挣扎了2天。
HakanFıstık17年

14

万一其他人遇到这个问题:我的问题最终是我需要在使用signtool.exe应用之前以管理员身份运行命令提示符。然后,一切都进行得很好。


11
对我的情况没有帮助。
bgplaya 2014年

1
我正在从VS2015作为脚本运行signtool,并且遇到了相同的问题。我以管理员身份运行VS2015,并且signtool能够对我的文件进行签名>
hamaney


9

我通过使用该/sm标志来指定要在机器存储中查找而不是默认的My(本地用户)存储来解决此问题。此外,它还可以通过使用帮助打开signtool的调试功能/debug


8

我遇到了这个问题,我不确定要执行哪个步骤,但是希望这可以对其他人有所帮助...这就是我所做的:

  • 将下载的证书(.crt)安装到证书中(我将其放入“个人”存储中)-右键单击.crt文件,然后单击“ 安装证书”
  • 运行certmgr.msc导出证书(在第一步中使用的任何存储中均可找到),并将其导出为pfx文件,包括私钥和扩展属性(可能不必要)
  • 签署专案时使用汇出的.pfx档案
  • signtool示例:signtool sign /f "c:\mycert.pfx" /p mypassword /d "description" /t http://timestamp.verisign.com/scripts/timstamp.dll $(TargetPath)
    密码与导出期间提供的密码相同

1
谢谢,这成功了。我使用的.crt是Comodo提供的文件,而不是安装证书然后导出.pfx文件。
约书亚·品特

1
非常感谢!
布鲁诺·苏亚雷斯

6

我遇到了同样的问题,阅读了一些答案(在此处发布),我看到我的证书已过期。

只需从我的开始项目中创建一个新的。然后在证书管理器中删除了过期的证书。

现在一切都可以编译了。


5

这些标准包括帐户名(与之关联的私钥),域,公司,有效期,预期目的等。

发生此错误的可能原因有很多,已经列出了一些原因。这是另一个提示:导入证书时,请确保您使用从证书颁发机构(CA)接收原始文件,否则某些属性可能会丢失。

示例:最近,我尝试导入从同一计算机上的其他帐户导出的证书。该证书对我的帐户变为可见,但未与我的帐户关联,因此signtool拒绝在未明确提供文件名和密码的情况下识别该证书。当将其作为构建过程的一部分完成并在批处理文件或源文件中明确写出时,可能不够安全。(导入原始CA颁发的证书即可解决。)


4

我有同样的“ 经过私钥过滤器之后,剩下0个证书 ”的消息,并花费了我一生的时间来弄清楚消息的含义。

问题是我在Windows证书存储区中错误地安装了证书,因此没有与代码签名证书关联的私钥。

我应该做的是:

  1. 使用Firefox或Internet Explorer,将请求提交给发行者。这将生成一个“私钥”,该私钥由浏览器以静默方式存储(在Firefox中,对话框会显示一秒钟的时间)。请注意,其他浏览器可能无法正常工作:您的寿命太短,无法确定它们是否起作用。

  2. 提交请求,跳过发行者的验证环和圈,牺牲山羊,向神祈祷,提交曾祖父母的签名声明等。

  3. 下载证书(.crt)并将其导入到同一浏览器中现在,浏览器同时具有私钥和证书

  4. 从浏览器将证书导出为个人信息交换(.p12)文件。系统将要求您提供密码以保护该文件。

  5. 保留.p12文件的备份副本。

  6. 运行证书管理器(certmgr.msc),右键单击“ 个人”证书存储,选择“ 所有任务/导入...”,然后将.p12文件导入Windows。系统将要求您提供用于保护文件的密码。此时,根据您的安全要求,可以将密钥标记为可导出,以便可以从Windows存储还原副本。如果要破坏批处理脚本,还可以标记使用前需要输入密码。

  7. 成功运行signtool,松一口气,并考虑由于错误的错误消息以及缺少文档或缺少文档而浪费的生命。


2

我也遇到了这个问题,尝试了很多。使用了SDK以及Visual Studio签名,但是到处都有“找不到符合所有给定条件的证书”。

解决方案:请注意,如果显示“私钥过滤器之后”:“ 0左”并带有选项signtool sign / debug ...,则原因是您的PC自身中没有CA。要解决此问题,请先安装CA(在我的情况下是.crt文件),然后再次运行该标志。它应该现在就可以工作!

Signtool只能与同一PC要求拥有的CA一起使用。


将signtool与来自另一台PC的CA一起使用时,我没有问题。
bparker

2

我的问题最终是因为我不了解signtool选项。我为/ n选项提供了与我的证书不匹配的内容。当我删除它时,它不再抱怨了。


2

我遇到类似的问题,我的计算机名称已更改并且证书已过期。通过创建新的测试证书,我能够解决此问题。

在Visual Studio中,右键单击解决方案资源管理器中的项目。选择属性。选择“登录属性”窗口。单击“创建测试证书...。”。输入测试证书的密码信息,然后单击“确定”。


2

使用/ debug,当您收到此消息“在私钥过滤器之后,剩下0个证书。”,原因之一可能是pfx文件没有私钥。当您将已安装的证书导出到pfx文件时,请确保启用此复选框以同时包含私钥。


1

在初始化编译之前,转到project properties并取消选中所有字段Firm

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.