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

时间:2010-05-12 00:29:24

标签: visual-studio-2010 visual-studio passwords pfx

我们刚刚将Visual Studio 2008项目升级到Visual Studio 2010.我们使用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代码签名。

26 个答案:

答案 0 :(得分:434)

我也遇到了这个问题。 我能够通过运行
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安装的“Developer Command Prompt”会添加通常包含正确位置的其他信息。

根据您的帖子看起来像

<强> sn -i companyname.pfx VS_KEY_3E185446540E7F7A

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

在运行此sn命令之前,我通过右键单击它并选择安装来重新安装pfx,但这不起作用。需要注意的是,它可能是提供解决方案的两者的组合。

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

答案 1 :(得分:121)

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

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

我仍然无法在我们的构建服务器计算机上签署程序集。我在那里得到了同样的错误,但是使用sn.exe -i方法并不能解决构建服务器的问题。

答案 2 :(得分:40)

我遇到了同样的问题并删除了商店并且阅读无效。我不得不做以下事情。

  • 获取OpenSSL的副本。它是available for Windows。或者使用Linux盒子,因为他们几乎都拥有它。

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

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

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

答案 3 :(得分:33)

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

我发现这有效 - 右键单击​​Solution Explorer并将其从项目中排除。单击显示所有文件,右键单击,然后再次将其包含在项目中。现在撤消挂起的更改......

出于某种原因,这对我来说是彻头彻尾的,并且相对无痛!

答案 4 :(得分:31)

VSCommands 2010(Visual Studio插件)可以自动为您解决此问题 - 只需右键单击错误,然后单击菜单中的“应用修复”。你可以get it from Visual Studio gallery

答案 5 :(得分:28)

我发现在某些情况下,您应该尝试删除这个密钥,然后再安装。请执行以下操作:

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

答案 6 :(得分:26)

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

<强>行为

我理解'sign'对DLL或EXE应用强名称而不是authenticode。这就是为什么signtool 在这种情况下工作,但Visual Studio中的“sign”将无效。

<强>原因

过去我有过Verisign证书的经验。它们在证书中有KeySpec=2 - 与Visual Studio中的“签名”功能一起使用。这些证书适用于Visual Studio和signtool。

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

<强>解决方案

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

  1. 使用sn -k [name].snk为您的强名称创建单独的证书。使用snk对程序集进行签名,然后使用带有代码签名证书的signtool,使用authenticode签名对DLL / EXE进行签名。虽然这看起来很奇怪,但根据我的理解,这是处理证书的正确方法,因为强名称的目的与authenticode不同(另请参阅this link了解其工作原理的详细信息。)
  2. 将您的证书导入为KeySpec=2。这个过程是detailed here
  3. 因为我想使用多个强名称,所以我目前使用选项(1),尽管选项(2)也有效。


    为了确保此解决方案永远不会丢失,以下是解决方案2的过程:

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

答案 7 :(得分:9)

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

答案 8 :(得分:7)

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

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

enter image description here

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

enter image description here

  • 保存项目并进行重建。

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

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

enter image description here

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

  • 保存项目并进行重建。

More Info..

答案 9 :(得分:5)

作为一种解决方法,我尝试以管理员身份运行Visual Studio 2010,它对我有用。

我希望这会有所帮助。

答案 10 :(得分:4)

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

对于一个变体,您可以使用sn.exe(通常是在执行强命名时)将密钥导入强命名存储区。

您使用certmgr导入的另一个变体是当您为单击一次部署(例如,您可以为两个目的使用相同的证书)进行代码签名时。

希望这有帮助。

答案 11 :(得分:3)

没有什么对我有用,但后来我去了证书经理(mmc.exe)。证书未导入个人存储区,因此我手动导入证书,然后编译项目。

请参阅 ClickOnce Manifest Signing and Strong-Name Assembly Signing Using Visual Studio Project Designer's Signing Page, Signing Assemblies

答案 12 :(得分:2)

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

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

答案 13 :(得分:2)

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

但每次密钥文件发生变化时都需要这样做,而且看起来不行。

答案 14 :(得分:2)

将Windows安装移至SSD后,我遇到了同样的问题。其他解决方案都不适合我。

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

答案 15 :(得分:1)

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

  

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

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

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

答案 16 :(得分:1)

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

答案 17 :(得分:1)

在我的方案中,构建服务未使用我使用sn.exe导入密钥的同一用户帐户。

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

答案 18 :(得分:1)

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

打开两个项目后,将粘贴复制到新项目。转到项目属性,然后选择“构建”。我打开并关闭Visual Studio,并在从新项目中删除之后构建它,然后从旧项目中复制并选择它。当我复制项目并尝试构建它时,我在第一篇文章的开头就收到了错误。

答案 19 :(得分:1)

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

双击Package.appxmanifest

转到“打包”标签

点击选择证书

单击“配置证书”

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

答案 20 :(得分:0)

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

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

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

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

答案 21 :(得分:0)

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

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

答案 22 :(得分:0)

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

所以我重新开发了 使用RSACryptoServiceProvider在C#中使用sn.exe -i <infile> <container>命令。源和应用程序在GitHub中,位于 SnInstallPfx项目。

SnInstallPfx应用程序接受PFX密钥及其密码。它会自动计算密钥容器名称(VS_KEY _ *)(从MSBuild源代码中借用)并将其安装到强名称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>

答案 23 :(得分:0)

谁在使用GitLab运行程序:

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

在GitLab上失败的Job输出中建议使用容器名称(msbuild输出) enter image description here

答案 24 :(得分:0)

在 Visual Studio 2019 和 .Net 5 项目中,对我来说解决这个问题的方法是从我的解决方案中排除 .pfx 文件,它立即起作用。

答案 25 :(得分:-4)

仅供参考

我使用带有-p标志的sn.exe到官方代码签名PFX文件(作为代码签名购买),如下所示创建SNK文件,Visual Studio 2013 SNK {{1}}浏览了文件以供使用。

  • 解决了密码问题。

但问题仍然是它一直说:“密钥文件* .. SNK不包含公钥/私钥对。”

enter image description here