无法导入密钥文件'blah.pfx'-错误'密钥文件可能受密码保护'


392

我们刚刚将Visual Studio 2008项目升级到了Visual Studio2010。我们所有的程序集均使用Verisign进行了强签名代码签名证书签名。自升级以来,我们不断收到以下错误:

无法导入以下密钥文件:companyname.pfx。密钥文件可能受密码保护。若要更正此问题,请尝试再次导入证书或使用以下密钥容器名称将证书手动安装到“强名称” CSP:VS_KEY_3E185446540E7F7A

这发生在某些开发人员机器上,而不是其他人。有时可以解决该问题的一些方法包括:

  • 从Windows资源管理器中重新安装密钥文件(右键单击PFX文件,然后单击“安装”)
  • 首次在新计算机上安装Visual Studio 2010会在您第一次打开项目时提示您输入密码,然后它会起作用。在从Visual Studio 2008升级的计算机上,没有此选项。

我尝试使用SN.EXE实用程序(强名称工具)按照错误消息的提示向强名称CSP注册密钥,但是每当我使用Visual Studio 2010 SN附带的版本运行带有任何选项的工具时, .EXE仅列出其命令行参数,而不执行任何操作。无论我提供什么参数,都会发生这种情况。

为什么会发生这种情况?有哪些明确的步骤可以解决此问题?我将放弃ClickOnce安装和Microsoft代码签名。

Answers:


447

我也遇到了这个问题。我能够通过运行来解决问题
sn -i <KeyFile> <ContainerName>将密钥对安装到命名容器中)。

sn通常作为Windows SDK的一部分安装。例如C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe。此位置很可能不在标准环境的搜索路径中。但是,Visual Studio安装的“开发人员命令提示符”添加了通常包含正确位置的其他信息。

根据您的帖子,看起来像

sn -i companyname.pfx VS_KEY_3E185446540E7F7A

这必须从PFX文件的位置运行,如果您在VS 2010中加载了解决方案,则只需在解决方案资源管理器中右键单击pfx文件,然后选择“打开命令提示符”,这将在其中启动.net 2010 cmd提示工具。正确的目录。

在运行此sn命令之前,我确实通过右键单击pfx并选择install重新安装了pfx,但是该方法不起作用。只是要注意一点,因为这可能是提供解决方案的两者的结合。

希望这有助于解决您的问题。


5
谢谢布兰登-是的,就像手动重新安装密钥文件“ sort of”可以解决问题一样。问题是,一旦您签入密钥文件,任何其他对此签入密钥文件有最新了解的用户现在都将遇到此错误。如果这些用户中的任何一个签入了他们的“修复程序”,并且我得到了最新信息,则我的机器现在又坏了……等等。Microsoft已为此启动了故障凭单,并将其分配给VS2010团队和VSS团队。
JasonD

2
有趣。将pfx添加到新的CSP时,我没有遇到这个问题。据我所知,SN -i不会更改pfx文件,因此您以后不必检查任何内容。但是,如果您要以任何方式更改pfx文件(例如重置密码),都会引起问题,因为它将更改pfx文件。您的解决方案是否使用其他任何计算机上的pfx文件构建?如果是这样,则pfx文件是正确的,只是在存在构建问题的计算机上未将其设置为正确的CSP。
布兰登·曼彻斯特

3
最初,我只尝试了sn -i部分,但是它抱怨密码不正确(尽管它是正确的)。我删除了证书,重新安装了它,然后sn -i ...起作用了。基本上确认对我来说,这两个步骤都是必需的。重新安装证书,然后执行sn命令。
Dodgyrabbit

1
我在VSS和TFS中都发现,如果您运行sn -i命令,除非您签出了PFX文件,否则它将不起作用;而当您将其签入时,它对于网络上的其他开发人员将不起作用。我必须尝试重新安装证书,然后运行sn -i命令。我们需要它在办公室的所有开发人员机器上工作。
JasonD

5
这对我也很有效,但是过去我从来不需要这样做。VS过去只是弹出窗口,要求输入每个密钥的密码。有什么变化?
凯文·贝里奇

126

我发现了一个修复程序,可以帮助您在多开发人员环境中成功构建:

而不是更改密码(这将导致.pfx更改),而是从组合框中重新选择 .pfx文件。然后,这将调用密码对话框。输入密码后,项目将建立确定。每个开发人员都可以在本地计算机上执行此操作,而无需实际修改.pfx文件。

我仍然无法在我们的构建服务器上对程序集进行签名。我在那里遇到相同的错误,但是使用sn.exe -i方法不能解决构建服务器的问题。


5
花了一段时间也无法在我们的TFS构建服务器上使用它,意识到我是以我自己的身份登录的,而不是以构建服务帐户的身份登录的,难怪它找不到它-哎呀!
Daniel Morritt 2012年

7
应该将其标记为答案,因为当前标记的答案在多开发人员环境中不起作用。做得好。
丹尼尔·麦奎斯特

如果您使用同一个.pfx文件在一个解决方案中对多个程序集/项目进行签名,则只需对一个项目执行此步骤,它将应用于所有这些程序集/项目。效果很好。
乔恩·科托伊斯

1
我的问题是构建服务器在本地帐户下运行。我进入了选项并进行了更改,但没有意识到我在错误的位置进行了更改-这导致我要花几个小时进行故障排除,直到再次检查并意识到我的错误!
松饼人

3
非常感谢。遗憾地看到这仍然是在2017年,虽然解决方法。
比利·杰克·奥康纳

43

我遇到了同样的问题,删除商店后无法正常阅读。我必须执行以下操作。

  • 获取OpenSSL的副本。它可用于Windows。或者使用Linux机器,因为他们几乎都拥有它。

  • 运行以下命令以导出到密钥文件:

    openssl pkcs12 -in certfile.pfx -out backupcertfile.key
    
    openssl pkcs12 -export -out certfiletosignwith.pfx -keysig -in backupcertfile.key
    

然后,在项目属性中,您可以使用PFX文件。


1
谢谢!!我认为这对我有用。我在这里抓住了OpenSSL:已gnuwin32.sourceforge.net/packages/openssl.htm
aherrick

我想添加选项以在pfx中包括实际的证书:openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt -keysig -keyex
Pete

确保以管理员身份运行openssl,否则您将收到错误“无法写入'随机状态'”。另外:在执行openssl之后,我仍然必须用“ sn -i ...”做布兰登·曼彻斯特的回答。事情。
李·理查森


这是唯一的解决方案,最终使我成功了。谢谢!
拉迪斯拉夫

37

我讲得太早了!重建使错误重新发挥作用...

我发现这可行-在解决方案资源管理器中右键单击并将其从项目中排除。单击显示所有文件,右键单击,然后将其再次包含在项目中。现在撤销待定更改...

由于某种原因,这为我解决了问题,并且相对没有痛苦!


Takin'回来,没有帮助。没意识到它从项目设置中删除了pfx。我认为答案就在于Stefan stackoverflow.com/a/14644793/1735721
DennisWelu,2014年

这个答案很好。它对我有用,而且非常简单。
本·鲁宾

为我工作(VS2017 15.7.4)。感谢您提供的便捷解决方案。
会议

在VS2019 16.1.3上为我工作。谢谢!!
JordanTDN

35

我发现,在某些情况下,你应该尝试删除此键之前你安装它。因此,请执行以下操作:

  1. sn -d VS_XXXX
  2. sn -i mykey.pfx VS_XXX

1
这为我解决了!本身安装失败,对象已存在。
安迪

我也尝试过,但没有帮助。证书本身有问题吗?
托马什Zato -恢复莫妮卡

2
谢谢,必须以admin身份执行删除操作-如果以普通用户身份运行会出现误导性错误“未找到强名称密钥容器”。
astrowalker

谢谢它为我工作。
Rikin Patel


27

在尝试了所有这些解决方案(以及更多解决方案)之后,我发现问题出在其他地方。对于在购买证书后遭受与我同样痛苦的人们,我将分享解决我的问题的方法。

行为

我知道,“符号”对DLL或EXE应用强名而不是Authenticode。这就是为什么signtool 在这种情况下可以工作,但Visual Studio中的“ sign”不起作用的原因。

原因

过去,我曾使用过Verisign的证书。他们有个KeySpec=2在证书中 -与Visual Studio中的“签名”功能一起使用。这些证书对于Visual Studio和signtool都可以正常工作。

我现在从Comodo购买了证书,这些KeySpec=1证书的代码签名证书不正确。这意味着这些证书可以与signtool(身份验证代码)一起正常使用,但不能与强命名(符号下拉列表)一起使用。

有两种方法可以解决此问题:

  1. 使用为您的强名创建单独的证书sn -k [name].snk。使用snk对程序集进行签名,然后将signtool与代码签名证书一起使用,以对Authenticode签名进行DLL / EXE签名。尽管这看起来很奇怪,但据我了解,这是处理证书的正确方法,因为强名称的用途与authenticode的用途不同(有关功能的详细信息,请参见此链接)。
  2. 将证书导入为KeySpec=2。有关此过程的详细信息,请参见此处

因为我想使用多个强名称,所以我现在使用选项(1),尽管选项(2)也可以。


为确保此解决方案将来不会丢失,这是解决方案2的过程:

  1. 使用“证书” MMC,将现有密钥集(KeySpec=1)导出到PFX文件。注意:请将此文件备份到一个安全的位置,如果您确实希望安全播放该文件,请测试该文件是否可以在其他计算机上正常导入!
  2. 从加密存储中删除现有证书(使用MMC的stlll)。
  3. 打开CMD提示。
  4. 使用以下命令导入PFX文件:
    1. certutil -importPFX -user <pfxfilename> AT_SIGNATURE
    2. 提示时输入pfx的密码。

您现在应该具有的密钥集/证书KeySpec=2。如果需要,您现在可以再次使用MMC将其导出到另一个PFX文件中。


您的#2解决方案是唯一对我有用的方法(无需使用辅助命令行工具或过程)谢谢。
布朗·戴维斯

1
是的,我真的不明白为什么这里的某些解决方案有这么多的选票。这确实是唯一对我有用的方法,而且我敢肯定,大多数购买CS证书的人都应该遇到同样的问题。噢...
atlaste 2014年

1
这是唯一为我工作的解决方案。此外,.pfx文件不能包含用于签名程序集的证书链接信息。
Suh-Wen Su

感谢您提供如此详细的说明。每一步都被准确地描述。
德米特里(Dmitriy)

1
您的第一种解决方案对于在这里理解至关重要:绝对不需要使用昂贵的受密码保护的证书对签名进行强签名!一旦理解了这一点,只需使用snk文件,该问题就完全消失了。请在此处此处查看警告说明
保罗

11

要在Visual Studio 2012中解决此问题,我右键单击项目,属性->“签名”,然后取消选中“签署ClickOnce清单”。


2
如果不需要签名,这是一个完美的答案。这将消除对项目进行签名的需要。
汤姆·安德森

8

我在“选择强名称密钥文件”下拉框中重新选择了Key(pfx)文件,然后在“输入密码”弹出窗口中提供了密码。保存了我的项目,并且rebuild.build成功。

  • 打开项目属性。
  • 单击签名部分。
  • 在显示“选择强名称密钥文件:”的位置,从下拉框中重新选择当前值:

在此处输入图片说明

  • 现在,Visual Studio会提示您输入密码。输入它。

在此处输入图片说明

  • 保存您的项目并进行重建。

  • 如果收到错误消息:“尝试引用不存在的令牌”,则忽略它并继续以下步骤

  • 点击“更改密码”按钮:

在此处输入图片说明

  • 在所有三个框中输入原始密码,然后单击“确定”。如果您想更改密码(或者您的旧密码不符合复杂性要求),则可以立即进行。

  • 保存您的项目并进行重建。

更多信息..


3
解决这整个错误似乎完全是随机的,但是这种解决方案对我有用。如果其他人对此没有帮助,我只能建议尝试一切。
DeusExMachina25 2015年

6

解决方法是,我尝试以管理员身份运行Visual Studio 2010,并且对我有用。

我希望这有帮助。


由于某种原因,它停止了工作。我不敢相信这实际上解决了问题。谢谢!!!
Gerhard Powell

4

作为解决连接错误报告的原始作者,此消息有两种变体(我稍后会发现)

对于一种变体,可以使用sn.exe(通常在进行强命名的情况下)将密钥导入到强命名存储中。

使用certmgr导入的另一个变体是对一次单击部署之类的代码进行签名时(请注意,您可以将相同的证书用于这两个目的)。

希望这可以帮助。


是的,我们也在Microsoft支持下尝试了该方法,这就是进行代码签名导入的方式。问题实际上似乎是证书密码在签入过程源安全期间丢失了。但这似乎不是真正的问题。它看起来是否在Widnows 7计算机#1上输入了证书详细信息,然后将该完全相同的文件移动到另一台计算机上并进行了注册,注册将起作用,但是构建将失败。微软仍在为我们研究它。目前,我们必须禁用代码签名,并在发布期间手动签名。
JasonD 2010年


2

在组合框中重新选择密钥文件并输入密码可以帮助我们。

但是每次密钥文件更改时都需要执行此操作,这似乎不太正常。


2

将Windows安装移至SSD后,我遇到了同样的问题。没有其他解决方案对我有用。

我的解决方案是在记事本中打开项目文件,并删除所有对PFX键的引用。保存文件后,在Visual Studio中打开解决方案。转到项目->属性->签名。您不会在“选择强名称密钥文件”组合框中看到任何密钥。在组合框中,浏览到该键,选择它,现在可以构建您的项目。


2

我的问题是TFS Build Controller作为网络服务运行,由于某种原因,我不明白为什么未使用Visual Studio Build Host服务证书。我将Visual Studio Build服务的身份更改为更易于管理的名称,确保它在TFS服务器上具有权限,并使用MMC手动添加了证书。

问题还在于,MSBuild无法将受密码保护的证书添加到存储中。


您需要将其添加到哪个商店?
felickz 2012年

我做了同样的事情(并且还将证书放入了该用户的Personal / Trusted Root / Trusted Pub ..不确定是哪一个修复了它),并且能够移至下一个TFS错误,即我的工作空间冲突,因此要纠正我的问题删除并添加新的构建代理。
felickz 2012年

2

我遇到了类似的问题,但是在“强名称密钥文件” ComboBox中选择pfx并输入密码后,我仍然遇到类似的错误(没有容器名称部分):

无法导入以下密钥文件:companyname.pfx。密钥文件可能受密码保护。若要更正此问题,请尝试再次导入证书或手动安装证书

另外,“签名ClickOnce清单”证书信息面板也没有填充。

我在pfx上执行了“从文件中选择...”,它解决了问题。


1

此处描述的所有方法均无济于事。但是,当我从项目中删除* .pfx文件并将其再次添加到程序集的签名中时,我的构建项目没有任何错误!我无法解释原因。但这对我有用。


1

好的,这对我有用。在Visual Studio 2010中以管理员身份打开旧的解决方案/项目,然后打开新的或复制的解决方案/项目。以管理员身份,在新的Visual Studio 2010解决方案/项目中删除复制的pfk文件,然后转到项目属性并取消选择它。

打开两个项目,将粘贴复制到新项目。转到项目属性,然后选择生成。我打开和关闭了Visual Studio,并且在从新项目中删除它之后,还在从旧项目中复制并选择它之前将其构建。复制项目并尝试构建该项目时,我在这篇文章的开头就收到了错误消息。


1

在我的场景中,构建服务使用的用户帐户与我使用导入密钥的用户帐户不同 sn.exe

将帐户更改为我的管理员帐户后,一切正常。


我遇到了同样的问题,阅读您的评论后,我意识到我已经从Windows 7升级到Windows 10,现在VS需要以Admin身份运行。因此,以管理员身份运行VS并没有问题
。.感谢

1

这解决了我的问题:打开VS项目

双击Package.appxmanifest

转到包装标签

点击选择证书

点击配置证书

从文件中选择并使用example.pfx统一或任何其他创建的文件


0

我通过更改Visual Studio项目的.csproj文件中的以下行为自己解决了此问题:

这引发了“无法导入”错误:

<PropertyGroup>
<SignManifests>true</SignManifests>
</PropertyGroup>

将值更改为false会使错误消失。


7
通常,程序集是出于签名目的而签名的,删除SignManifests会在某些环境中引起部署方面的麻烦。因此,这不是解决问题的方法
Georgy Smirnov

0

我遇到了同样的错误。就我而言,我尝试了以上所有方法,但无法获得结果。

我终于意识到,就我而言,该错误的原因是未输入证书密码或输入的密码错误。当我正确动态输入密码后,错误消失了。成功的


0

不幸的是,这里没有提到的方法对我有用。我必须在docker容器中注册几个PFX,并且需要通过命令行传递密码。

因此,我sn.exe -i <infile> <container>使用RSACryptoServiceProvider在C#中重新开发了该 命令。源代码和应用程​​序位于SnInstallPfx项目的GitHub上。

SnInstallPfx应用程序接受一个PFX密钥和密码。它自动(从MSBuild源代码中借用)计算密钥容器名称(VS_KEY_ *),并将其安装到强名称CSP。

用法:

SnInstallPfx.exe <pfx_infile> <pfx_password>
// or pass a container name if the default is not what you need (e.g. C++)
SnInstallPfx.exe <pfx_infile> <pfx_password> <container_name>

0

为谁使用GitLab跑步者:

  • 确保使用您可以登录的帐户运行亚军:(./gitlab-runner.exe install --user ".\ENTER-YOUR-USERNAME" --password "ENTER-YOUR-PASSWORD"我必须先停止并卸载)
  • 遵循本指南,授予构建用户作为服务登录的权限
  • 用这样的构建用户登录
  • 使用其他答案中建议的命令: sn -i certificate.pfx VS_KEY_C***6

在GitLab上失败的Job输出中建议使用容器名称(msbuild输出) 在此处输入图片说明

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.