当前位置: 首页 > 面试题库 >

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

霍襦宗
2023-03-14
问题内容

我正在尝试在Windows Server计算机上构建ClickOnceWindows窗体项目(.NET 3.5 / Visual
Studio 2010)。 (为了使 Hudson
CI自动化构建过程,请执行以下操作。)

为了签署ClickOnce清单,我在VisualStudio中创建了一个临时密钥temp.pfx。我可以从工作站上的VisualStudio成功构建和部署项目。但是在服务器上运行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]

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

  • 堆栈溢出问题 无法导入密钥文件’blah.pfx’-错误’密钥文件可能受到密码保护’

=>就我而言,该错误消息并不表示证书存储的名称,而是显示“当前用户的个人证书存储”。

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

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

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

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

=>该问题的操作也无法通过以上两个答案获得成功,但不幸的是,即使他得到的答案也无法帮助我:

以在生成计算机上运行MSBuild的用户身份登录,手动调用MSBuild,然后在出现提示时输入密码。

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

最终为我解决的问题是使用TFS Build服务在本地计算机上运行管理员的帐户。

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

更新: 我试图在同一服务器上的VisualStudio中打开解决方案并进行构建。我犯了同样的错误。当我尝试在项目属性的“签名”选项卡中重新导入PFX文件时,它告诉我“无效密码”。如果我尝试在工作站上VisualStudio的完全相同的解决方案中导入完全相同的文件并提供相同的密码,则该密码将被接受。

更新2: 如果我使用Visual Studio2008生成的旧临时密钥,则可以成功将其导入到我们服务器的证书存储中;我使用Visual
Studio 2010新创建的任何临时密钥都无法导入。

更新3: 我能够在服务器上的Visual
Studio中创建一个新的“临时密钥”,并在服务器和我的工作站上都​​使用它来签署ClickOnce清单。我只能对此做出合理的解释-
两台计算机都是64位,并且我都在使用Visual Studio
2010。两者都安装了v3.5和v4(4.0.30319).NET框架。我的工作站是Windows 7 Professional,服务器是WindowsServer 2008 R2 Standard。


问题答案:

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

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

如果您打开VisualStudio项目,请转到项目属性并尝试创建一个新证书,它有效吗?它应该创建一个PFX文件并将其添加到项目中。并且可以在证书存储区(菜单Start /certmgr.msc)中看到它吗?



 类似资料:
  • 我想在客户端设备上使用通过Ed25519生成的私钥对JWS(json web签名)进行签名。然后将这个签名发送到我的后端,并用公钥验证它。为了熟悉这个过程,我想尝试在node js中对JWS进行签名和验证 我的私钥和公钥都已生成,可以在base58中使用。这是我目前使用Ed25519私钥签署JWT的尝试: 密钥必须是KeyObject或CryptoKey类型之一。收到一个Uint8Array的实例

  • 我正在intellij和Gradle下开发android应用程序。并使用以下方式生成密钥库文件: 然后使用build.gradle中的密钥库文件: 任务“:MyExample:PackageRelease”执行失败。 无法从密钥存储区读取密钥

  • 我有一个entity: 按原样使用: 问题是当我想保存一个瞬态的与自动生成的作为: 我得到了一个愚蠢的例外: stacktrace中的项目是: 如上图所示,我尝试了(作为,和)的不同构造函数,并将构造函数添加到。接下来是执行,而不是,但没有任何帮助。 提前谢谢。 编辑Getters和Setters在那里。我使用创建函数实现为:

  • 我在nodejs中有一个非常小的代码,我在其中签名一个字符串,然后尝试使用openssl生成的节点密码和密钥对来验证它。无论我尝试什么,结果总是“错误”,签名无法验证。 生成公钥/私钥对: 生成的密钥是(我不在乎是否公开): 然后,这是我的节点代码: 我尝试使用不同的算法和编码。我已经读了带有"fs"的PEM文件,也没有运气。我错过了什么?顺便说一句,这些键使用npm URSA模块完美工作,所以我

  • 我有一个现有的密钥库,里面有一个密码,还有几个不同密码的密钥,供我导出并上传到Google Play的不同应用程序使用。 现在,我最近导入了一个应用程序的项目,对它做了一些重大的修改,我正在尝试使用相同的密钥库和选择相同的别名/密码来导出它,就像我最初创建它时一样。 问题是,在我选择密钥别名并输入密钥密码的步骤之后,我看到“错误:无法恢复密钥”。 我怀疑我可能输入了一个错误的密钥密码(注意密钥库密