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