azure-devops - 如何使用Azure Key Vault中的证书/ key 对使用Azure Pipelines构建的代码进行签名?

标签 azure-devops azure-pipelines azure-keyvault

我们正在从本地构建服务器迁移到Azure Pipelines。我们生产“收缩包装”桌面软件,因此显然,我们需要在发布所有二进制文件之前对其进行签名。我们当前的构建基础架构使用GlobalSign的USB硬件令牌来做到这一点,但是显然,当我们进行云构建时,这是行不通的-可悲的是,云没有配备USB端口:D

现在,GlobalSign最近启动了advertising Azure Key Vault作为密钥存储选项,他们非常乐意将其出售给我们,但是我不确定我们如何将其实际与构建管道集成(或者确实如此)是否有可能)。

有人真的做过这项工作吗?

最佳答案

我一直在与Azure Key Vault和Azure Pipelines作战,以使我们的代码签名并获得成功。所以这就是我发现的。

至关重要的是,用于代码签名的扩展验证(EV)证书与“普通” SSL证书完全不同。可以根据需要任意导出标准的,这意味着您可以将其上传到Azure Pipelines并与标准的Microsoft Sign Tool一起使用。

但是,一旦将EV证书放入Azure Key Vault中,它就不会以任何通常的方式发出。您必须使用Azure Sign Tool发现的出色的Anodyne above从管道中调用它

将您的证书放入Key Vault。您可以使用任何喜欢的证书颁发机构来生成证书,只要它们了解您将需要EV证书,并且至关重要的是,它具有硬件安全模块(HSM),而不是具有物理USB密钥的证书。任何基于云的系统(例如Key Vault)都需要HSM版本。

要获得从外部访问此证书的权限,您可以follow this page,但是请注意,它错过了一步。因此,请先阅读该文档,然后阅读以下概述的步骤,以设置Key Vault:


打开Azure门户,转到Azure Active Directory区域,然后创建一个App registration:输入一个令人难忘的名称,忽略Redirect URI并保存。
转到您的特定Key Vault,然后依次为Access control (IAM)Add role assignment。在select输入框中键入刚创建的应用程序的名称。还要选择一个Role,建议使用Reader,然后保存。
缺少的部分:仍在Key Vault中,单击Access policies菜单项。单击Add Access Policy并添加您的应用程序。 Certificate Permissions需要打勾Get。并且Key Permissions尽管您可能在此保管库中根本没有任何密钥,但仍需要具有GetSign。您会以为这两个将在证书烫发中...
返回到刚刚创建的应用程序。选择Certificates & secrets,然后选择上载证书(纯粹用于远程访问Key Vault的新证书)或创建client secret。如果是后者,请保留密码副本,您将不会再看到它!
在应用程序的Overview部分中将是Application (client) ID。这以及密码或证书将在稍后的管道任务中提供给Azure Sign Tool。


从Azure处理实际的代码签名需要许多步骤。以下内容适用于Microsoft托管的代理,尽管类似的问题将影响您拥有的任何私人代理。


Azure Sign Tool需要安装.NET Core SDK,但必须至少安装2.x版本,并且由于最新的.NET Core SDK是always used,因此这意味着只要Windows版本足够最新,则无需自己安装。您可以看到SDK is shipped with which Windows agent的哪个版本。

在撰写本文时,Azure Pipelines中的当前Hosted操作系统版本(也称为Default Hosted)是Windows Server 2012 R2。这还不够最新。要解决此问题,安装更新的.NET Core SDK会拖累每个版本,尽管安装可行,但调用Azure Sign Tool可能无法正常工作。似乎只能找到较旧版本的SDK,并引发以下错误:Unable to find an entry point named 'SignerSignEx3' in DLL 'mssign32'.

因此,最简单的方法是将您的构建更改为使用更高版本的OS映像。 Windows 2019就像一个魅力。无需安装任何版本的.NET Core。
然后创建命令行任务以安装Azure Sign Tool。您也可以使用.NET Core CLI任务,但是没有必要。在任务中,键入:

set DOTNET_SKIP_FIRST_TIME_EXPERIENCE=true
dotnet tool install --global AzureSignTool --version 2.0.17


自然使用您想要的任何版本。

DOTNET_SKIP_FIRST_TIME_EXPERIENCE环境变量不是严格必需的,但是设置它可以使速度大大提高(see here for an explanation)。
最后,创建另一个命令行任务,然后键入您希望运行的Azure Sign Tool命令。在Windows上,如下所示,请注意使用^而不是/作为行继续标记。自然,请参见here for more parameter information

AzureSignTool.exe sign -du "MY-URL" ^
  -kvu https://MY-VAULT-NAME.vault.azure.net ^
  -kvi CLIENT-ID-BIG-GUID ^
  -kvs CLIENT-PASSWORD ^
  -kvc MY-CERTIFICATE-NAME ^
  -tr http://timestamp.digicert.com ^
  -v ^
  $(System.DefaultWorkingDirectory)/Path/To/My/Setup/Exe



从理论上讲,您应该成功!签名工具的输出相当不错,通常可以将问题定位在哪里。

关于azure-devops - 如何使用Azure Key Vault中的证书/ key 对使用Azure Pipelines构建的代码进行签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57475144/

相关文章:

java - 使用 Key Vault 中的 key 连接到 Cosmos

c# - Azure DevOps API 在用户故事下创建任务

Azure Function App 基础设施重新部署导致应用程序中的现有函数因缺少需求而失败,并且还会删除以前的调用数据

c# - 无法在 Azure 上将 MSI 与 AKS 结合使用

powershell - ""您的构建管道引用了 undefined variable ": it' 只是一个 powershell 变量

无论如何,Azure 管道都不会触发来自 Github 的标签

使用 Key Vault 管理其 key 的 Azure 存储帐户

Azure DevOps Pull 请求带有感叹号的橙色线

tfs - 在 TFS (VS Online VS2015) 下在 CI 队列上构建时未恢复包

azure - 在 Azure DevOps 中,如何在组织级别而不是项目级别创建 Azure 服务连接?