“SignFile”任务没有为必需参数“CertificateThumbprint”赋值

问题描述 投票:9回答:7

我们有一个业务应用程序,通过clickonce部署。我可以毫无问题地构建和发布应用程序,但是当我尝试使用持续集成(构建每个签入)时,我收到以下错误:

 2>C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets(3450,5):

错误MSB4044:“SignFile”任务未获得所需参数“CertificateThumbprint”的值。

[C:\构建\ 1 \脉冲\ DefaultBuild \ SRC \脉冲\脉冲\ Pulse.csproj]

完成执行任务“SignFile” - 失败。

我们使用代码签名证书签署应用程序(更具体地说:ClickOnce清单),该证书在AD中注册为Trusted Publisher。

证书存储在我本地工作站的证书存储中。证书也位于构建服务器的证书存储区中(1.在个人存储中,2。在TFSBuildServiceHost服务帐户的个人存储中,以及3.在tfs /构建服务器本身的个人存储中)。

哪里使用Visual Studio 2013 Update 4,C#,。Net 4.5和TFS 2013 Update 4。

我不知道导致此错误的原因,任何帮助表示赞赏。


EDIT:

我忘了提到几周前tfs构建工作正常。我没有更改任何东西,我验证了项目文件(Pulse.csproj)没有改变,我也有一些成功的构建与精确的Pulse.csproj文件/构建定义。我很确定它必须是tfs服务器上的东西。我记得微软在证书基础设施的某些更新方面有些问题吗?


EDIT 2: I tried to build the project via command line using this command:

“C:\ Program Files(x86)\ MSBuild \ 12.0 \ bin \ amd64 \ MSBuild.exe”C:\ Builds \ 1 \ Pulse \ DefaultBuild \ src \ Pulse \ Pulse.sln

构建失败,并显示以下消息:

CleanPublishFolder:删除目录“bin \ Debug \ app.publish \”。 _DeploymentComputeClickOnceManifestInfo:创建目录“bin \ Debug \ app.publish”。 将文件从“obj \ Debug \ Pulse.exe”复制到“bin \ Debug \ app.publish \ Pulse.exe”。 C:\ Program Files(x86)\ MSBuild \ 12.0 \ bin \ amd64 \ Microsoft.Common.CurrentVersion.targets(3450,5):错误MSB3482:注册时发生错误:找不到SignTool.exe。 [C:\ Builds \ 1 \ Pulse \ DefaultBuild \ src \ Pulse \ Pulse \ Pulse.csproj]完成构建项目“C:\ Builds \ 1 \ Pulse \ DefaultBuild \ src \ Pulse \ Pulse \ Pulse.csproj”(默认目标) ) - 失败。

完成构建项目“C:\ Builds \ 1 \ Pulse \ DefaultBuild \ src \ Pulse \ Pulse.sln”(默认目标) - 失败。

建立失败。

“C:\ Builds \ 1 \ Pulse \ DefaultBuild \ src \ Pulse \ Pulse.sln”(默认目标)(1) - >“C:\ Builds \ 1 \ Pulse \ DefaultBuild \ src \ Pulse \ Pulse \ Pulse.csproj “(默认目标)(2) - >(_ DeploymentComputeClickOnceManifestInfo target) - > C:\ Program Files(x86)\ MSBuild \ 12.0 \ bin \ amd64 \ Microsoft.Common.CurrentVersion.targets(3450,5):错误MSB3482:An sig ning时发生错误:找不到SignTool.exe。 [C:\构建\ 1 \脉冲\ DefaultBuild \ SRC \脉冲\脉冲\ Pulse.csproj]

0 Warning(s)
1 Error(s)

Signtool肯定存在于服务器上。 signtool的路径是:“C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.1A \ Bin \ signtool.exe”和“C:\ Program Files \ Microsoft SDKs \ Windows \ v7.1 \ Bin \ signtool.exe”

最有趣的部分是我可以使用不同的msbuild工具构建解决方案。

“C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ MSBuild.exe”C:\ Builds \ 1 \ Pulse \ DefaultBuild \ src \ Pulse \ Pulse.sln


EDIT 3:

我安装了Windows Software Development Kit (SDK) for Windows 8,现在我可以通过命令行构建解决方案了。因此,代码签名证书已安装并可用。

但是TFS Build失败了。

以下是从tfsbuild日志文件收集的错误输出:

      Task "AL"
         C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\x64\AL.exe /culture:de /out:obj\Debug\de\Pulse.resources.dll /platform:AnyCPU /template:obj\Debug\Pulse.exe /embed:obj\Debug\Pulse.View.Localization.CreditsView.de.resources /embed:obj\Debug\Pulse.View.Localization.PulseMainWindow.de.resources
         Microsoft (R) Assembly Linker version 12.0.20806.33440
         Copyright (C) Microsoft Corporation. All rights reserved.

       Done executing task "AL".
     2>Done building target "GenerateSatelliteAssemblies" in project "Pulse.csproj".
     2>Target "CreateSatelliteAssemblies" in file "C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets" from project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (target "CoreBuild" depends on it):
     2>Done building target "CreateSatelliteAssemblies" in project "Pulse.csproj".
       Target "SetWin32ManifestProperties" skipped. Previously built successfully.
       Target "_DeploymentComputeNativeManifestInfo" skipped, due to false condition; ('$(GenerateClickOnceManifests)'!='true') was evaluated as ('true'!='true').
     2>Target "CleanPublishFolder" in file "C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets" from project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (target "_DeploymentComputeClickOnceManifestInfo" depends on it):
       Task "RemoveDir" skipped, due to false condition; ('$(PublishDir)'=='$(OutputPath)app.publish\' and Exists('$(PublishDir)')) was evaluated as ('bin\Debug\app.publish\'=='bin\Debug\app.publish\' and Exists('bin\Debug\app.publish\')).
     2>Done building target "CleanPublishFolder" in project "Pulse.csproj".
       Target "_DeploymentGenerateTrustInfo" skipped, due to false condition; ('$(TargetZone)'!='') was evaluated as (''!='').
     2>Target "_DeploymentComputeClickOnceManifestInfo" in file "C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets" from project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (target "GenerateApplicationManifest" depends on it):
       Task "Copy"
         Creating directory "bin\Debug\app.publish".
         Copying file from "obj\Debug\Pulse.exe" to "bin\Debug\app.publish\Pulse.exe".
       Done executing task "Copy".
       Using "SignFile" task from assembly "Microsoft.Build.Tasks.v12.0, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
       Task "SignFile"
     2>C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets(3450,5): error MSB4044: The "SignFile" task was not given a value for the required parameter "CertificateThumbprint". [C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj]
       Done executing task "SignFile" -- FAILED.
     2>Done building target "_DeploymentComputeClickOnceManifestInfo" in project "Pulse.csproj" -- FAILED.
     2>Target "_CheckForCompileOutputs" in file "C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets" from project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (target "_CleanGetCurrentAndPriorFileWrites" depends on it):
     2>Done building target "_CheckForCompileOutputs" in project "Pulse.csproj".
       Target "_SGenCheckForOutputs" skipped, due to false condition; ('$(_SGenGenerateSerializationAssembliesConfig)' == 'On' or ('@(WebReferenceUrl)'!='' and '$(_SGenGenerateSerializationAssembliesConfig)' == 'Auto')) was evaluated as ('Off' == 'On' or (''!='' and 'Off' == 'Auto')).
     2>Target "_CleanGetCurrentAndPriorFileWrites" in file "C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets" from project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (target "_CleanRecordFileWrites" depends on it):
       Task "ReadLinesFromFile"
       Done executing task "ReadLinesFromFile".
       Task "ConvertToAbsolutePath"
       Done executing task "ConvertToAbsolutePath".
       Task "FindUnderPath"
         Comparison path is "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse".
       Done executing task "FindUnderPath".
       Task "FindUnderPath"
         Comparison path is "C:\Builds\1\Pulse\DefaultBuild\bin\".
       Done executing task "FindUnderPath".
       Task "FindUnderPath"
         Comparison path is "obj\Debug\".
       Done executing task "FindUnderPath".
       Task "RemoveDuplicates"
       Done executing task "RemoveDuplicates".
     2>Done building target "_CleanGetCurrentAndPriorFileWrites" in project "Pulse.csproj".
     2>Target "_CleanRecordFileWrites" in file "C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets" from project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (target "CoreBuild" depends on it):
       Task "RemoveDuplicates"
       Done executing task "RemoveDuplicates".
       Task "MakeDir"
       Done executing task "MakeDir".
       Task "WriteLinesToFile"
       Done executing task "WriteLinesToFile".
     2>Done building target "_CleanRecordFileWrites" in project "Pulse.csproj".
     2>Done Building Project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (default targets) -- FAILED.
     1>Done executing task "MSBuild" -- FAILED.
     1>Done building target "Build" in project "Pulse.sln" -- FAILED.
     1>Done Building Project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse.sln" (default targets) -- FAILED.

Build FAILED.

       "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse.sln" (default target) (1) ->
       "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (default target) (2) ->
       (_DeploymentComputeClickOnceManifestInfo target) -> 
         C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets(3450,5): error MSB4044: The "SignFile" task was not given a value for the required parameter "CertificateThumbprint". [C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj]

    0 Warning(s)
    1 Error(s)


EDIT 4:

我们的构建服务器上未安装Visual Studio 2013。我已经浏览过日志文件,发现TFS Build使用存储在C:\ Program Files(x86)\ MSBuild \ 12.0 \ bin \ amd64 \中的MSBuild.exe。

由于我可以使用MSBuild.exe而不是TFS Build在构建服务器上构建项目,因此我可以确定证书本身不是问题。

我创建了一个新的构建定义而没有修改任何设置,但我仍然得到相同的错误消息。

我还在构建服务器上修复了TFS安装,但没有运气。

我将存储在服务器上的C:\ Program Files(x86)\ MSBuild \ 12.0 \ bin \ amd64 \ Folder中的所有* .targets文件与客户端计算机上相同位置的* .targets文件进行了比较。有100%相同。

毋庸置疑,我可以在我的客户机上(通过VS2013和命令行)没有任何问题地构建项目。

我删除并重新注册/创建了构建服务/控制器/代理。结果仍然相同。

我被困在这里有任何想法吗?

msbuild certificate clickonce code-signing tfs2013
7个回答
11
投票

注意:如果您正在寻找快速修复和it is okay for your project to not be signed,那么您可以这样做。当我在寻找示例代码和using this quick fix solves my problem instantly.时,我遇到了这个问题

  1. 转到项目属性
  2. 选择签名选项
  3. 取消选中“签署ClickOnce清单”
  4. 保存
  5. 重新运行它
  6. (可选)在某些情况下,您需要重建它。

enter image description here

如果它不起作用,请尝试取消选中可以位于enable ClickOnce security settings选项卡上的Security

enter image description here


5
投票

这就是我解决问题的方法:

我们的构建服务配置为NT AUTHORITY\NetworkService运行我只是将其更改为我自己的用户帐户。请注意,我已将* .pfx文件安装到个人证书存储区。

我想问题是用户NT AUTHORITY\NetworkService在证书库中没有所需的证书。我仍然不知道如何将证书添加到系统帐户的个人存储中。尽管如此,我的问题现在已经消失,尽管我不喜欢构建服务使用我的凭据运行的事实。


2
投票

尝试通过选择“从商店中选择”在项目属性的签名选项卡中添加证书

要么

尝试点击“创建测试证书”...


1
投票

您可能获得此问题的另一个原因是证书指纹已更改(即由于旧证书已过期而更新),并且您不再安装旧证书。这件事发生在我身上。

解决方案:在Visual Studio中打开项目,转到“签名”选项卡,单击“从存储中选择”并确保安装了正确的(新)证书。这解决了我的问题。


0
投票

当我遇到这个问题时,我使用文本编辑器编辑了.csproj文件。

我删除了“ManifestCertificateThumbprint”,“ManifestKeyFile”,“GenerateManifests”和

“SignManifests”属性组。

祝好运!!


0
投票

对于那些使用带有EV代码签名证书的CI遇到此问题的人。 EV代码签名证书使用加密狗或拇指驱动器,因此您必须在内部部署构建服务器并手动更新项目文件。

  1. 在VS中,右键单击您的项目并卸载它。
  2. 右键单击并编辑csproj文件。
  3. 查找或添加此条目 <PropertyGroup> <ManifestCertificateThumbprint>**Your Certificate Thumbprint Here**</ManifestCertificateThumbprint> </PropertyGroup>
  4. 将证书的指纹从构建服务器复制并粘贴到ManifestCertificateThumprint值中。
  5. 重新加载您的项目并签入。

-1
投票

我遇到过同样的问题。我用相当奇怪的方式把它整理出来。我去了项目属性,然后选择了“签名”选项。在它下面,我取消选中了SignO ClickOnce清单,并取消选中Sign the assembly选项。该项目后来运行。

这是一个危险的解决方案,不作为永久性解决方案提供。在我的情况下,我使用它只是因为我正在处理本地副本并需要做一些修复,所以我只需要让项目运行。在现实世界中,部署方案不会这样做。

© www.soinside.com 2019 - 2024. All rights reserved.