我们刚刚将 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 代码签名。
我也遇到了这个问题。我能够通过运行 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,但是这不起作用。只是需要注意一点,因为它可能是两者的结合提供了解决方案。
希望这有助于解决您的问题。
我发现了一个修复程序,可以帮助您在多开发人员环境中成功构建:
不要更改密码(这会导致更改 .pfx),而是从组合框中重新选择 .pfx 文件。然后调用密码对话框。输入密码后,项目就构建好了。每个开发人员都可以在他的本地计算机上执行此操作,而无需实际修改 .pfx 文件。
我仍然无法让程序集在我们的构建服务器机器上签名。我在那里遇到了同样的错误,但是使用 sn.exe -i 方法并不能解决构建服务器的问题。
我有同样的问题,删除商店和阅读没有用。我必须做以下事情。
获取 OpenSSL 的副本。它适用于 Windows。或者使用 Linux 机器,因为他们几乎都拥有它。
运行以下命令导出到密钥文件: openssl pkcs12 -in certfile.pfx -out backupcertfile.key openssl pkcs12 -export -out certfiletosignwith.pfx -keysig -in backupcertfile.key
然后在项目属性中,您可以使用 PFX 文件。
我说得太早了!重建使错误重新发挥作用......
我发现这可行 - 右键单击 Solution Explorer 并将其从项目中排除。单击显示所有文件,右键单击,现在再次将其包含在项目中。现在撤消挂起的更改...
出于某种原因,这为我解决了问题并且相对无痛!
我发现在某些情况下,您应该在安装之前尝试删除此密钥。因此,请执行以下操作:
sn -d VS_XXXX sn -i mykey.pfx VS_XXX
VSCommands 2010(Visual Studio 插件)可以自动为您修复此问题 - 只需右键单击错误并从菜单中单击 Apply Fix。您可以get it from Visual Studio gallery。
在尝试了所有这些解决方案(以及更多)之后,我发现问题出在其他地方。对于购买证书后与我经历同样痛苦的人,我将分享我的问题的解决方案。
行为
我了解“符号”将强名称而不是验证码应用于 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
您现在应该拥有 KeySpec=2
的密钥集/证书。如果需要,您现在可以再次使用 MMC 将其导出到另一个 PFX 文件中。
要在 Visual Studio 2012 中解决此问题,我右键单击项目,属性 ->“签名”,然后取消选中“签署 ClickOnce 清单”。
我在“选择强名称密钥文件”下拉框中重新选择了密钥(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
在所有三个框中输入原始密码,然后单击确定。如果您想更改密码(或者如果您的旧密码不符合复杂性要求),您现在可以这样做。
保存您的项目并进行重建。
作为一种解决方法,我尝试以管理员身份运行 Visual Studio 2010,它对我有用。
我希望这有帮助。
作为有关连接错误报告的工作的原始作者,此消息有两种变体(我稍后发现)
对于一种变体,您使用 sn.exe(通常如果您正在执行强命名)将密钥导入强命名存储。
您使用 certmgr 导入的另一个变体是当您为单击一次部署之类的事情进行代码签名时(请注意,您可以将相同的证书用于两种目的)。
希望这可以帮助。
没有什么对我有用,但后来我去查看了证书管理器(mmc.exe)。证书没有在个人存储中导入,所以我手动导入它,然后编译项目。
这解决了我的问题:打开你的 VS 项目
双击 Package.appxmanifest
转到包装选项卡
点击选择证书
点击配置证书
从文件中选择并使用 example.pfx 统一或其他任何创建
在组合框中重新选择密钥文件并输入密码对我们有帮助。
但是每次密钥文件更改时都需要这样做,而且似乎不行。
我的问题是 TFS 构建控制器作为网络服务运行,出于某种原因,我不明白为什么没有使用 Visual Studio 构建主机服务证书。我将 Visual Studio Build 服务的标识更改为更易于管理的标识,确保它在 TFS 服务器上具有权限,并使用 MMC 手动添加证书。
问题还在于 MSBuild 无法将受密码保护的证书添加到存储中。
我遇到了类似的问题,但是在“强名称密钥文件”组合框中选择 pfx 并输入密码后,我仍然遇到类似的错误(没有容器名称部分):
无法导入以下密钥文件:companyname.pfx。密钥文件可能受密码保护。要更正此问题,请尝试再次导入证书或手动安装证书
此外,未填充“签署 ClickOnce 清单”证书信息面板。
我在我的 pfx 上做了“从文件中选择...”,它解决了这个问题。
这里描述的所有方法都没有帮助我。但是当我从我的项目中删除 *.pfx 文件并将其再次添加到程序集的签名中时,我构建了我的项目,没有任何错误!我无法解释原因。但它对我有用。
好的,这对我有用。在 Visual Studio 2010 中以管理员身份打开旧解决方案/项目,然后打开新的或复制的解决方案/项目。作为管理员,在新的 Visual Studio 2010 解决方案/项目中删除复制的 pfk 文件,然后转到项目属性并取消选择它。
打开两个项目后,将粘贴复制到新项目。转到项目属性并选择构建。我打开并关闭了 Visual Studio,并且在从新项目中删除之后构建了它,然后从旧项目中复制并选择它。当我复制项目并尝试构建它时,我首先在这篇文章的开头收到了错误。
在我的场景中,构建服务使用的用户帐户与我使用 sn.exe
导入密钥的用户帐户不同。
将帐户更改为我的管理员帐户后,一切正常。
不幸的是,这里没有提到对我有用的方法。我必须在 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>
我得到了同样的错误。就我而言,我尝试了以上所有方法,但我无法得到结果。
我终于意识到,在我的情况下,错误的原因是没有输入证书密码或输入错误。当我正确地动态输入密码时,错误消失了。成功的
为谁使用 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
我通过更改 Visual Studio 项目的 .csproj 文件中的以下行为自己解决了这个问题:
这引发了“无法导入”错误:
<PropertyGroup>
<SignManifests>true</SignManifests>
</PropertyGroup>
将值更改为 false 会使错误消失。
在 Visual Studio 2019 和 .Net 5 项目中,对我来说,这个问题的解决方案是从我的解决方案中排除 .pfx 文件,它立即起作用。