即使添加了新密钥,“无法在证书存储中找到清单签名证书”。

226

我无法使用强名称密钥签名构建项目 - 总是提示标题中的消息。

是的,该项目最初是从另一台机器上复制过来的。但是,即使我通过“项目属性”中的“签名”选项卡添加新密钥,仍会显示此错误。

我尝试以管理员身份运行Visual Studio,并尝试手动将密钥添加到Windows证书存储区,但没有成功。

帮帮我吧!

编辑:对于一个新项目,我不会遇到这个错误,但我很想让这个现有项目正常工作。即使我创建一个新证书,它也无法工作!


6
你使用的是哪种类型的VS项目?你也在项目属性签名选项卡中取消了“签署ClickOnce清单”的勾选吗? - Simon Mourier
@Simon Mourier,如果我取消勾选该选项,则文件将不会被签名。我想要它被签名!这是一个C#项目。在我的主要开发机器上运行良好,但在笔记本电脑上却无法正常工作。 - Marcus
错误信息是在您的构建日志中显示还是以其他方式显示的?如果您复制并粘贴日志,可能会有所帮助。 - Owen Wengerd
1
构建日志中的错误:“在证书存储中找不到清单签名证书” - Marcus
我没有在被接受的答案中看到代码行。但是这对我有用:我在VS2015中创建了一个新的密钥。我取消了程序集签名并保存。然后我点击了“从文件选择”按钮,选择了刚刚创建的文件,再次点击了“程序集签名”,并保存。重新构建。 - Tim
12个回答

374

我终于找到了解决方案。

  1. 编辑相关项目的.csproj文件。

  2. 删除以下代码行:

    <PropertyGroup>
       <ManifestCertificateThumbprint>...........</ManifestCertificateThumbprint>
    </PropertyGroup>
    <PropertyGroup>
       <ManifestKeyFile>xxxxxxxx.pfx</ManifestKeyFile>
    </PropertyGroup>
    <PropertyGroup>
       <GenerateManifests>true</GenerateManifests>
    </PropertyGroup>
    <PropertyGroup>
       <SignManifests>false</SignManifests>
    </PropertyGroup>
    

1
也对我有用。这样做有什么注意事项吗? - Doctor Coder
1
是的,删除了所有带有“Manifest”的内容,它就可以工作了 :-) - s1cart3r
17
我不会不知道后果就去做这件事…… 然而还是做了 - barnacle.m
对我来说起作用了。不知道会有什么后果,但至少其中一个项目可以正常工作,这对我来说已经足够好了。 - Parrotmaster
这对于2022年的vbproj文件仍然有效! - user2728841
显示剩余5条评论

220

进入 Visual Studio 中项目的“属性”选项卡。然后进入“签名”选项卡。

确保未开启“对 ClickOnce 签名清单进行签名”选项。


更新说明:

在解决方案资源管理器中:

  1. 右键单击您的项目
  2. 单击属性
  3. 通常在左侧,选择“签名”选项卡
  4. 选中“对 ClickOnce 签名清单进行签名”复选框
  5. 记得保存!

输入图像描述


2
你说的没问题,应该可以运行,但实际上并没有。最终我不得不按照下面答案中提到的删除了那些代码行。 - Hamid Shahid
1
这是什么意思/这个操作是什么意思? - LazerSharks
1
这给了我 VS2010 的解决方案 :) 赞! - jace
1
好答案!我正在使用VS2012,它真的很有效!+1 - kiLLua
@HamidShahid,它没有起作用是因为您需要进行更改,然后保存。干杯。 - ADL
显示剩余3条评论

21

非常简单!!

我按照以下步骤解决了这个问题:

  1. 打开项目属性 img
  2. 点击签名选项卡
  3. 取消选中 "签署程序集"

就这样了!!


2
这可能会阻止发布(如果我们在意的话),但现在它可以运行。 - gbarry

15

试试这个:

右键单击您的项目 → 转到 属性 → 点击屏幕左侧的签名取消选中 签署 ClickOnce 文件清单 → 保存并构建


另外,可以在相关项目的.csproj文件中将SignManifest值设置为false。 - Jesse

13
  1. 在记事本中打开.csproj文件。
  2. 删除与证书存储中签名证书相关的以下信息

<PropertyGroup>
  <ManifestCertificateThumbprint>xxxxx xxxxxx</ManifestCertificateThumbprint>
  <ManifestKeyFile>xxxxxxxx.pfx</ManifestKeyFile>
<GenerateManifests>true</GenerateManifests>
<SignManifests>false</SignManifests>
</PropertyGroup>

6

前往Visual Studio中的项目“属性”,然后转到签名选项卡。

确保关闭“签署ClickOnce清单”选项。

或者

1.使用记事本打开.csproj文件。

2.删除与证书存储中签名证书相关的以下信息 xxxxx xxxxxx xxxxxxxx.pfx true false `

对我有用。


4
假设这是在你从其它系统复制项目时由Windows创建的个人证书,你可以在现在的项目所在系统上使用证书管理器并导入证书。启动证书管理器(certmgr),选择个人证书,然后在现有证书列表下方右键单击并选择导入任务。使用浏览按钮在项目文件夹(与项目文件夹同名的子目录)中查找.pfx文件。如果您使用的不是C#和VS环境,则.pfx可能在其他位置或此建议不适用。导入后,您应该会收到状态消息。如果成功导入,编译证书错误应该消失。certmgr screen

清晰简洁! - Guido Leenders

0

手动将密钥添加到Windows证书存储区是不够的。证书只包含已签名的公钥。您还必须导入与证书中公钥相关联的私钥。.pfx文件包含单个文件中的公钥和私钥。这就是您需要导入的内容。


谢谢,但我已经尝试过了。当您创建一个新的证书时,Visual Studio应该会自动添加它。然而,我也尝试手动添加.pfx文件。我留给Windows将其安装在正确的证书存储中,并将其添加到我的个人存储中。 - Marcus
私钥不存储在证书存储区。请阅读此文,或许能帮助您理解这一区别:http://technet.microsoft.com/zh-cn/library/cc962112.aspx - Owen Wengerd
1
我应该补充说明,您可以通过在证书管理器中打开证书属性窗口来验证相关私钥是否可用。如果私钥可用,则在常规页面底部显示以下文本:“您拥有与此证书对应的私钥”。如果您没有看到该文本,则表示未安装私钥。 - Owen Wengerd
是的,它确实说“您拥有与此证书对应的私钥”。 - Marcus
我认为这排除了密钥或证书的问题。 - Owen Wengerd

0

如果您只需要在本地构建项目或解决方案,那么像其他人建议的那样删除签名可能是一个非常简单的解决方案。

但是,如果您在自动化构建服务器(如TeamCity)上遇到此错误,该服务器用于构建实际发布的部署或分发件,则可能要考虑如何将此证书正确安装到构建机器上的证书存储中,以便在构建结束时获得已签名的软件包。

通常不建议将任何PFX证书提交到源代码控制中,因此如何在构建过程中获取这些文件是另一个问题,但有时人们确实将此文件与解决方案代码一起存储,因此您可以在项目文件夹中找到它。

您所需做的就是在构建服务器上的适当帐户下安装此证书即可。

  1. 下载Windows Sysinternals中的PsExec。

  2. 打开命令提示符,输入以下内容。它将生成一个新的命令提示符,作为本地系统运行(假设您的TeamCity正在默认的本地系统帐户下运行):

    > psexec.exe -i -s cmd.exe

  3. 在这个新的命令提示符中,切换到包含证书的目录,并输入要安装的文件名(将文件名更改为您自己的):

    > mykey.pfx

  4. 导入证书向导将启动。按照提示选择所有建议的默认值。

  5. 运行构建。

所有功劳归于Stuart Noble(然后我相信是进一步归于Laurent Kempé ☺)。


0

刚碰到这个问题(又一次),由于没有将PFX证书包含在代码中,导致安全性出现问题。

对于本地测试,例如Debug构建,此解决方案的主要程序员让我进入“属性”、“签名”,点击“创建测试证书”。在我们的设置中,他说只需单击确定,但如果有必要,可以在此处输入强密码。


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