MSBuild无法使用临时密钥签署ClickOnce清单(错误代码MSB3326和MSB3321)

12
我正在尝试在Windows Server计算机上构建一个ClickOnce Windows Forms项目(.NET 3.5 / Visual Studio 2010)。(为了使用Hudson CI自动化构建过程。) 为了签名ClickOnce清单,我在Visual Studio中创建了一个临时密钥temp.pfx。我可以成功地在我的工作站上从Visual Studio构建和部署该项目。但是,在服务器上运行MSBuild时,我收到以下错误消息:
"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets(1970,9):错误 MSB3326: 无法导入以下密钥文件:。该密钥文件可能受到密码保护。要纠正此问题,请尝试重新导入证书或将证书手动导入当前用户的个人证书存储区。[C:.hudson\jobs[...].csproj]" "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets(1970,9):错误 MSB3321: 取消导入密钥文件“temp.pfx”。[C:.hudson\jobs[...].csproj]" "

我尝试了所有以下的问题和答案,但没有成功:

"
  • Stack Overflow问题无法导入密钥文件'blah.pfx'-错误'密钥文件可能受到密码保护'

    => 在我的情况下,错误消息没有指示证书存储的名称,而是说“当前用户的个人证书存储”。

    => 即使尝试使用“Personal”作为容器名称执行接受的答案(sn -i temp.pfx personal),它仍然无法解析密钥:

    在ALiS_TemporaryKey.pfx中未能解析PKCS#12 blob--发生了内部错误。

  • Stack Overflow问题使用MSBuild签名ClickOnce或程序集会导致错误MSB3321

    => 我尝试了接受的答案,但无法导入密钥文件,因为 "要么用户配置文件不可访问,要么您导入的私钥可能需要在系统上未安装的加密服务提供程序"

    => 如果我尝试通过在Windows资源管理器中双击该文件来导入该文件,同样的事情也会发生(RobinDotNet的建议)

  • Stack Overflow问题使用PFX文件在MSBuild,Team Build和TFS中签名程序集

    => 该问题的OP也未能成功使用上述两个答案,但不幸的是,他得到的答案也无法帮助我:

    以在构建机器上运行MSBuild的用户身份登录,手动调用MSBuild,然后在提示时输入密码。

    => 我登录并运行了msbuild myproject.sln,但它甚至不会提示我输入密码。

    最终为我解决问题的是将TFS Build服务运行的帐户设置为本地计算机的管理员。

    => 运行Hudson(更确切地说:Tomcat)的帐户已经是本地管理员。我甚至尝试从以“管理员身份运行”命令行运行MSBuild,但仍然会收到相同的错误消息。


更新:我尝试在同一台服务器上使用Visual Studio打开解决方案并构建它。我得到了相同的错误。当我尝试在项目属性的签名选项卡中重新导入PFX文件时,它告诉我“密码无效”。如果我尝试在我的工作站上使用Visual Studio打开完全相同的解决方案并提供完全相同的密码来导入完全相同的文件,则会被接受。 更新2:如果我使用Visual Studio 2008生成的旧临时密钥,可以成功导入我们服务器的证书存储;但是,我使用Visual Studio 2010新创建的任何临时密钥都无法导入。 更新3:我能够在服务器上使用Visual Studio创建一个新的“临时密钥”,并将其用于服务器和我的工作站上签署ClickOnce清单。我只是无法对此做出合理的解释 - 两台计算机都是64位的,并且我在两台计算机上都使用Visual Studio 2010。两者都安装了v3.5和v4(4.0.30319).NET框架。我的工作站是Windows 7 Professional,而服务器是Windows Server 2008 R2 Standard。
4个回答

8
将PFX文件复制到进行构建的机器上。双击它,在机器上的证书管理器中安装它。确保您已登录用于进行构建的帐户。
其他建议/问题:您是否在机器上安装了正确版本的.NET?您是否有权限将证书存储写入该机器?如果打开Visual Studio项目,转到项目属性并尝试创建新证书,是否可以正常工作?它应该创建一个PFX文件并将其添加到项目中。您能在证书存储中看到它吗(开始/ certmgr.msc菜单)?

这导致了与我提到的第二种方法相同的结果 :-( - chiccodoro
我已经重新表述了问题,使得Hudson只是一个附注中的细节。 - chiccodoro
关于您的建议:我尝试了一下,它起作用了!然后我将其复制到自己的工作站上,并能够在那里使用它进行签名。只是有趣的是想知道显著的区别是什么-两台机器都是64位的,都有VS 2010。其中一台是Windows Server...已经相应地更新了我的问题。 - chiccodoro
2
这是我所知道的。我们有几个使用代码签名证书签名的ClickOnce项目。每年证书过期时,我们在TFS中的自动构建会失败。我们必须使用执行自动构建的帐户登录服务器并导入PFX文件。它必须在用户的证书存储中。否则,在进行构建时,它会尝试提示输入密码,但由于明显的原因而无法工作。我从未尝试将其放入机器存储中,但您可以尝试一下。如果需要,回复我并我会提供说明。 - RobinDotNet
如果您无法访问机器,比如我的情况是TFS在线托管服务,有什么方法可以进行签名吗? - Poul K. Sørensen
显示剩余4条评论

0

我发现,如果创建一个临时.pfx文件并将密码留空,则在构建机器上它可以正常工作。我之前没有意识到可以将密码留空,在第一次失败时像OP一样。我创建了一个没有密码的第二个临时.pfx,在构建服务器上为我构建成功。


一个没有密码的PFX并不是非常安全的 :-) - chiccodoro

0
我完全遇到了同样的问题。并通过在构建机器上安装 Windows SDK 7.1 for .net 4.0 来解决它。 PS 首先,我们安装了 SDK 8.0A,构建工作正常,除了签名。似乎 7.1 更新了系统中的一些组件,因此 pfx 开始工作了。

-1

我曾经遇到同样的问题,在TFS机器上无法导入。结果发现我必须在开发者机器上导出它(项目属性,签名页面,点击更多细节) 更详细地说 -> 选项卡详细信息,然后只需使用密码导出即可。将导出的文件复制到TFS并使用相同的密码:完成


这些步骤过于模糊,无法真正有用。 - Nathaniel Ford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接