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

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

无法导入以下密钥文件:companyname.pfx。密钥文件可能有密码保护。若要纠正此问题,请尝试重新导入证书或使用以下密钥容器名称手动将证书安装到强名称CSP: VS_KEY_3E185446540E7F7A

这发生在一些开发人员机器上,而不是其他机器上。一些用来修复这个问题的方法有时有效,包括:

  • 从Windows资源管理器重新安装密钥文件(右键单击PFX文件并单击安装)
  • 第一次在新机器上安装Visual Studio 2010会在您第一次打开项目时提示您输入密码,然后它就可以工作了。在从visualstudio2008升级的机器上,没有此选项。

我已经尝试使用SN.EXE实用工具(强名称工具)向错误消息建议的强名称CSP注册密钥,但每当我使用Visual Studio 2010附带的版本运行带有任何选项的工具时,SN.EXE只是列出其命令行参数,而不是做任何事情。无论我提供什么参数,都会发生这种情况。

为什么会发生这种情况,有什么明确的步骤来解决它?我打算放弃ClickOnce安装和微软代码签名。

247096 次浏览
我也遇到过这个问题。 我能够通过运行
sn -i <KeyFile> <ContainerName> (将密钥对安装到命名容器中)来解决这个问题。< / p >

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,右键单击它并选择安装,但这并不奏效。只是需要注意的一点,因为它可能是两者的结合提供了解决方案。

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

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

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

使用certmgr导入的另一种变体是在协同设计类似“单击一次”部署的内容时(注意,可以在这两种情况下使用相同的cert)。

希望这能有所帮助。

作为一种变通办法,我试着以管理员的身份运行visual studio 2010,它对我很有效。

我希望这能有所帮助。

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

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

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

VSCommands 2010 (Visual Studio插件)可以自动修复这个问题-只需右键单击错误,然后从菜单中单击Apply fix。你可以从Visual Studio画廊获得它

好吧,这招对我很管用。以管理员身份在Visual Studio 2010中打开旧的解决方案/项目,并打开新的或复制的解决方案/项目。以管理员身份,在新的Visual Studio 2010解决方案/项目中删除复制的pfk文件,并进入项目属性并取消选择它。

打开两个项目后,复制粘贴到新项目。转到项目属性并选择Build。我打开和关闭visualstudio,并在从新项目中删除后构建它,然后从旧项目中复制并选择它。当我复制项目并试图构建它时,我在这篇文章的开头第一次收到了错误。

我发现在某些情况下,你应该尝试删除这个键之前你安装它。所以,请做到以下几点:

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

我说得太早了!重建带来了错误…

我发现这个工作-右键单击解决方案资源管理器并将其从项目中排除。单击显示所有文件,右键单击,现在再次将其包含在项目中。现在撤销挂起的更改…

出于某种原因,这为我整理了它,相对来说没有什么痛苦!

在将Windows安装移动到固态硬盘后,我也遇到了同样的问题。其他的解决方法对我都不起作用。

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

我也遇到了同样的问题,删除存储和读取都不起作用。我必须做以下事情。

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

  • 执行以下命令,导出到密钥文件。

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

Then in the project properties you can use the PFX file.

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

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

此外,“Sign the ClickOnce清单”证书信息面板也没有填充。

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

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

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

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

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

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

看到单击once清单签名和Strong-Name程序集签名使用Visual Studio项目设计器的签名页面,签名程序集 . b0

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

行为

我理解'sign'对DLL或EXE应用强名称而不是验证码。这就是为什么signtool 在这种情况下工作,但在Visual studio中的'sign'将不起作用。

原因

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

我现在从Comodo购买了证书,在代码签名证书中有一个不正确的KeySpec=1。这意味着这些证书可以很好地使用signtool (authenticode),但不能使用强命名(sign下拉菜单)。

解决方案

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

  1. 使用sn -k [name].snk为强名称创建一个单独的证书。使用snk对程序集进行签名,然后使用带有代码签名证书的signtool对DLL/EXE进行authenticode签名。虽然这看起来很奇怪,但据我所知,这是处理证书的正确方法,因为强名称与authenticode有不同的目的(关于如何工作的详细信息,请参阅这个链接)。
  2. 导入您的证书为KeySpec=2。它的过程是详细的在这里

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


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

  1. 使用“certificates”MMC导出现有的密钥集(KeySpec=1)到PFX文件。注意:请将此文件备份到安全的位置,并测试该文件是否可以在另一台机器上导入,如果你真的想要安全的话!
  2. 从加密存储中删除现有证书(仍在使用MMC)。
  3. 打开CMD提示符。
  4. 使用如下命令导入PFX文件:
    1. certutil -importPFX -user <pfxfilename> AT_SIGNATURE
    2. 当提示时,输入pfx的口令。
    3. 李< / ol > < / >

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

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

为了在visual studio2012中解决这个问题,我右键单击项目,属性->“signing”,然后取消选中“Sign the ClickOnce manifest”。

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

在将帐户更改为管理员帐户后,一切都正常工作。

我通过更改Visual Studio项目的.csproj文件中的下面一行来解决这个问题:

这抛出了“不能导入”错误:

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

将值更改为false可以消除错误。

我在“选择强名称密钥文件”下拉框中重新选择了密钥(pfx)文件,然后在“ENTER password”弹出窗口中提供密码。拯救了我的项目并重建了。构建成功。

  • 打开项目属性。
  • 单击Signing部分。
  • 当它说“选择强名称密钥文件:”时,从下拉框中重新选择当前值:

enter image description here

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

enter image description here

  • 保存项目并重新构建。

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

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

enter image description here

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

  • 保存项目并重新构建。

更多信息.

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

双击Package.appxmanifest

进入包装选项卡

点击选择证书

单击配置证书

从文件中选择并使用示例。PFX的统一或任何其他创造

我得到同样的错误。 在我的情况下,我尝试了以上所有的,但我不能得到的结果

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

不幸的是,这里提到的方法都不适合我。我必须在docker容器中注册一对PFX,我需要通过命令行传递密码。

所以我重新开发了 使用c#中的RSACryptoServiceProvider. 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

容器名称建议在GitLab失败的作业输出中(msbuild输出) enter image description here < / p >

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