gpt4 book ai didi

azure-devops - 在Azure DevOps管道中安全签署ClickOnce应用程序

转载 作者:行者123 更新时间:2023-12-03 16:23:40 29 4
gpt4 key购买 nike

我正在尝试使用ClickOnce应用程序在Azure DevOps中进行CI/CD。使用托管代理时,如何在构建过程中安全地提供我的代码签名证书?

注意我知道您可以按照Visual studio team services deploymen/buildt certificate error的建议使用脚本。但是,这种方法并不安全。证书将被加载到托管代理正在运行的帐户的证书存储中。这将允许代理以及其他Azure DevOps帐户潜在地访问和使用证书。

最佳答案

该问题的解决方案是重写内置任务SignFile。有趣的是,SignFile任务使用了Microsoft.Build.Tasks.Deployment.ManifestUtilities.SecurityUtilities.SignFile中的内置函数,该函数具有两个重载,一个重载使用指纹,另一个重载使用文件和密码。

然后的解决方案是创建一个新任务,该任务可以引用其他重载。由于我们无法更改调用SignFile,因此我们需要维护相同的签名,并将适当的变量放在环境变量中。在这种情况下,“CertificateFile”和“CertificatePassword”。

然后在覆盖的SignFile中引用这两个。我要做的是创建一个新的目标文件(filesign.targets)并将代码放置在那里。 checkin 到我的存储库中,并从主项目文件中引用了它。<Import Project="filesign.targets" />
这样,我们还可以将 key 文件保存在Azure key 保管库中,在构建时加载它们,并为该构建提供唯一的密码。

目标文件包含新的FileSign任务:

<?xml version="1.0" encoding="Windows-1252"?>
<!--
***********************************************************************************************
Microsoft.VisualStudio.Tools.Office.targets

WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and have
created a backup copy. Incorrect changes to this file will make it
impossible to load or build your projects from the command-line or the IDE.

This file defines the steps in the standard build process specific for Visual Studio Tools for
Office projects.

Copyright (C) Microsoft Corporation. All rights reserved.
***********************************************************************************************
-->

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<UsingTask TaskName="SignFile" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">

<ParameterGroup>
<SigningTarget Required="true" ParameterType="Microsoft.Build.Framework.ITaskItem" />
<CertificateThumbprint ParameterType="System.String" />
<TargetFrameworkVersion ParameterType="System.String" />
<TimestampUrl ParameterType="System.String" />
<CertificateFile ParameterType="System.String" />
<CertificatePassword ParameterType="System.String" />
</ParameterGroup>
<Task>
<Reference Include="mscorlib" />
<Reference Include="Microsoft.Build.Tasks.Core" />
<Using Namespace="System" />
<Code Type="Fragment" Language="cs">
<![CDATA[
var EnvCertFile = System.Environment.GetEnvironmentVariable("CertificateFile");

Log.LogMessage("CertFile:!!" + EnvCertFile);

if (string.IsNullOrWhiteSpace(CertificateFile) && string.IsNullOrWhiteSpace(EnvCertFile)) {
var signFile = new Microsoft.Build.Tasks.SignFile();
signFile.CertificateThumbprint = CertificateThumbprint;
signFile.SigningTarget = SigningTarget;
signFile.TargetFrameworkVersion = TargetFrameworkVersion;
signFile.TimestampUrl = TimestampUrl;
return signFile.Execute();
} else {

var certificate = string.IsNullOrWhiteSpace(CertificateFile) ? EnvCertFile : CertificateFile;
var EnvCertPassword = System.Environment.GetEnvironmentVariable("CertificatePassword");
var certificatePassword = string.IsNullOrWhiteSpace(CertificatePassword) ? EnvCertPassword : CertificatePassword;
var testString = new System.Security.SecureString();
// Use the AppendChar method to add each char value to the secure string.
if (!string.IsNullOrWhiteSpace(certificatePassword))
foreach (char ch in certificatePassword)
testString.AppendChar(ch);
Microsoft.Build.Tasks.Deployment.ManifestUtilities.SecurityUtilities.SignFile(certificate, testString,
TimestampUrl == null ? null : new Uri(TimestampUrl),
SigningTarget.ItemSpec);
return true;
}

]]>
</Code>
</Task>
</UsingTask>
</Project>

代码基于:
https://gist.github.com/KirillOsenkov/4cd32c40bffd3045f77e

引用:
https://github.com/Microsoft/msbuild/blob/fc10ea8ce260b764bb9fa5033b327af9fefcaabe/src/Tasks/ManifestUtil/SecurityUtil.cs
https://github.com/Microsoft/msbuild/blob/master/src/Tasks/SignFile.cs

关于azure-devops - 在Azure DevOps管道中安全签署ClickOnce应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53291017/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com