首页 文章

无法导入密钥文件'blah.pfx' - 错误'The keyfile may be password protected'

提问于
浏览
367

我们刚刚将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安装和Microsoft代码签名 .

22 回答

  • 2

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

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

    我仍然无法在我们的构建服务器计算机上签署程序集 . 我在那里得到相同的错误,但是使用sn.exe -i方法不能解决buildserver的问题 .

  • 3

    作为一种解决方法,我尝试以管理员身份运行Visual Studio 2010,它对我有用 .

    我希望这有帮助 .

  • 5

    我发现在某些情况下你应该尝试 delete 这个键 before 你安装它 . 所以做以下事情:

    • sn -d VS_XXXX

    • sn -i mykey.pfx VS_XXX

  • 26

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

    对于一个变体,您可以使用sn.exe(通常在执行强命名时)将密钥导入强命名存储区 .

    您使用certmgr导入的另一个变体是当您为单击一次部署(例如,为两个目的使用相同的证书)进行代码签名时 .

    希望这可以帮助 .

  • -3

    VSCommands 2010(Visual Studio插件)可以自动为您解决此问题 - 只需右键单击错误,然后单击菜单中的“应用修复” . 你可以get it from Visual Studio gallery .

  • 0

    我在“选择一个强名称密钥文件”下拉框中重新选择了Key(pfx)文件,然后在“ENTER PASSWORD”弹出窗口中提供了密码 . 保存了我的项目并成功完成了rebuild.build .

    • 打开项目属性 .

    • 单击“签名”部分 .

    • 如果显示“选择强名称密钥文件:”,请从下拉框中重新选择当前值:

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

    • 保存项目并进行重建 .

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

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

    • 在所有三个框中输入原始密码,然后单击“确定” . 如果您想更改密码(或者如果您的旧密码不符合复杂性要求),您现在可以这样做 .

    • 保存项目并进行重建 .

    More Info..

  • 118

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

    但是每次密钥文件发生变化时都需要这样做,而且似乎不行 .

  • 421

    我说得太快了!重建使错误重新发挥作用......

    我发现这有效 - 右键单击Solution Explorer并将其从项目中排除 . 单击“显示所有文件”,右键单击,然后再次将其包含在项目中 . 现在撤消挂起的更改......

    由于某种原因,这为我排序,并且相对无痛!

  • 1

    我的问题是TFS Build Controller作为网络服务运行,出于某种原因我不明白为什么没有使用Visual Studio Build Host服务证书 . 我将Visual Studio Build服务的身份更改为更易于管理的内容,确保它在TFS服务器上拥有权限,并使用MMC手动添加证书 .

    问题还在于MSBuild无法将受密码保护的证书添加到商店 .

  • 0

    没有什么对我有用,但后来我去看了证书管理器(mmc.exe) . 证书未导入个人存储区,因此我手动导入它,然后导入项目编译 .

    ClickOnce Manifest Signing and Strong-Name Assembly Signing Using Visual Studio Project Designer's Signing Page, Signing Assemblies .

  • 39

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

    Behavior

    我知道'sign'将强名称而不是authenticode应用于DLL或EXE . 这就是为什么signtool在这种情况下会起作用的原因,但Visual Studio中的'sign'将无效 .

    Reason

    在过去,我有过Verisign证书的经验 . 它们在证书中有 KeySpec=2 - 与Visual Studio中的'sign'功能一起使用 . 这些证书适用于Visual Studio和signtool .

    我现在从Comodo购买了证书,这些证书在代码签名证书中有错误的 KeySpec=1 . 这意味着这些证书可以与signtool(authenticode)一起使用,但不能使用强命名(符号下拉列表) .

    Solution

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

    • 使用 sn -k [name].snk 为强名称创建单独的证书 . 使用snk对程序集进行签名,然后使用带有代码签名证书的signtool,使用authenticode签名对DLL / EXE进行签名 . 虽然这看起来很奇怪,但根据我的理解,这是处理证书的正确方法,因为强名称的目的与authenticode不同(有关其工作原理的详细信息,请参阅this link) .

    • 将证书导入为 KeySpec=2 . 这个过程是detailed here .

    因为我想使用多个强名称,所以我目前使用选项(1),尽管选项(2)也有效 .


    为确保此解决方案永远不会丢失,以下是解决方案2的过程:

    • 使用"Certifiates" MMC将现有密钥集( KeySpec=1 )导出到PFX文件 . 注意:请将此文件备份到安全位置并测试文件是否可以在另一台机器上正确导入,如果您真的想要安全地播放它!

    • 从加密存储中删除现有证书(使用MMC进行stlll) .

    • 打开CMD提示 .

    • 使用以下命令导入PFX文件:

    • certutil -importPFX -user <pfxfilename> AT_SIGNATURE

    • 在提示时输入pfx的密码 .

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

  • 31

    在我的方案中,构建服务没有使用我使用 sn.exe 导入密钥的同一用户帐户 .

    将帐户更改为我的管理员帐户后,一切正常 .

  • 30

    我通过更改Visual Studio项目的.csproj文件中的以下行来解决此问题:

    这引发了'无法导入'错误:

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

    将值更改为false会使错误消失 .

  • 10

    我也遇到了这个问题 . 我能够通过运行解决问题
    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,但这不起作用 . 需要注意的是,它可能是提供解决方案的两者的组合 .

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

  • 3

    将我的Windows安装移动到SSD后,我遇到了同样的问题 . 没有其他解决方案适合我 .

    我的解决方案是在Notepad中打开项目文件并删除对PFX密钥的所有引用 . 保存文件后,在Visual Studio中打开解决方案 . 转到项目 - >属性 - >签名 . 你不应该't see any keys listed in the '选择强名称密钥文件'组合框 . 在组合框中,浏览到密钥,选择它,现在可以构建项目 .

  • 2

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

    无法导入以下密钥文件:companyname.pfx . 密钥文件可能受密码保护 . 要更正此问题,请尝试再次导入证书或手动安装证书

    此外,未填充“签署ClickOnce清单”证书信息面板 .

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

  • 2

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

    双击Package.appxmanifest

    转到“打包”选项卡

    单击选择证书

    单击配置证书

    从文件中选择并使用example.pfx表示统一或其他任何创建

  • 1

    要在Visual Studio 2012中解决此问题,请右键单击项目,属性 - >“签名”,然后取消选中“签署ClickOnce清单” .

  • 1

    FYI

    我使用带有 -p 标志的sn.exe到官方代码签名PFX文件(购买代码签名),如下所示创建 SNK 文件,并在 Visual Studio 2013 中浏览 SNK 文件以供使用 .

    • 解决了密码问题 .

    但问题仍然是它一直说:“密钥文件* .. SNK不包含公钥/私钥对 . ”

    enter image description here

  • 23

    我有同样的问题,删除商店和阅读不起作用 . 我必须做以下事情 .

    • 获取OpenSSL的副本 . 这是available for Windows . 或者使用Linux机器,因为它们几乎都拥有它 .

    • 运行以下命令以导出到密钥文件:

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

    然后在项目属性中,您可以使用PFX文件 .

  • 4

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

  • 1

    好的,这对我有用 . 在Visual Studio 2010中以管理员身份打开旧解决方案/项目,然后打开新的或复制的解决方案/项目 . 作为管理员,在新的Visual Studio 2010解决方案/项目中删除复制的pfk文件,然后转到项目属性并取消选择它 .

    打开两个项目后,将粘贴复制到新项目 . 转到项目属性,然后选择“构建” . 我打开并关闭Visual Studio,并在从新项目中删除之后构建它,然后从旧项目中复制并选择它 . 当我复制项目并尝试构建它时,我在第一篇文章的开头就收到了错误 .

相关问题