我们刚刚将Visual Studio 2008项目升级到Visual Studio 2010.我们使用Verisign代码签名证书对所有程序集进行了强签名。自升级以来,我们不断收到以下错误:
无法导入以下密钥文件:companyname.pfx。密钥文件可能受密码保护。要更正此问题,请尝试再次导入证书,或使用以下密钥容器名称手动将证书安装到强名称CSP:VS_KEY_3E185446540E7F7A
这种情况发生在一些开发者机器而不是其他机器上。用于修复此问题的一些方法包括:
我已尝试使用SN.EXE实用程序(强名称工具)向强名称CSP注册密钥,因为错误消息显示,但每当我使用随附的版本运行任何选项的工具时在Visual Studio 2010中,SN.EXE只列出其命令行参数而不是执行任何操作。无论我提供什么参数,都会发生这种情况。
为什么会发生这种情况,有哪些明确的步骤可以解决?我即将放弃ClickOnce安装和Microsoft代码签名。
答案 0 :(得分:434)
我也遇到了这个问题。
我能够通过运行
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安装的“Developer Command Prompt”会添加通常包含正确位置的其他信息。
根据您的帖子看起来像
<强> sn -i companyname.pfx VS_KEY_3E185446540E7F7A
强>
这必须从PFX文件的位置运行,如果您在VS 2010中加载了解决方案,只需右键单击解决方案资源管理器中的pfx文件,然后选择“打开命令提示符”即可启动.net 2010 cmd提示工具在正确的目录中。
在运行此sn命令之前,我通过右键单击它并选择安装来重新安装pfx,但这不起作用。需要注意的是,它可能是提供解决方案的两者的组合。
希望这有助于解决您的问题。
答案 1 :(得分:121)
我发现了一个可以帮助您在多开发人员环境中成功构建的修复程序:
不是更改密码(导致.pfx被更改),而是从组合框中重新选择 .pfx文件。然后调用密码对话框。输入密码后,项目将构建正常。每个开发人员都可以在本地计算机上执行此操作,而无需实际修改.pfx文件。
我仍然无法在我们的构建服务器计算机上签署程序集。我在那里得到了同样的错误,但是使用sn.exe -i方法并不能解决构建服务器的问题。
答案 2 :(得分:40)
我遇到了同样的问题并删除了商店并且阅读无效。我不得不做以下事情。
获取OpenSSL的副本。它是available for Windows。或者使用Linux盒子,因为他们几乎都拥有它。
运行以下命令以导出到密钥文件:
openssl pkcs12 -in certfile.pfx -out backupcertfile.key
openssl pkcs12 -export -out certfiletosignwith.pfx -keysig -in backupcertfile.key
然后在项目属性中,您可以使用PFX文件。
答案 3 :(得分:33)
我说得太快了!重建使错误重新发挥作用......
我发现这有效 - 右键单击Solution Explorer并将其从项目中排除。单击显示所有文件,右键单击,然后再次将其包含在项目中。现在撤消挂起的更改......
出于某种原因,这对我来说是彻头彻尾的,并且相对无痛!
答案 4 :(得分:31)
VSCommands 2010(Visual Studio插件)可以自动为您解决此问题 - 只需右键单击错误,然后单击菜单中的“应用修复”。你可以get it from Visual Studio gallery。
答案 5 :(得分:28)
我发现在某些情况下,您应该尝试删除这个密钥,然后再安装。请执行以下操作:
sn -d VS_XXXX
sn -i mykey.pfx VS_XXX
答案 6 :(得分:26)
在尝试了所有这些解决方案(以及更多)后,我发现问题出在其他地方。对于那些在购买证书后遇到同样痛苦的人,我会分享解决问题的方法。
<强>行为强>
我理解'sign'对DLL或EXE应用强名称而不是authenticode。这就是为什么signtool 将在这种情况下工作,但Visual Studio中的“sign”将无效。
<强>原因强>
过去我有过Verisign证书的经验。它们在证书中有KeySpec=2
- 与Visual Studio中的“签名”功能一起使用。这些证书适用于Visual Studio和signtool。
我现在从Comodo购买了证书,证书代码签名证书中的KeySpec=1
不正确。这意味着这些证书可以与signtool(authenticode)一起使用,但不能使用强命名(符号下拉列表)。
<强>解决方案强>
有两种方法可以解决这个问题:
sn -k [name].snk
为您的强名称创建单独的证书。使用snk对程序集进行签名,然后使用带有代码签名证书的signtool,使用authenticode签名对DLL / EXE进行签名。虽然这看起来很奇怪,但根据我的理解,这是处理证书的正确方法,因为强名称的目的与authenticode不同(另请参阅this link了解其工作原理的详细信息。)KeySpec=2
。这个过程是detailed here。因为我想使用多个强名称,所以我目前使用选项(1),尽管选项(2)也有效。
为了确保此解决方案永远不会丢失,以下是解决方案2的过程:
KeySpec=1
)导出到PFX文件。注意:请将此文件备份到安全位置,如果您确实想要安全地播放文件,请测试该文件是否可以在另一台机器上正常导入!certutil -importPFX -user <pfxfilename> AT_SIGNATURE
您现在应该拥有KeySpec=2
的密钥集/证书。如果需要,您现在可以再次使用MMC将其导出到另一个PFX文件中。
答案 7 :(得分:9)
要在Visual Studio 2012中解决此问题,请右键单击项目,属性 - &gt; “签名”,然后取消选中“签署ClickOnce清单”。
答案 8 :(得分:7)
我在“选择一个强名称密钥文件”下拉框中重新选择了密钥(pfx)文件,然后在“输入密码”弹出窗口中提供了密码。保存了我的项目并成功完成了rebuild.build。
保存项目并进行重建。
如果收到错误消息:“尝试引用不存在的令牌”,请忽略它并继续执行以下步骤
点击“更改密码”按钮:
在所有三个框中输入原始密码,然后单击“确定”。如果您想更改密码(或者您的旧密码不符合复杂性要求),您现在可以这样做。
保存项目并进行重建。
答案 9 :(得分:5)
作为一种解决方法,我尝试以管理员身份运行Visual Studio 2010,它对我有用。
我希望这会有所帮助。
答案 10 :(得分:4)
作为连接错误报告的原始作者,此消息有两种变体(我后来发现)
对于一个变体,您可以使用sn.exe(通常是在执行强命名时)将密钥导入强命名存储区。
您使用certmgr导入的另一个变体是当您为单击一次部署(例如,您可以为两个目的使用相同的证书)进行代码签名时。
希望这有帮助。
答案 11 :(得分:3)
没有什么对我有用,但后来我去了证书经理(mmc.exe)。证书未导入个人存储区,因此我手动导入证书,然后编译项目。
答案 12 :(得分:2)
我的问题是TFS Build Controller是作为网络服务运行的,出于某种原因我不明白为什么没有使用Visual Studio Build Host服务证书。我将Visual Studio Build服务的身份更改为更易于管理的内容,确保它在TFS服务器上拥有权限,并使用MMC手动添加证书。
问题还在于MSBuild无法将受密码保护的证书添加到商店。
答案 13 :(得分:2)
在组合框中重新选择密钥文件并输入密码对我们有帮助。
但每次密钥文件发生变化时都需要这样做,而且看起来不行。
答案 14 :(得分:2)
将Windows安装移至SSD后,我遇到了同样的问题。其他解决方案都不适合我。
我的解决方案是在Notepad中打开项目文件并删除对PFX密钥的所有引用。保存文件后,在Visual Studio中打开解决方案。转到项目 - &gt;属性 - &gt;签名。您不应该在“选择强名称密钥文件”组合框中看到任何键。在组合框中,浏览到键,选择它,现在可以构建项目。
答案 15 :(得分:1)
我有类似的问题,但在“强名称密钥文件”ComboBox中选择pfx并输入密码后,我仍然遇到类似的错误(没有容器名称部分):
无法导入以下密钥文件:companyname.pfx。密钥文件可能受密码保护。要更正此问题,请尝试再次导入证书或手动安装证书
此外,未填充“签署ClickOnce清单”证书信息面板。
我在我的pfx上做了“从文件中选择...”,它解决了问题。
答案 16 :(得分:1)
这里描述的所有方法都没有帮助我。但是当我从我的项目中删除* .pfx文件并将其再次添加到程序集的签名中时,我构建了我的项目而没有任何错误!我无法解释原因。但它对我有用。
答案 17 :(得分:1)
在我的方案中,构建服务未使用我使用sn.exe
导入密钥的同一用户帐户。
将帐户更改为我的管理员帐户后,一切正常。
答案 18 :(得分:1)
好的,这对我有用。在Visual Studio 2010中以管理员身份打开旧解决方案/项目,然后打开新的或复制的解决方案/项目。作为管理员,在新的Visual Studio 2010解决方案/项目中删除复制的pfk文件,然后转到项目属性并取消选择。
打开两个项目后,将粘贴复制到新项目。转到项目属性,然后选择“构建”。我打开并关闭Visual Studio,并在从新项目中删除之后构建它,然后从旧项目中复制并选择它。当我复制项目并尝试构建它时,我在第一篇文章的开头就收到了错误。
答案 19 :(得分:1)
这解决了我的问题: 打开你的VS项目
双击Package.appxmanifest
转到“打包”标签
点击选择证书
单击“配置证书”
从文件中选择并使用example.pfx表示统一或其他任何创建
答案 20 :(得分:0)
我通过更改Visual Studio项目的.csproj文件中的以下行来解决此问题:
这引发了“无法导入”错误:
<PropertyGroup>
<SignManifests>true</SignManifests>
</PropertyGroup>
将值更改为false会导致错误消失。
答案 21 :(得分:0)
我遇到了同样的错误。 就我而言,我尝试了上述所有方法,但无法获得结果。
我终于意识到,就我而言,该错误的原因是未输入或未正确输入证书密码。当我正确动态输入密码后,错误消失了。成功
答案 22 :(得分:0)
不幸的是,这里没有提到的方法对我有用。我必须在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>
答案 23 :(得分:0)
谁在使用GitLab运行程序:
./gitlab-runner.exe install --user ".\ENTER-YOUR-USERNAME" --password "ENTER-YOUR-PASSWORD"
(我必须先停止并卸载)sn -i certificate.pfx VS_KEY_C***6
答案 24 :(得分:0)
在 Visual Studio 2019 和 .Net 5 项目中,对我来说解决这个问题的方法是从我的解决方案中排除 .pfx 文件,它立即起作用。
答案 25 :(得分:-4)
仅供参考
我使用带有-p
标志的sn.exe到官方代码签名PFX文件(作为代码签名购买),如下所示创建SNK
文件,Visual Studio 2013
SNK
{{1}}浏览了文件以供使用。
但问题仍然是它一直说:“密钥文件* .. SNK不包含公钥/私钥对。”