【问题标题】:The "SignFile" task was not given a value for the required parameter "CertificateThumbprint"没有为“SignFile”任务指定所需参数“CertificateThumbprint”的值
【发布时间】:2015-02-14 23:42:35
【问题描述】:

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

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

错误 MSB4044: 没有为“SignFile”任务指定所需参数“CertificateThumbprint”的值。

[C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj]

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

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

证书存储在我本地工作站的证书存储中。证书也在构建服务器的证书存储中(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: 我尝试使用以下命令通过命令行构建项目:

"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:\程序文件 (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 目标)-> C:\Program 文件 (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]

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


编辑 3:

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

但是 TFS 构建失败。

这是从 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\ 文件夹中存储的所有 *.targets 文件与客户端计算机上相同位置的 *.targets 文件进行了比较。有 100% 相同。

不用说,我可以在我的客户端机器上毫无问题地构建项目(通过 VS2013 和命令行)。

我删除并重新注册/创建了构建服务/控制器/代理。结果还是一样。

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

【问题讨论】:

  • 你在构建服务器上也安装了私钥吗?
  • 是的。证书也在构建服务器的证书存储中(1. 在个人存储中,2. 在 TFSBuildServiceHost 服务帐户的个人存储中,3. 在 tfs/构建服务器本身的个人存储中)。
  • 证书在构建服务器上并不意味着安装了私钥。如果您尝试从构建服务器导出它,您是否会看到“使用私钥导出”选项?
  • 是的,我被要求输入私钥的密码。但是我没有选中“将此密钥标记为可导出”选项。因此我无法导出它。
  • 是 VS 2013 更新 4 破坏了它吗?我有同样的问题,这是我第一次发现其他人有这个问题。你解决了吗?

标签: msbuild certificate clickonce code-signing


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我认为建议以用户身份运行构建进程。我们使用我们的“域\TfsBuild”-用户。所以我可以用这个账号登录 Build-Server 并安装证书。
    • 我使用 TfsBuildService,因为名称更具描述性。
    【解决方案3】:

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

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

    【讨论】:

    • 但是项目不再签名。签约是我们在合作环境中必须要做的事情。
    • 我不确定究竟是什么原因造成的,因为我们正在使用源代码控制。我可能没有获得所有必需的文件,或者创建签名文件的人忘记包含所有必需的文件。因此,为什么我将我的答案添加为快速解决方案并且不建议将其作为永久解决方案。您需要检查所有文件是否存在且未损坏。
    • 不签有危险吗?
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      注意:如果您正在寻找快速修复和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. (可选)在某些情况下,您需要重建它。

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

      【讨论】:

        【解决方案6】:

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

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

        “SignManifests”属性组。

        祝你好运!

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            猜你喜欢
            • 2019-01-09
            • 1970-01-01
            • 2021-03-29
            • 2012-09-17
            • 1970-01-01
            • 2021-07-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多