【问题标题】:Build fails when signing code in Azure Pipeline在 Azure Pipeline 中签署代码时生成失败
【发布时间】:2020-08-03 21:00:25
【问题描述】:

我已经搜索了我能想到的所有内容,但找不到解决方案。我有一个 ClickOnce 应用程序,我正在尝试使用我们内部证书颁发机构创建的证书进行签名。在我的本地机器上,我可以毫无问题地签署代码,但在尝试构建 Azure Pipeline 时,我开始遇到问题。

我首先尝试了在 VisualStudio 中检查“签署 ClickOnce 清单”的典型路线。然后我选择了证书并输入了密码。证书已导入证书存储区,我可以在本地计算机上构建。

在 Azure 中运行管道时,我收到一个错误,由于密码,无法导入证书。因此,我将 Azure 库中的 .pfx 文件添加为安全文件,并在我的管道中添加了两个任务 - 一个用于下载安全文件,另一个用于导入证书的 Powershell 任务。成功导入证书后,我的 VSBuild 任务开始失败并出现以下错误。

签名时发生错误:无法签名 {AppName.exe}。 SignTool 错误:签名者的证书对签名无效。

大多数 Google 出现此错误的结果是由于证书已过期,但我使用的证书是在过去一个月内刚刚生成的,并且已过期数年。

我尝试了无数不同的方法来让这个应用程序签名,所有这些都导致了同样的错误。其中一些尝试包括:

  • 使用 MSBuild 任务而不是 VisualStudio Build
  • 取消选中“Sign ClickOnce”并在 .csproj 文件中添加自定义目标以执行 signtool.exe 的命令,以便我可以微调要传递的参数
  • 在构建后使用 Powershell 脚本(无签名)尝试使用 Mage.exe 对清单进行签名

我已经与我们的服务器管理员和我们的 Active Directory 小组讨论过这个问题,但由于我们的组织主要处理 Web 应用程序,因此没有任何运气能够解决这个问题。这是我所知道的我们组织中唯一的 clickonce 应用程序。

此应用程序自 2013 年以来一直存在,仅供内部员工使用,但最近由于未签名而被赛门铁克隔离,因​​此我需要弄清楚如何对其进行签名并让它在 DevOps 中构建。

如果这有助于确定问题,我们的管道使用 On Prem 服务器 (Server 2012 R2)。

编辑:包含我在 .csproj 中尝试过的自定义目标示例。这是我添加时间戳 url 的最新尝试。我最初尝试不使用时间戳服务器。

另外,我尝试注释掉 AfterCompile 目标。构建将通过该部分,它实际上会使用 mage.exe 成功签署清单,但随后会在使用 signtool.exe 签署 setup.exe 的最后一个命令上失败。 似乎是 signtool.exe 的问题,不一定是证书的问题,因为 mage.exe 可以使用它进行签名。

<PropertyGroup>
  <CertPath>
  </CertPath>
  <CertPass>
  </CertPass>
  </PropertyGroup>
  <Target Name="AfterCompile" Condition="'$(Configuration)|$(Platform)' != 'Debug|x86' ">
  <Exec Command="&quot;C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\signtool.exe&quot; sign /f &quot;$(CertPath)&quot; /fd sha256 /p $(CertPass) /v /t &quot;http://timestamp.comodoca.com?td=sha256&quot; &quot;$(ProjectDir)obj\$(Platform)\$(ConfigurationName)\$(TargetFileName)&quot;" />
  </Target>
  <Target Name="SignManifest" AfterTargets="_DeploymentSignClickOnceDeployment" Condition="'$(Configuration)|$(Platform)' != 'Debug|x86' ">
  <Exec Command="&quot;C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools\mage.exe&quot; -Sign &quot;$(_DeploymentApplicationDir)$(_DeploymentTargetApplicationManifestFileName)&quot; -cf $(CertPath) -pwd $(CertPass)" />
  <Exec Command="&quot;C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools\mage.exe&quot; -Update &quot;$(PublishDir)$(TargetDeployManifestFileName)&quot; -AppManifest &quot;$(_DeploymentApplicationDir)$(_DeploymentTargetApplicationManifestFileName)&quot;" />
  <Exec Command="&quot;C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools\mage.exe&quot; -Sign &quot;$(PublishDir)$(TargetDeployManifestFileName)&quot; -cf $(CertPath) -pwd $(CertPass)" />
  <Exec Command="&quot;C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\signtool.exe&quot; sign /f $(CertPath) /fd sha256 /p $(CertPass) /v /t &quot;http://timestamp.comodoca.com?td=sha256&quot; &quot;$(PublishDir)\setup.exe&quot;" />
  </Target>

以及构建日志的相关部分。

【问题讨论】:

  • 如果您使用托管代理,您可以尝试自助代理。 unchecked the 'Sign ClickOnce' and added custom targets in the .csproj file to execute commands for signtool.exe so I could fine tune which parameters to pass你可以分享一个.csproj文件的样本和执行signtool.exe时的详细错误日志。
  • @penaunt 我们正在使用自托管代理。我还在原始帖子中添加了 .csproj 目标和构建日志的示例
  • 在本地cmd和管道中的cmd任务中分别运行signtool.exe命令,会不会两个地方都有错误?
  • @penaunt 不幸的是,我无法直接访问该服务器,但我会尝试与我们的服务器管理员联系,看看他们是否可以在该服务器上本地运行它。

标签: azure azure-pipelines clickonce signtool


【解决方案1】:

免责声明:我是此工具的所有者。

我最近为 Azure Pipelines 制作了一个开源插件,它可能会为您解决这个问题,available on the Azure DevOps Marketplace (source is MIT, available on GitHub)。它适用于托管或本地代理。

只需像往常一样构建您的应用(无需在构建管道中发布),然后将 ClickOnce 包任务设置为部署管道中的一个步骤。根据您在任务 UI 中选择的设置,它将在每个部署中创建应用程序和部署清单。文件是在 UI 中使用通配模式指定的,而不是从项目文件中读取。

对于签名,您可以通过指纹指定证书(如果它安装在构建服务器上),或者将其作为安全文件添加到 Azure DevOps(您可以使用安全管道变量来保护密码)。您还可以指定时间戳服务器。

鉴于您要迁移现有的软件包,我建议您在上传到部署位置之前先区分新旧清单以确认它们是正确的。

编辑: 此加载项不使用 Mage,它使用 MSBuild API 直接创建 ClickOnce 清单。我怀疑这与 MSBuild 和(因此)Visual Studio 使用的机制相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 2020-02-14
    • 1970-01-01
    相关资源
    最近更新 更多