我们刚刚将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安装和微软代码签名。


当前回答

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

获取一份OpenSSL。它适用于Windows。或者使用Linux盒子,因为他们几乎都有。 执行如下命令导出密钥文件: Openssl pkcs12 -in certfile. exePFX -out backupcertfile.key Openssl pkcs12 -export -out certfiletosignwith。PFX -keysig -in backupcertfile.key

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

其他回答

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

行为

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

原因

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

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

解决方案

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

Create a separate certificate for your strong name using sn -k [name].snk. Sign the assembly using the snk and afterwards use signtool with your code signing certificate to do sign the DLL/EXE with the authenticode signature. While this seems strange, from what I understand this is a correct way to deal with certificates, because strong names have a different purpose than authenticode (see also this link for details on how this works). Import your certificate as KeySpec=2. The procedure for this is detailed here.

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


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

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

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

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

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

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

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

双击Package.appxmanifest

进入包装选项卡

点击选择证书

单击配置证书

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

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

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

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