ChatGPT解决这个技术问题 Extra ChatGPT

无法导入密钥文件“blah.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 代码签名。


H
Hakan Fıstık

我也遇到了这个问题。我能够通过运行
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,但是这不起作用。只是需要注意一点,因为它可能是两者的结合提供了解决方案。

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


谢谢布兰登 - 是的,就像手动重新安装密钥文件“某种”一样解决了这个问题。问题是,一旦您签入密钥文件,任何其他最新了解此签入密钥文件的用户现在都会遇到此错误。如果这些用户中的任何一个检查了他们的“修复”并且我得到了最新的,那么我的机器现在又坏了......等等。微软已经为此启动了故障单并将其分配给 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 过去只是弹出并询问每个键的密码。发生了什么变化?
M
MagicBox

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

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

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


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

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

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

运行以下命令导出到密钥文件: openssl pkcs12 -in certfile.pfx -out backupcertfile.key openssl pkcs12 -export -out certfiletosignwith.pfx -keysig -in backupcertfile.key

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


谢谢!!我认为这对我有用。我在这里抓住了 openssl:gnuwin32.sourceforge.net/packages/openssl.htm
我想添加在 pfx 中包含实际证书的选项: openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt -keysig -keyex
确保以管理员身份运行 openssl,否则您将收到错误“无法写入‘随机状态’”另外:在执行完 openssl 后,我仍然必须使用“sn -i ...”来回答 Brandon Manchester 的问题事物。
这是唯一的解决方案,最终对我有用。谢谢!
P
Peter Mortensen

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

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

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


拿回来,没用。没有意识到它从项目设置中删除了 pfx。我认为答案在于 Stefan stackoverflow.com/a/14644793/1735721 的回答
这个答案很棒。它对我有用,而且很容易。
为我工作(VS2017 15.7.4)。感谢您提供的快速解决方案。
在 VS2019 16.1.3 上为我工作。谢谢!!
T
T.S.

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

sn -d VS_XXXX sn -i mykey.pfx VS_XXX


这为我修好了!安装本身因对象已存在而失败。
我也试过了,但没有帮助。证书本身可能有问题吗?
谢谢,必须以管理员身份进行删除——如果以普通用户身份运行,则会出现误导性错误“未找到强名称密钥容器”。
P
Peter Mortensen

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


我相信这是专业版的 - 在我的精简版中没有这个选项
我刚刚下载的版本(2011 年 9 月)带有这个选项。
它仍然需要专业许可证。
J
JasonMArcher

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

行为

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

原因

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

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

解决方案

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

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

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

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

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

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


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

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


如果不需要签名,这是一个完美的答案。它将消除对项目进行签名的需要。
B
Bala Kumar

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

打开项目属性。

单击“签名”部分。

如果显示“选择一个强名称密钥文件:”,请从下拉框中重新选择当前值:

https://i.stack.imgur.com/wKwRU.png

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

https://i.stack.imgur.com/aL4kp.png

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

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

点击“更改密码”按钮:

https://i.stack.imgur.com/RKhOc.png

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

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

More Info..


整个错误似乎完全是随机解决的,但这个解决方案对我有用。如果其他人在页面上如此深入,我只能建议尝试一切。
P
Peter Mortensen

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

我希望这有帮助。


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

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

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

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

希望这可以帮助。


是的,我们在 Microsoft 支持下也尝试过,这就是进行代码签名导入的方式。问题确实似乎是证书密码在签入过程中丢失了源安全。但这看起来并不是真正的问题。如果您在 Widnows 7 机器 #1 上输入证书详细信息,然后将完全相同的文件移动到另一台机器并注册它,注册将起作用,但构建将失败。微软仍在为我们调查。现在我们不得不禁用代码签名并在发布期间手动签名。
P
Peter Mortensen

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

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


在进行 SN.exe -i 修复后,这也为我解决了这个问题。
M
Milad Xandi

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

双击 Package.appxmanifest

转到包装选项卡

点击选择证书

点击配置证书

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


u
user1113289

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

但是每次密钥文件更改时都需要这样做,而且似乎不行。


P
Peter Mortensen

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

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


P
Peter Mortensen

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

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


您需要将其添加到哪个商店?
我做了同样的事情(并将证书放入此用户个人/受信任的根/受信任的 Pub ..不确定哪个修复了它)并且能够转移到我有工作空间冲突的下一个 TFS 错误,所以要纠正我也有删除并添加新的构建代理。
H
Hakan Fıstık

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

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

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

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


P
Peter Mortensen

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


P
Peter Mortensen

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

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


M
Mathias Lykkegaard Lorenzen

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

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


我遇到了同样的问题,阅读您的评论指出我已经从 Windows 7 升级到 Windows 10,现在 VS 需要以管理员身份运行。所以以管理员身份运行 VS,没有问题..感谢您的指点
h
honzajscz

不幸的是,这里没有提到对我有用的方法。我必须在 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>

H
Hamit YILDIRIM

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

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


M
Michele mpp Marostica

为谁使用 GitLab 跑步者:

确保使用可以登录的帐户运行运行程序: ./gitlab-runner.exe install --user ".\ENTER-YOUR-USERNAME" --password "ENTER-YOUR-PASSWORD" (我不得不停止并先卸载)

按照本指南授予构建用户作为服务登录的权限

使用此类构建用户登录

使用其他答案中建议的命令:sn -i certificate.pfx VS_KEY_C***6

https://i.stack.imgur.com/elHNt.png


K
Kyle Julé

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

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

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

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


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

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