“在证书存储区中找不到清单签名证书”-即使添加新密钥


153

我无法使用强名称键签名来构建项目-标题中的消息总是出现。

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

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

救命!

编辑:我没有在新项目中遇到此错误,但是我很想让这个现有项目正常工作。即使创建新证书也不起作用!


3
什么类型的VS项目?您是否还取消了“项目属性签名”选项卡上的“签署ClickOnce清单”?
西蒙·穆里尔

@Simon Mourier,如果我取消选中该选项,则该文件将不会被签名。我要签名!这是一个C#项目。在我的主要开发机器上可以正常工作,但不能在笔记本电脑上工作。
马库斯(Marcus)

错误消息显示在您的构建日志中,还是以其他方式显示?如果您复制并粘贴日志,则可能会有所帮助。
欧文·温格

构建日志中的错误:“在证书存储中找不到清单签名证书”
Marcus

我没有在接受的答案中看到任何代码行。但这对我有用:我在VS2015中创建了一个新密钥。我单击了“签署大会”并保存。然后,单击“从文件中选择”按钮,选择刚创建的文件,再次单击“对程序集进行签名”并保存。重建。
蒂姆(Tim)

Answers:


234

我终于找到了解决方案,并真的希望这也能对其他人有所帮助。

  1. 编辑该.csproj项目的文件。
  2. 删除以下代码行:

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

1
也为我工作。有什么需要注意的事情吗?
Coder医生

1
是的,用“清单”删除了所有内容,它起作用了:-)
s1cart3r

2
我不会在不知所措的情况下这样做…… 不管怎么说
barnacle.m

就我而言,删除ManifestCertificateThumbprintManifestKeyFile解决问题。
艾哈迈德·沙梅尔

为我工作。不知道这有什么影响,但其中至少有一个是一个有效的项目,对我来说已经足够了。
Parrotmaster

147

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

然后确保关闭“单击一次”清单的签名。


更新说明:

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

  1. 右键点击您的项目
  2. 点击属性
  3. 通常在左侧,选择“签名”标签
  4. 选中SignOnce清单中的标志
  5. 确保您保存!

在此处输入图片说明


2
您说的没问题,应该可以,但没有。最后,我不得不删除下面的答案中提到的代码行
Hamid Shahid

1
这是什么意思/什么意思?
LazerSharks '16

@TrailMix它将适当地修改您的配置文件。
ADL

1
这给了我vs2010的解决方案:)起来!
杰斯

1
好答案!我正在使用VS2012,它确实有效!+1
kiLLua '18


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

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

11

尝试以下操作:右键单击项目->转到属性 ->单击屏幕左侧的签名 -> 取消选中单击以显示一次签名 ->保存并构建


6

在Visual Studio中转到项目“属性”。然后转到签名选项卡。

然后确保关闭“单击一次”清单的签名。

要么

1.在记事本中打开.csproj文件。

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

为我工作。


3

假设这是从您复制项目的系统上的Windows创建的个人证书,则可以在项目所在的系统上使用证书管理器并导入证书。启动证书管理器(certmgr),选择个人证书,然后右键单击现有证书列表下方,然后从任务中选择导入。使用浏览器在项目中找到.pfx(与项目一起复制的先前系统中的.pfx)。它应该位于与项目目录同名的子目录中。我对C#和VS很熟悉,因此,如果不是您的环境,则.pfx可能在其他位置,或者该建议不适用。导入后,您将收到一条状态消息。如果成功,则应该消除编译证书错误。certmgr屏幕


简洁明了!
Guido Leenders

0

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


谢谢,但是已经尝试过了。无论如何,Visual Studio应该在创建新证书时自动添加证书。但是我也尝试过手动添加.pfx文件。左窗口可将其安装在正确的证书存储中,并将其添加到我的个人存储中。
马库斯(Marcus)2012年

私钥未存储在证书存储区中。请阅读以下内容,也许它将有助于您理解区别:technet.microsoft.com/zh-cn/library/cc962112.aspx
Owen Wengerd 2012年

我应该补充一点,您可以通过在证书管理器中打开证书属性窗口来验证关联的私钥是否可用。如果私钥可用,则“常规”页面底部显示以下文本:“您具有与此证书对应的私钥”。如果看不到该文本,则说明未安装私钥。
欧文·温格

是的,它确实说“您具有与此证书对应的私钥”。
马库斯(Marcus)2012年

我认为排除了密钥或证书是问题所在。
欧文·温格

0

您说您从另一台计算机复制了文件。复制它们后,是否“取消阻止”它们?具体来说,应检查.snk文件以确保未将其标记为不安全。


它没有被阻止,它来自Windows Live Mesh同步软件。但是,这是无关紧要的,因为即使在笔记本电脑上的Visual Studio中创建新密钥也不起作用。
马库斯(Marcus)

0

使用属性以强名签名程序集

打开AssemblyInfo.cs(在中$(SolutionDir)\Properties

AssemblyKeyFileAttributeAssemblyKeyNameAttribute,指定具有强名称签署组件当包含密钥对使用该文件或容器的名称。

添加以下代码:

[assembly:AssemblyKeyFileAttribute("keyfile.snk")]

添加此行没有区别,我仍然遇到相同的错误。
马库斯(Marcus)2012年

0

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

但是,如果在像TeamCity这样的自动化构建服务器上生成此错误,在该服务器上构建实际的发行版以进行部署或分发,则可能需要考虑如何将该证书正确安装到构建计算机上的证书存储中,以便获得构建结束时签名的软件包。

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

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

  1. 从Windows Sysinternals下载PsExec

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

    > psexec.exe -i -s cmd.exe

  3. 在此新命令提示符下,转到包含证书的目录,然后输入要安装的文件名(将文件名更改为您的文件名):

    > mykey.pfx

  4. 导入证书向导将启动。单击并选择所有建议的默认值。

  5. 运行构建。

所有学分都归功于Stuart Noble(我相信☺ 再归功于LaurentKempé)。

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.