无法导入密钥文件“blah.pfx” – 错误“密钥文件可能受密码保护”

我们刚刚将Visual Studio 2008项目升级到了Visual Studio 2010.我们所有的程序集都使用Verisign代码签名证书进行了强大的签名。 由于升级,我们不断得到以下错误:

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

这发生在一些开发者机器上,而不是其他的。 用于解决这个问题的一些方法在一些时候有效,包括:

  • 从Windows资源pipe理器重新安装密钥文件(右键单击PFX文件并单击安装)
  • 第一次在新的机器上安装Visual Studio 2010时,首次打开项目时会提示您input密码,然后运行。 在从Visual Studio 2008升级的计算机上,您不会获得此选项。

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

为什么会发生这种情况,有什么明确的措施来解决这个问题? 我即将放弃ClickOnce安装和Microsoft代码签名。

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

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

根据你的文章,看起来像

sn -i companyname.pfx VS_KEY_3E185446540E7F7A

这必须从PFX文件的位置运行,如果您已经在VS 2010中加载了解决scheme,您可以在解决scheme资源pipe理器中右键单击pfx文件并select打开命令提示符,该命令将启动.net 2010 cmd提示符工具正确的目录。

在运行这个sn命令之前,我已经通过右键点击安装了pfx,然后select安装,但是没有工作。 只是要注意,因为它可能是两个组合提供的解决scheme。

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

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

而不是更改密码(这会导致.pfx被更改),请从combobox中重新select .pfx文件。 这然后调用密码对话框。 input密码后,项目将生成OK。 每个开发人员都可以在本地机器上执行此操作,而无需实际修改.pfx文件。

我仍然有问题让我们的生成服务器上签名的程序集。 我遇到同样的错误,但是使用sn.exe -i方法不能解决buildserver的问题。

我有同样的问题,并删除商店和阅读没有工作。 我必须做到以下几点。

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

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

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

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

VSCommands 2010(Visual Studio插件)可以自动为您解决这个问题 – 只需右键单击错误,然后从菜单中单击应用修复。 你可以从Visual Studio库中获得它 。

我说话太快了! 重build带来了错误的重演

我发现这个工程 – 右键单击解决scheme资源pipe理器,并将其从项目中排除。 点击显示所有文件 ,右键单击,现在再次将其包含在项目中。 现在撤消挂起的更改…

出于某种原因,这为我整理出来,是相对无痛的!

在尝试了所有这些解决scheme(还有更多)之后,我发现问题在别的地方。 对于那些在购买证书后和我一样痛苦的人,我会分享解决问题的方法。

行为

我知道“符号”适用于DLL或EXE的强名称而不是真实代码。 这就是为什么signtool 在这种情况下工作,但在Visual Studio中的“签名”将不起作用。

原因

在过去,我有使用Verisign证书的经验。 它们在证书中具有KeySpec=2 ,与Visual Studio中的“符号”function一起使用。 这些证书适用于Visual Studio和signtool。

我现在从Comodo购买了在代码签名证书中有不正确的KeySpec=1的证书。 这意味着这些证书与signtool(authenticode)正常工作,但没有强命名(签名下拉)。

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

  1. 使用sn -k [name].snk为您的强名称创build一个单独的证书。 使用snk对程序集进行签名,然后使用signtool和代码签名证书对authenticator签名进行DLL / EXE签名。 虽然这看起来很奇怪,但据我所知,这是处理证书的正确方法,因为强名称与authenticode的用途不同(另请参阅此链接了解有关这些工作原理的详细信息)。
  2. 将您的证书导入为KeySpec=2 。 这里详细介绍了这个过程。

因为我想使用多个强名称,所以我使用选项(1),但选项(2)也适用。


为了确保这个解决scheme在将来永远不会丢失,这里是解决scheme2的过程:

  1. 使用“Certifiates”MMC将现有密钥集( KeySpec=1 )导出到PFX文件。 注意:请将此文件备份到安全的位置,并testing是否可以在另一台机器上导入文件,如果您真的想要安全地进行播放!
  2. 从encryption存储中删除现有的证书(使用MMC的stlll)。
  3. 打开一个CMD提示符。
  4. 使用以下命令导入PFX文件:
    1. certutil -importPFX -user <pfxfilename> AT_SIGNATURE
    2. 出现提示时inputpfx的密码。

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

我发现在某些情况下,您应该尝试删除此密钥, 然后再安装它。 所以做以下几点:

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

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

作为连接错误报告的原始作者,这个消息有两个变种(我后来发现)

对于一个变体,你可以使用sn.exe(通常如果你正在做强大的命名)将密钥导入强命名存储。

您使用certmgr导入的另一个变体是在您为一次性部署(请注意,您可以同时使用相同的证书)进行代码签名时。

希望这可以帮助。

作为解决方法,我尝试以pipe理员身份运行Visual Studio 2010,并为我工作。

我希望这有帮助。

没有为我工作,但后来我去看看证书经理(mmc.exe)。 证书没有在个人存储中导入,所以我手动导入,然后编译项目。

请参阅使用Visual Studio项目devise器签名页签署程序集的ClickOnce清单签名和强名称程序集签名

重新selectcombobox中的密钥文件并input密码对我们有帮助。

但每次密钥文件更改都需要做,看起来不太好。

我的问题是,TFS生成控制器作为networking服务运行,出于某种原因,我不明白为什么Visual Studio生成主机服务证书没有被使用。 我将Visual Studio Build服务的身份更改为更易于pipe理的方式,确保它拥有TFS服务器上的权限,并使用MMC手动添加证书。

问题还在于MSBuild无法将密码保护证书添加到商店。

将Windows安装移到SSD后,我遇到了同样的问题。 没有其他解决scheme为我工作。

我的解决scheme是在记事本中打开项目文件,并删除对PFX键的所有引用。 保存文件后,在Visual Studio中打开解决scheme。 转到项目 – >属性 – >签名。 您不应该看到“select强名称密钥文件”combobox中列出的任何键。 在combobox中,浏览到键,select它,现在可以构build您的项目。

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

打开这两个项目后,将粘贴复制到新项目。 转到项目属性,然后select生成。 我打开并closuresVisual Studio,并从新项目中删除之后构build它,然后从旧项目中复制并select它。 当我复制项目并试图构build项目时,我首先收到了这篇文章开头的错误。

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

这抛出了“无法导入”的错误:

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

将该值更改为false将导致错误消失。

我在“select强名密钥文件”下拉框中重新select了密钥(pfx)文件,然后在“请input密码”popup窗口中提供了密码。 保存我的项目,并做了rebuild.build成功。

  • 打开项目属性。
  • 点击签名部分。
  • 在“select强名密钥文件”的地方,从下拉框中重新select当前值:

在这里输入图像说明

  • Visual Studio现在将提示您input密码。 input它。

在这里输入图像说明

  • 保存你的项目并重build。

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

  • 点击“更改密码”button:

在这里输入图像说明

  • 在所有三个框中input原始密码,然后单击确定。 如果您想更改密码(或者您的旧密码不符合复杂性要求),现在就可以这样做了。

  • 保存你的项目并重build。

更多信息..

这里描述的所有方法都不能帮助我。 但是,当我从我的项目中删除* .pfx文件,并再次将其添加到程序集的签名,我没有任何错误build立我的项目! 我无法解释为什么。 但是它为我工作。

在我的scheme中,构build服务不是使用我使用sn.exe导入密钥的相同用户帐户。

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

我有一个类似的问题,但在“强名密钥文件”combobox中selectpfx并键入密码后,我仍然有一个类似的错误(没有容器名称部分):

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

此外,“签署ClickOnce清单”证书信息面板未填充。

我在pfx上做了“Select from File …”,解决了这个问题。

FYI

我使用带有-p标志的sn.exe作为创buildSNK文件的官方代码标记PFX文件(作为代码签名购买),并在Visual Studio 2013中使用SNK文件进行浏览。

  • 解决了密码问题。

但问题仍然在于:“密钥文件* SNK不包含公钥/私钥对”。

在这里输入图像说明