【问题标题】:Cannot import the keyfile 'blah.pfx' - error 'The keyfile may be password protected'无法导入密钥文件“blah.pfx” - 错误“密钥文件可能受密码保护”
【发布时间】:2011-02-18 09:52:54
【问题描述】:

我们刚刚将 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 代码签名。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      为谁使用 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 上的失败作业输出中建议容器名称(msbuild 输出)

      【讨论】:

        【解决方案3】:

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

        所以我重新开发了 C# 中的sn.exe -i <infile> <container> 命令使用RSACryptoServiceProvider。源代码和应用程​​序在 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>
        

        【讨论】:

          【解决方案4】:

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

          我终于意识到,在我的情况下,错误的原因是证书密码没有输入或输入错误。当我正确地动态输入密码时,错误消失了。成功

          【讨论】:

            【解决方案5】:

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

            双击 Package.appxmanifest

            转到包装标签

            点击选择证书

            点击配置证书

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

            【讨论】:

              【解决方案6】:

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

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

              【讨论】:

              • 这为我修好了!安装本身失败,对象已存在。
              • 我也试过了,但没有帮助。证书本身有问题吗?
              • 谢谢,必须以 admin 身份进行删除 -- 如果以普通用户身份运行,则会出现误导性错误“未找到强名称密钥容器”。
              【解决方案7】:

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

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

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

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

              【讨论】:

                【解决方案8】:

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

                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,但是这不起作用。只是需要注意一点,因为它可能是两者的结合提供了解决方案。

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

                【讨论】:

                • 感谢 Brandon - 是的,就像手动重新安装密钥文件“某种”一样可以解决问题。问题是,一旦您签入密钥文件,任何其他最新了解此签入密钥文件的用户现在都会遇到此错误。如果这些用户中的任何一个检查了他们的“修复”并且我得到了最新的,那么我的机器现在又坏了......等等。 Microsoft 已为此启动故障单并将其分配给 VS2010 团队和 VSS 团队。
                • 有趣。将 pfx 添加到新 CSP 时,我没有遇到这个问题。据我所知 SN -i 不会更改 pfx 文件,因此您以后不必检查任何内容。但是,如果您要更改 pfx 文件,例如重置密码,则会导致问题,因为它会更改 pfx 文件。您的解决方案是否使用来自任何其他机器的 pfx 文件构建?如果是这样,那么 pfx 文件是正确的,只是没有在您的存在构建问题的机器上设置为正确的 CSP。
                • 起初我只尝试了 sn -i 部分,但它抱怨密码不正确(尽管它是正确的)。我删除了证书,重新安装了它,然后 sn -i... 工作了。基本上确认对我来说,这两个步骤都是必需的。重新安装 cert 然后执行 sn 命令。
                • 我在 VSS 和 TFS 中都发现,如果您运行 sn -i 命令,除非您签出 PFX 文件,否则它将不起作用,并且当您签入它时不会为网络上的其他开发人员工作。我将不得不尝试重新安装证书,然后运行 ​​sn -i 命令。我们需要它在办公室的所有开发人员机器上工作。
                • 这对我也有用,但我过去从未这样做过。 VS 过去只是弹出并询问每个键的密码。发生了什么变化?
                【解决方案9】:

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

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

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

                • 保存您的项目并重新构建。

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

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

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

                • 保存您的项目并重新构建。

                More Info..

                【讨论】:

                • 这整个错误似乎完全是随机解决的,但这个解决方案对我有用。如果其他人在页面上如此落后,我只能建议尝试一切。
                【解决方案10】:

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

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

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

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

                【讨论】:

                • 通常对程序集进行签名是有目的的,在某些环境中删除 SignManifest 会导致部署问题。所以这不是解决问题的办法
                【解决方案11】:

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

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

                【讨论】:

                • 我遇到了同样的问题,阅读您的评论指出我已经从 Windows 7 升级到 Windows 10,现在需要以管理员身份运行 VS。所以以管理员身份运行 VS 并没有问题..感谢您的指点
                【解决方案12】:

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

                行为

                我了解“签名”将强名称而不是验证码应用于 DLL 或 EXE。这就是为什么 signtool 在这种情况下工作,但 Visual Studio 中的“签名”不起作用。

                原因

                过去,我曾使用威瑞信的证书。他们在证书中有一个KeySpec=2 - 它与 Visual Studio 中的“签名”功能一起使用。这些证书适用于 Visual Studio 和 signtool。

                我现在从 Comodo 购买了证书,其代码签名证书中的 KeySpec=1 不正确。这意味着这些证书适用于signtool(authenticode)但不适用于强命名(标志下拉菜单)。

                解决方案

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

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

                因为我想使用多个强名称,我目前使用选项 (1),虽然选项 (2) 也可以。


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

                1. 使用“证书”MMC 将现有密钥集 (KeySpec=1) 导出到 PFX 文件。注意:请将此文件备份到安全位置,如果您真的想安全播放,请测试该文件是否可以在另一台机器上正常导入!
                2. 从加密存储中删除现有证书(仍然使用 MMC)。
                3. 打开 CMD 提示符。
                4. 使用以下命令导入 PFX 文件:
                  1. certutil -importPFX -user &lt;pfxfilename&gt; AT_SIGNATURE
                  2. 出现提示时输入 pfx 的密码。

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

                【讨论】:

                • 您的 #2 解决方案是唯一对我有用的解决方案(不使用辅助命令行工具或进程)谢谢。
                • 是啊,我真的不明白为什么这里的一些解决方案有这么多票;这真的是唯一对我有用的东西,我很确定大多数购买 CS 证书的人应该有同样的问题。哦,好吧...
                • 这是唯一对我有用的解决方案。此外,.pfx 文件不能包含用于签署程序集的证书链信息。
                • 感谢您提供如此详细的说明。每一步都被精确描述。
                • 您的第一个解决方案对于理解这里至关重要:绝对不需要使用昂贵的密码保护证书对程序集进行强签名!一旦你理解了这一点,并且简单地使用一个 snk 文件,这个问题就完全消失了。见the warning note herehere
                【解决方案13】:

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

                【讨论】:

                • 如果不需要签名,这是一个完美的答案。它将消除对项目进行签名的需要。
                【解决方案14】:

                没有什么对我有用,但后来我查看了证书管理器 (mmc.exe)。证书没有在个人商店导入,所以我手动导入,然后编译项目。

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

                【讨论】:

                • 在执行 SN.exe -i 修复后,这也为我解决了这个问题。
                【解决方案15】:

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

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

                【讨论】:

                • 需要添加到哪个店铺??
                • 我也做了同样的事情(并且还把证书放在了这个用户 Personal/Trusted Root/Trusted Pub ..不确定哪个修复了它)并且能够转移到下一个 TFS 错误,我有冲突的工作空间,所以为了纠正我还必须删除并添加一个新的构建代理。
                【解决方案16】:

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

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

                出于某种原因,这为我解决了问题并且相对轻松!

                【讨论】:

                • 收回它,没有帮助。没有意识到它从项目设置中删除了 pfx。我认为答案在于 Stefan stackoverflow.com/a/14644793/1735721 的回答
                • 这个答案很棒。它对我有用,而且非常简单。
                • 为我工作(VS2017 15.7.4)。感谢您的快速解决方案。
                • 在 VS2019 16.1.3 上为我工作。谢谢!!
                【解决方案17】:

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

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

                【讨论】:

                  【解决方案18】:

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

                  我希望这会有所帮助。

                  【讨论】:

                  • 它由于某种原因停止工作。我不敢相信这实际上解决了这个问题。谢谢!!!
                  【解决方案19】:

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

                  【讨论】:

                    【解决方案20】:

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

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

                    【讨论】:

                      【解决方案21】:

                      我遇到了同样的问题,删除商店和阅读不起作用。我必须执行以下操作。

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

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

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

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

                      【讨论】:

                      【解决方案22】:

                      VSCommands 2010(Visual Studio 插件)可以自动为您修复此问题 - 只需右键单击错误,然后从菜单中单击 Apply Fix。你可以get it from Visual Studio gallery

                      【讨论】:

                      • 我相信这是专业版 - 在我的精简版中没有这个选项
                      • 我刚下载的版本(2011 年 9 月)带有这个选项。
                      • 它仍然需要专业许可证。
                      【解决方案23】:

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

                      但是每次修改key文件都需要做,好像不行。

                      【讨论】:

                        【解决方案24】:

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

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

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

                        【讨论】:

                        • 花了一段时间未能在我们的 TFS 构建服务器上运行它,意识到我是以自己身份登录的,而不是作为构建服务帐户,难怪它找不到它 - 哦!
                        • 这应该被标记为答案,因为当前标记的答案在多开发人员环境中不起作用。干得好。
                        • 如果您在一个解决方案中使用同一个 .pfx 文件对多个程序集/项目进行签名,您只需在一个项目上执行此步骤,它将适用于所有项目。效果很好。
                        • 我的问题是构建服务器在本地帐户下运行。我进入选项并进行了更改,但没有意识到我在错误的位置进行了更改 - 这导致我排查了几个小时,直到我再次检查并意识到我的错误!
                        • 非常感谢。遗憾的是,这在 2017 年仍然是一种解决方法。
                        【解决方案25】:

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

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

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

                        希望这会有所帮助。

                        【讨论】:

                        • 是的,我们在 Microsoft 支持下也尝试过,这就是代码签名导入的方式。问题确实似乎是证书密码在签入过程中丢失了源安全。但这看起来并不是真正的问题。如果您在 Widnows 7 机器 #1 上输入证书详细信息,然后将完全相同的文件移动到另一台机器并注册它,注册将起作用,但构建将失败。微软仍在为我们调查。目前,我们不得不在发布期间禁用代码签名并手动签名。
                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2013-02-12
                        • 2011-02-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2017-03-23
                        • 2019-12-19
                        • 1970-01-01
                        相关资源
                        最近更新 更多