我们刚刚将Visual Studio 2008项目升级到了Visual Studio 2010。我们的所有程序集都使用Verisign代码签名证书进行了强签名。自升级以来,我们不断得到以下错误:
0
这发生在一些开发人员机器上,而不是其他机器上。在某些情况下,用于解决此问题的一些方法包括:
- 从Windows资源管理器重新安装密钥文件(右键单击pfx文件并单击"安装")。
- 第一次在新机器上安装Visual Studio 2010时,在第一次打开项目时会提示您输入密码,然后密码就会生效。在从Visual Studio 2008升级的计算机上,您无法获得此选项。
我尝试使用sn.exe实用程序(强名称工具)按照错误消息的提示,用强名称csp注册密钥,但每当我使用Visual Studio 2010附带的任何选项运行该工具时,sn.exe只列出其命令行参数,而不执行任何操作。不管我提供什么论据,这都会发生。
为什么会发生这种情况,解决它的明确步骤是什么?我将放弃ClickOnce安装和Microsoft代码签名。
我也遇到了这个问题。我可以通过运行
sn -i 来解决这个问题(将密钥对安装到一个命名的容器中)。
sn通常作为WindowsSDK的一部分安装。例如C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin
ETFX 4.0 Tools\sn.exe。很可能此位置不在标准环境的搜索路径上。但是,由Visual Studio安装的"开发人员命令提示"添加了其他信息,这些信息通常包括正确的位置。
根据你的帖子
sn -i companyname.pfx VS_KEY_3E185446540E7F7A
这必须从pfx文件的位置运行,如果您在vs 2010中加载了解决方案,则只需右键单击解决方案资源管理器中的pfx文件,然后选择"打开命令提示",该命令提示将在正确的目录中启动.net 2010 cmd提示工具。
在运行这个sn命令之前,我确实重新安装了pfx,方法是右键单击它,然后选择Install,但这并不起作用。只是需要注意的一点,因为这可能是提供解决方案的两者的组合。
希望这有助于解决你的问题。
- 谢谢布兰登-是的,这就像手动重新安装密钥文件"排序"解决了问题。问题是,一旦您签入密钥文件,任何其他获得此签入密钥文件最新信息的用户现在都将遇到此错误。如果这些用户中的任何一个签入他们的"修复",我得到最新的,那么我的机器现在又坏了…等等。微软已经为此启动了一个故障通知单,并将其分配给了VS2010团队和VSS团队。
- 有趣。在将pfx添加到新的csp时,我没有遇到这个问题。据我所知,sn-我不会更改pfx文件,因此以后您不必签入任何内容。但是,如果您无论如何都要更改pfx文件,例如重置密码,这将导致问题,因为它会更改pfx文件。您的解决方案是否使用其他任何计算机上的pfx文件构建?如果是这样,那么pfx文件是正确的,只是没有在有构建问题的计算机上设置正确的csp。
- 起初我只试过sn-i部分,但它抱怨密码不正确(尽管它是正确的)。我移除了证书,重新安装了它,然后sn-i…工作。基本上证实了对我来说,这两个步骤都是必需的。重新安装cert,然后执行sn命令。
- 我在vss和tfs中都发现,如果您运行sn-i命令,除非您签出了pfx文件,否则它不会工作,并且当您签入它时,它对网络上的其他开发人员不起作用。我必须尝试重新安装证书,然后运行sn-i命令。我们需要它在办公室的所有开发人员机器上工作。
- 布兰登的解决方法对我很有效,允许我正确地发布我们的ClickOnce应用程序。我也不需要将pfx文件签出到tfs中,这样也可以工作。谢谢!
- 这对我也很有效,但是我过去从来没有这样做过。Vs过去只会弹出并要求输入每个密钥的密码。发生了什么变化?
- 如果系统提示您输入密码,但您不知道,请尝试单击Enter。pfx可能没有密码,但sn.exe将始终提示输入密码。
- 查看stackoverflow.com/a/14644793/396005下面的stefan de bruijn评论,他链接到这篇文章:blogs.msdn.com/b/andrekl/archive/2008/01/08/…,它仍然适用于vs 2013。
- 我从另一篇与此解决方案配套的博客文章中读到…如果您试图在同一台计算机上的其他用户下安装它,则需要先从同一台计算机上的所有其他用户中删除此密钥容器,然后此命令才能工作。希望这能节省一些时间。
- 这个答案给我提供了解决问题的线索。我在.pfx和容器实例上运行了此命令,并得到"未能安装密钥对-对象已存在"。这提醒我系统上的密钥容器目录已锁定,仅限管理员使用。如果是这种情况,请确保运行vs的帐户可以访问c:program datamicrosoftcrypto
sa目录。
- 开发人员命令提示符运行时出错,必须从常规的命令窗口运行它,路径为sn.exe。
- vs实例也是以管理员身份运行的,这一点很重要。否则,即使密钥正确地添加到容器中,并且证书也可以。VS无法正确生成。默认情况下,在Windows10vs版本中,以低权限运行。
- 我得到这个错误:Failed to install key pair -- Object already exists.,当我删除这对并再次添加它时,问题仍然存在。
我发现了一个帮助您在多开发人员环境中成功构建的修复程序:
不要更改密码(这会更改.pfx),而是从组合框中重新选择.pfx文件。然后调用密码对话框。输入密码后,项目将生成OK。每个开发人员都可以在本地计算机上执行此操作,而无需实际修改.pfx文件。
我仍然在让程序集在我们的生成服务器计算机上签名时遇到问题。我在那里得到了同样的错误,但是使用sn.exe-i方法并不能解决buildserver的问题。
- 花了一段时间没能在我们的TFS构建服务器上完成这项工作,我意识到我是以自己的身份登录的,而不是以构建服务帐户的身份登录的,难怪它找不到它——doh!
- 给你1英镑。谢谢!真的很管用!而且很简单。
- 这应该标记为答案,因为当前标记的答案在多开发人员环境中不起作用。做得好。
- 如果在一个解决方案中使用同一.pfx文件对多个程序集/项目进行签名,则只需在一个项目上执行此步骤,它将应用于所有项目。工作很好。
- 在Visual Studio 2012中,可以通过右键单击包含的项目,选择"签名",然后选择"从文件中选择…"并导航到相关文件来完成此操作。
- 我的问题是生成服务器正在本地帐户下运行。我进入选项并更改,但没有意识到我在错误的地方更改了它-这导致我进行了几个小时的故障排除,直到我再次检查它并认识到我的错误!
- 在VS2010中这对我不起作用
- 对于密码为空的证书,这不起作用。
- 太好了,谢谢。但令人遗憾的是,这仍然是2017年的一个解决方案。
- 它对我们很有用,基本上我们有一个通过Git共享的项目,以及一个通过pfx密钥(没有密码)签名的dll。我能用它,同事没有("导入密钥失败"是错误)。我们通过取消选中键、选择新键、重新编译来解决这个问题。然后奏效了。
我也有同样的问题,删除商店和阅读没有起作用。我必须做以下的事情。
然后在项目属性中,可以使用pfx文件。
- 谢谢您!!我觉得这对我很有用。我在这里抓到了openssl:gnuwin32.sourceforge.net/packages/openssl.htm
- 我绞尽脑汁想弄清楚这件事。
- +1这行,谢谢!
- 我想添加在pfx中包含实际证书的选项:openssl pkcs12-export-out certificate.pfx-in key privatekey.key-in certificate.crt-certfile cacert.crt-keysig-keyex
- 100次谢谢!+100如果我能!
- 确保以管理员身份运行openssl,否则会出现"无法写入‘随机状态’的错误":在执行openssl操作之后,我仍然需要用"sn-i…"操作Brandon Manchester的答案。
- 与使用Visual Studio 2010进行程序集签名时的错误答案相同:"试图引用不存在的令牌"。
我说得太早了!重建使错误重新发挥作用…
我在解决方案资源管理器中找到了这个工作-右键单击并将其从项目中排除。单击"显示所有文件",右键单击,然后再次将其包含在项目中。现在撤消挂起的更改…
出于某种原因,这对我来说是很好的,相对来说是无痛的!
- 这对我也很有效-完全无痛。谢谢!
- 证实。为我工作。
- 天哪,这在其他人没有的时候起作用了。
- 把它拿回来,没用。没有意识到它从项目设置中删除了pfx。我认为答案在于stefan stackoverflow.com/a/14644793/1735721的答案。
- 这个答案很好。这对我很有效,而且很容易。
- 哇,谢谢,EZPZ解决方案!
- 为我工作(VS2017 15.7.4)。感谢您的快速解决方案。
vscommands 2010(Visual Studio插件)可以自动修复此问题-只需右键单击"错误",然后从菜单中单击"应用修复"。您可以从Visual Studio库中获取。
- 我相信这是为专业版-在我的精简版中没有这个选项
- 我刚下载的版本(2011年9月)附带了这个选项。
- 它仍然需要专业许可证。
我发现在某些情况下,您应该在安装之前尝试删除这个密钥。请执行以下操作:
sn -d VS_XXXX
sn -i mykey.pfx VS_XXX
- 这是给我修的!安装本身失败,对象已存在。
- 我也试过了,但没用。证书本身可能有问题吗?
- 谢谢,删除操作必须以管理员的身份完成——如果以常规用户的身份运行,就会出现错误"找不到强名称密钥容器"。
在尝试了所有这些解决方案(以及更多)之后,我发现问题就在其他地方。对于那些在购买证书后和我一样痛苦的人,我将分享我的问题的解决方案。
行为
我理解"sign"对dll或exe应用强名称而不是验证码。这就是为什么signtool在这种情况下可以工作,但Visual Studio中的"sign"将不起作用。
原因
在过去,我有过来自Verisign的证书。它们在证书中有一个KeySpec=2,与Visual Studio中的"符号"功能一起使用。这些证书对Visual Studio和Signtool都有效。
我现在从科摩多购买了证书,在代码签名证书中有一个不正确的KeySpec=1。这意味着这些证书可以与signtool(authenticode)一起使用,但不能与强命名(sign下拉列表)一起使用。
解决方案
解决这个问题有两种方法:
使用sn -k [name].snk为您的强名称创建一个单独的证书。使用snk对程序集进行签名,然后在代码签名证书中使用signtool对dll/exe进行验证码签名。虽然这看起来很奇怪,但据我所知,这是处理证书的正确方法,因为强名称的用途与验证码不同(有关如何工作的详细信息,请参阅此链接)。
以KeySpec=2的身份导入您的证书。这里详细介绍了这个过程。
因为我想使用多个强名称,所以我目前使用选项(1),尽管选项(2)也可以。
为了确保这个解决方案在将来不会丢失,下面是解决方案2的过程:
使用"certifites"mmc将现有密钥集(KeySpec=1导出到pfx文件。注意:请将此文件备份到安全位置,并测试是否可以在另一台计算机上导入该文件,如果您真的想安全地运行它!
从加密存储中删除现有证书(stll使用mmc)。
打开命令提示。
使用以下命令导入pfx文件:
certutil -importPFX -user AT_SIGNATURE
提示时输入pfx的密码。
您现在应该拥有一个带有KeySpec=2的密钥集/证书。如果需要,现在可以再次使用mmc将其导出到另一个pfx文件中。
- 您的2解决方案是唯一对我有用的(不使用辅助命令行工具或进程)谢谢。
- 是的,我真的不明白为什么这里的一些解决方案有这么多的投票权;这真的是唯一对我有用的东西,我很确定大多数购买CS证书的人应该有同样的问题。哦…好吧…
- 这是唯一对我有效的解决方案。此外,.pfx文件不能包含签名程序集的证书链信息。
- 感谢您提供如此详细的说明。每一步都是精确描述的。
- 您的第一个解决方案对于理解这一点至关重要:完全不需要使用昂贵的密码保护证书对程序集进行强签名!一旦你理解了这一点,并且仅仅使用了一个snk文件,这个问题就完全消失了。请参阅此处和此处的警告说明。
要在Visual Studio 2012中解决此问题,我右键单击项目的"属性"->"签名",然后取消选中"对ClickOnce清单签名"。
- 如果不需要签字,这是一个完美的答案。它将消除签署项目的需要。
- 这是最好的答案。
我在"选择强名称密钥文件"下拉框中重新选择了密钥(pfx)文件,然后在"输入密码"弹出窗口中提供了密码。已保存我的项目并已重建。生成成功。
- 打开项目属性。
- 单击签名部分。
- 在显示"选择强名称密钥文件:"的位置,请从下拉框中重新选择当前值:
- Visual Studio现在将提示您输入密码。输入它。
更多信息…
- 整个错误似乎完全是随机的,但这个解决方案对我很有效。如果有人在这一页上写得这么深,我只能建议你尝试一切。
作为解决方法,我尝试以管理员身份运行Visual Studio 2010,但它对我很有用。
我希望这有帮助。
- 由于某种原因,它停止了工作。我不敢相信这真的解决了这个问题。谢谢您!!!!
作为Connect Bug报告的原作者,此消息有两种变体(我稍后发现)
对于一个变体,您使用sn.exe(通常在进行强命名时)将密钥导入强命名存储。
使用certmgr导入的另一个变体是,当您为类似click-once部署的事情进行代码签名时(注意,您可以为这两个目的使用相同的cert)。
希望这有帮助。
- 是的,我们也在微软的支持下尝试过,这就是导入代码签名的方法。问题似乎真的是,证书密码在签入过程源代码安全期间丢失。但这似乎不是真正的问题。看起来,如果您在widnows 7机器1上输入证书详细信息,然后将完全相同的文件移到另一台机器上并注册它,注册将起作用,但生成将失败。微软仍在为我们调查它。目前,我们必须禁用代码签名,并在发布期间手动签名。
没有什么对我有用,但是我去查看证书管理器(mmc.exe)。证书没有在个人存储中导入,因此我手动导入,然后编译项目。
请参见使用Visual Studio项目设计器的签名页对程序集进行签名的ClickOnce清单签名和强名称程序集签名。
- 在完成sn.exe-i修复之后,这也为我解决了这个问题。
在将Windows安装移动到SSD后,我遇到了同样的问题。其他的解决方案对我都不起作用。
我的解决方案是在记事本中打开项目文件并删除对pfx键的所有引用。保存文件后,在Visual Studio中打开解决方案。转到项目->属性->签名。您不应该看到"选择强名称密钥文件"组合框中列出的任何密钥。在组合框中,浏览到键,选择它,现在就可以构建项目了。
在组合框中重新选择密钥文件并输入密码对我们有帮助。
但每次密钥文件更改时都需要这样做,这似乎不正常。
我的问题是TFS生成控制器作为网络服务运行,出于某种原因,我不理解为什么不使用Visual Studio生成主机服务证书。我将Visual Studio生成服务的标识更改为更易于管理的内容,确保它在TFS服务器上具有权限,并使用mmc手动添加证书。
问题还在于,msbuild无法将受密码保护的证书添加到存储区中。
- 您需要将它添加到哪个商店??
- 我也做了同样的工作(也把证书放在这个用户的personal/trusted root/trusted pub中..不确定是哪个修复了它),并且能够进入下一个TFS错误,因为我有冲突的工作区,所以为了纠正这个问题,我还必须删除并添加一个新的构建代理。
这解决了我的问题:打开vs项目
双击package.appxmanifest
转到"打包"选项卡
单击"选择证书"
单击配置证书
从文件中选择,并使用unity或任何其他创建的example.pfx
好吧,这对我有用。在Visual Studio 2010中以管理员身份打开旧的解决方案/项目,然后打开新的或复制的解决方案/项目。作为管理员,请在新的Visual Studio 2010解决方案/项目中删除复制的pfk文件,然后转到"项目属性"并取消选择该文件。
打开两个项目后,复制粘贴到新项目。转到"项目属性"并选择"生成"。我打开并关闭了Visual Studio,也在从新项目中移除之后创建了它,然后从旧项目中复制并选择它。当我复制这个项目并尝试构建它时,我在本文开头收到了这个错误。
这里描述的所有方法对我都没有帮助。但是,当我从我的项目中删除*.pfx文件并再次将其添加到程序集的签名中时,我没有任何错误地构建了我的项目!我无法解释原因。但这对我很管用。
在我的场景中,构建服务使用的用户帐户与我使用sn.exe导入密钥的用户帐户不同。
将帐户更改为我的管理员帐户后,一切正常。
- 我也有同样的问题,读到你的评论,我发现我已经从Windows7升级到Windows10,现在需要以管理员身份运行VS。所以以管理员身份运行了vs,没有问题..谢谢你的指针
我遇到了类似的问题,但是在"强名称密钥文件"组合框中选择pfx并键入密码后,我仍然遇到了类似的错误(没有容器名称部分):
0
此外,没有填充"签署ClickOnce清单"证书信息面板。
我在pfx上做了"从文件中选择…",它解决了这个问题。
我通过更改Visual Studio项目的.csproj文件中的以下行自行解决了此问题:
这引发了"无法导入"错误:
1 2 3
| <PropertyGroup>
<SignManifests>true</SignManifests>
</PropertyGroup> |
将值更改为false会使错误消失。
- 通常,程序集是为特定目的而签名的,删除签名清单会在某些环境中导致部署问题。所以这不是解决问题的办法
供参考
我使用带有-p标志的sn.exe作为官方代码签名pfx文件(购买时作为代码签名),如下所示创建了SNK文件,在Visual Studio 2013中浏览了SNK文件以供使用。
但问题仍然在于它一直在说:"密钥文件*.snk不包含公钥/私钥对。"
- 谢谢你让我读了一个不是真正答案的答案。你知道,这就是评论的目的。