关于visual studio 2010:无法导入密钥文件’blah.pfx’ – 错误’密钥文件可能受密码保护’

Cannot import the keyfile 'blah.pfx' - error 'The keyfile may be password protected'

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

0

这发生在一些开发人员机器上,而不是其他机器上。在某些情况下,用于解决此问题的一些方法包括:

  • 从Windows资源管理器重新安装密钥文件(右键单击pfx文件并单击"安装")。
  • 第一次在新机器上安装Visual Studio 2010时,在第一次打开项目时会提示您输入密码,然后密码就会生效。在从Visual Studio 2008升级的计算机上,您无法获得此选项。

我尝试使用sn.exe实用程序(强名称工具)按照错误消息的提示,用强名称csp注册密钥,但每当我使用Visual Studio 2010附带的任何选项运行该工具时,sn.exe只列出其命令行参数,而不执行任何操作。不管我提供什么论据,这都会发生。

为什么会发生这种情况,解决它的明确步骤是什么?我将放弃ClickOnce安装和Microsoft代码签名。


我也遇到了这个问题。我可以通过运行
sn -i 来解决这个问题(将密钥对安装到一个命名的容器中)。

sn通常作为WindowsSDK的一部分安装。例如C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin
ETFX 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),而是从组合框中重新选择.pfx文件。然后调用密码对话框。输入密码后,项目将生成OK。每个开发人员都可以在本地计算机上执行此操作,而无需实际修改.pfx文件。

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


我也有同样的问题,删除商店和阅读没有起作用。我必须做以下的事情。

  • 获取OpenSSL的副本。它适用于Windows。或者使用Linux设备,因为它们几乎都有。

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

    1
    2
    3
    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库中获取。


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

  • sn -d VS_XXXX
  • sn -i mykey.pfx VS_XXX

  • 在尝试了所有这些解决方案(以及更多)之后,我发现问题就在其他地方。对于那些在购买证书后和我一样痛苦的人,我将分享我的问题的解决方案。

    行为

    我理解"sign"对dll或exe应用强名称而不是验证码。这就是为什么signtool在这种情况下可以工作,但Visual Studio中的"sign"将不起作用。

    原因

    在过去,我有过来自Verisign的证书。它们在证书中有一个KeySpec=2,与Visual Studio中的"符号"功能一起使用。这些证书对Visual Studio和Signtool都有效。

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

    解决方案

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

  • 使用sn -k [name].snk为您的强名称创建一个单独的证书。使用snk对程序集进行签名,然后在代码签名证书中使用signtool对dll/exe进行验证码签名。虽然这看起来很奇怪,但据我所知,这是处理证书的正确方法,因为强名称的用途与验证码不同(有关如何工作的详细信息,请参阅此链接)。
  • KeySpec=2的身份导入您的证书。这里详细介绍了这个过程。
  • 因为我想使用多个强名称,所以我目前使用选项(1),尽管选项(2)也可以。

    为了确保这个解决方案在将来不会丢失,下面是解决方案2的过程:

  • 使用"certifites"mmc将现有密钥集(KeySpec=1导出到pfx文件。注意:请将此文件备份到安全位置,并测试是否可以在另一台计算机上导入该文件,如果您真的想安全地运行它!
  • 从加密存储中删除现有证书(stll使用mmc)。
  • 打开命令提示。
  • 使用以下命令导入pfx文件:
  • certutil -importPFX -user AT_SIGNATURE
  • 提示时输入pfx的密码。
  • 您现在应该拥有一个带有KeySpec=2的密钥集/证书。如果需要,现在可以再次使用mmc将其导出到另一个pfx文件中。


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


    我在"选择强名称密钥文件"下拉框中重新选择了密钥(pfx)文件,然后在"输入密码"弹出窗口中提供了密码。已保存我的项目并已重建。生成成功。

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

    enter image description here

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

    enter image description here

    • 保存项目并重新生成。

    • 如果获取错误消息:"试图引用不存在的令牌",请忽略它并继续以下步骤

    • 单击"更改密码"按钮:

    enter image description here

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

    • 保存项目并重新生成。

    更多信息…


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

    我希望这有帮助。


    作为Connect Bug报告的原作者,此消息有两种变体(我稍后发现)

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

    使用certmgr导入的另一个变体是,当您为类似click-once部署的事情进行代码签名时(注意,您可以为这两个目的使用相同的cert)。

    希望这有帮助。


    没有什么对我有用,但是我去查看证书管理器(mmc.exe)。证书没有在个人存储中导入,因此我手动导入,然后编译项目。

    请参见使用Visual Studio项目设计器的签名页对程序集进行签名的ClickOnce清单签名和强名称程序集签名。


    在将Windows安装移动到SSD后,我遇到了同样的问题。其他的解决方案对我都不起作用。

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


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

    但每次密钥文件更改时都需要这样做,这似乎不正常。


    我的问题是TFS生成控制器作为网络服务运行,出于某种原因,我不理解为什么不使用Visual Studio生成主机服务证书。我将Visual Studio生成服务的标识更改为更易于管理的内容,确保它在TFS服务器上具有权限,并使用mmc手动添加证书。

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


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

    双击package.appxmanifest

    转到"打包"选项卡

    单击"选择证书"

    单击配置证书

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


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

    打开两个项目后,复制粘贴到新项目。转到"项目属性"并选择"生成"。我打开并关闭了Visual Studio,也在从新项目中移除之后创建了它,然后从旧项目中复制并选择它。当我复制这个项目并尝试构建它时,我在本文开头收到了这个错误。


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


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

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


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

    0

    此外,没有填充"签署ClickOnce清单"证书信息面板。

    我在pfx上做了"从文件中选择…",它解决了这个问题。


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

    这引发了"无法导入"错误:

    1
    2
    3
    <PropertyGroup>
    <SignManifests>true</SignManifests>
    </PropertyGroup>

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


    供参考

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

    • 解决了密码问题。

    但问题仍然在于它一直在说:"密钥文件*.snk不包含公钥/私钥对。"

    enter image description here