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

Posted

技术标签:

【中文标题】MSBuild 无法使用临时密钥签署 ClickOnce 清单(错误 MSB3326 和 MSB3321)【英文标题】:MSBuild cannot sign a ClickOnce manifest using a temporary key (errors MSB3326 and MSB3321) 【发布时间】:2012-06-24 17:34:44 【问题描述】:

我正在尝试在 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]

我尝试了以下所有问题和答案,但没有运气:

堆栈溢出问题Cannot import the keyfile 'blah.pfx' - error 'The keyfile may be password protected'

=> 在我的例子中,错误消息没有指明证书存储的名称,而是显示“当前用户的个人证书存储”。

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

无法解析 ALiS_TemporaryKey.pfx 中的 PKCS#12 blob -- 内部错误 发生了。

堆栈溢出问题Using MSBuild to sign ClickOnce or assembly results in error MSB3321

=> 我尝试了接受的答案,但无法导入密钥文件,因为 “用户配置文件不可访问,或者您正在导入的私钥可能需要未安装在您的密码服务提供商上系统”

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

堆栈溢出问题Signing assemblies with PFX files in MSBuild, Team Build, and 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。

【问题讨论】:

【参考方案1】:

将 PFX 文件复制到您正在构建的机器上。双击它,并将其安装在机器上的证书管理器中。确保您已登录用于进行构建的帐户。

其他建议/问题:您的机器上是否安装了正确版本的 .NET?您是否有权写入该机器上的证书存储区?

如果你打开 Visual Studio 项目,进入项目属性并尝试创建一个新证书,是否有效?它应该创建一个 PFX 文件并将其添加到项目中。你能在证书存储中看到它吗(菜单 Start/certmgr.msc)?

【讨论】:

这与我提到的第二种方法相同:-( 说实话,我不知道“哈德森”是什么。您是否在机器上安装了正确版本的 .NET?另外,您是否有权写入该机器上的证书存储区?如果您打开 Visual Studio 项目并转到项目属性并尝试创建新证书,它可以工作吗?它应该创建一个 pfx 文件并将其添加到项目中。您可以在证书商店中看到它吗? (开始/certmgr.msc) 我已经改写了这个问题,例如让 Hudson 成为旁注中的一个细节。 至于您的建议:我试过了,它成功了! 然后我把它复制到我自己的工作站上,也可以用它在那里签名。知道显着差异是什么会很有趣 - 两者都是带有 VS 2010 的 64 位机器。一个是 Windows Server ...已相应地更新了我的问题。 嗯,这就是我所知道的。我们有几个使用代码签名证书签名的 ClickOnce 项目。每年证书到期时,我们在 TFS 中的自动构建都会失败。我们必须以执行自动构建的帐户登录服务器并导入 PFX 文件。它必须在用户的证书存储中。否则,当它进行构建时,它会尝试提示输入密码,由于显而易见的原因,这不起作用。我从来没有试过把它放在机器商店里,但你可以试试。回帖,如果您需要,我会提供说明。【参考方案2】:

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

【讨论】:

这些步骤太模糊,没有真正的用处。【参考方案3】:

我发现如果您创建一个临时的.pfx 文件并将密码保留为 EMPTY,那么它将在构建机器上正常工作。我没有意识到你可以把它留空,而且它第一次失败就像 OP 一样。创建了第二个没有密码的 temp.pfx,它为我构建在构建服务器上。

【讨论】:

没有密码的 PFX 不是很安全 :-)【参考方案4】:

我遇到了同样的问题。并通过在构建机器上安装适用于 .net 4.0 的 Windows SDK 7.1 来修复它。 PS 起初我们已经安装了 SDK 8.0A,并且构建工作正常,除了唱歌。看来,7.1更新了系统中的一些组件,所以pfx开始工作了。

【讨论】:

以上是关于MSBuild 无法使用临时密钥签署 ClickOnce 清单(错误 MSB3326 和 MSB3321)的主要内容,如果未能解决你的问题,请参考以下文章

signrawtransactionwithwallet 显示错误无法签署输入,无效堆栈大小(可能缺少密钥)

如何使用元掩码密钥签署超级账本锯齿交易?

如何找出用于签署应用程序的密钥库?

如何使用 gradle 使用平台密钥签署 android 应用程序?

使用 Google Play 上传密钥签署 APK

如何使用 Google 签名密钥签署 apk 以上传到其他应用商店