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

时间:2014-12-16 15:46:07

标签: msbuild certificate clickonce code-signing tfs2013

我们有一个业务应用程序,通过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的位置。

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

<小时/> 修改

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

<小时/> 编辑2: 我尝试使用以下命令通过命令行构建项目:

  

&#34; C:\ Program Files(x86)\ MSBuild \ 12.0 \ bin \ amd64 \ MSBuild.exe&#34; C:\构建\ 1个\脉冲\ DefaultBuild \ SRC \脉冲\ Pulse.sln

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

  

CleanPublishFolder:删除目录&#34; bin \ Debug \ app.publish \&#34;。   _DeploymentComputeClickOnceManifestInfo:创建目录&#34; bin \ Debug \ app.publish&#34;。
  从&#34; obj \ Debug \ Pulse.exe&#34;复制文件至   &#34; BIN \调试\ app.publish \ Pulse.exe&#34 ;. C:\ Program Files   (86)\的MSBuild \ 12.0 \ BIN \ AMD64 \ Microsoft.Common.CurrentVersion.targets(3450,5):   错误MSB3482:注册时出错:SignTool.exe没有   找到。 [C:\构建\ 1 \脉冲\ DefaultBuild \ SRC \脉冲\脉冲\ Pulse.csproj]   完成建筑项目   &#34; C:\构建\ 1 \脉冲\ DefaultBuild \ SRC \脉冲\脉冲\ Pulse.csproj&#34; (默认   目标) - 失败。

     

完成建筑项目   &#34; C:\构建\ 1 \脉冲\ DefaultBuild \ SRC \脉冲\ Pulse.sln&#34; (默认目标)    - 失败。

     

构建失败。

     

&#34; C:\构建\ 1 \脉冲\ DefaultBuild \ SRC \脉冲\ Pulse.sln&#34; (默认目标)   (1) - &gt; &#34; C:\构建\ 1 \脉冲\ DefaultBuild \ SRC \脉冲\脉冲\ Pulse.csproj&#34;   (默认目标)(2) - &gt; (_DeploymentComputeClickOnceManifestInfo   目标) - &gt; C:\ Program Files   (86)\的MSBuild \ 12.0 \ BIN \ AMD64 \ Microsoft.Common.CurrentVersion.targets(3450,5):   错误MSB3482:sig ning时发生错误:SignTool.exe没有   找到。 [C:\构建\ 1 \脉冲\ DefaultBuild \ SRC \脉冲\脉冲\ Pulse.csproj]

0 Warning(s)
1 Error(s)

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

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

  

&#34; C:\的Windows \ Microsoft.NET \框架\ v4.0.30319 \ MSBuild.exe&#34;   C:\构建\ 1个\脉冲\ DefaultBuild \ SRC \脉冲\ Pulse.sln

<小时/> 编辑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)

<小时/> 编辑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和命令行)没有任何问题地构建项目。

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

我被困在这里。有什么想法吗?

7 个答案:

答案 0 :(得分: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. (可选)在某些情况下,您需要重建它。
  7. enter image description here

    如果无法使用,请尝试取消选中 enable ClickOnce security settings 标签上的 Security

    enter image description here

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:2)

尝试通过选择&#34;从商店中选择&#34;

,在项目属性的签名选项卡中添加证书

尝试点击&#34;创建测试证书&#34; ...

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

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

“ SignManifests”属性组。

祝你好运!

答案 5 :(得分:0)

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

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

答案 6 :(得分:-1)

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

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