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


当前回答

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

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

其他回答

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

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

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

保存项目并重新构建。 如果得到错误消息:“试图引用一个不存在的令牌”,请忽略它并继续以下步骤 点击“更改密码”按钮:

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

更多信息…

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

sn通常作为Windows SDK的一部分安装。例如C:\Program Files (x86)\Microsoft sdk \Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe。这个位置很可能不在标准环境的搜索路径上。但是,Visual Studio安装的“开发人员命令提示符”添加了额外的信息,通常包括正确的位置。

根据你的帖子看来

Sn -i公司名称。可以VS_KEY_3E185446540E7F7A

这必须从你的PFX文件的位置运行,如果你在VS 2010中加载了解决方案,你可以简单地从解决方案资源管理器中右键单击PFX文件,并选择打开命令提示符,这将在正确的目录中启动。net 2010 cmd提示符工具。

在运行这个sn命令之前,我确实重新安装了pfx,右键单击它并选择安装,但这并不奏效。只是需要注意的一点,因为它可能是两者的结合提供了解决方案。

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

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

我知道这是一个老问题了,但是大多数答案在其他devops系统上都不起作用了。VS_KEY_xxx在虚拟机上是不同的,所以我们不能使用sn.exe。

这是我在GitHub Actions中使用的yaml脚本来构建我的VSTO项目,这需要点击一次。其实在“run:”之后只需要两行powershell:

- name: Import certificate
  shell: pwsh
  run: |
    $Secure_String_Pwd = ConvertTo-SecureString "<Password>" -AsPlainText -Force
    Import-PfxCertificate -FilePath '${{github.workspace}}\project\project1_TemporaryKey.pfx' -CertStoreLocation Cert:\CurrentUser\My -Password $Secure_String_Pwd

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