如何在 Azure Key Vault 中使用 certificate/key 对使用 Azure Pipelines 构建的代码进行签名?

How to sign code built using Azure Pipelines using a certificate/key in Azure Key Vault?

我们正在从本地构建服务器迁移到 Azure Pipelines。我们生产 "shrink-wrap" 桌面软件,所以很明显我们需要在发布之前签署所有二进制文件。我们当前的构建基础设施使用来自 GlobalSign 的 USB 硬件令牌来完成此操作,但显然当我们进行云构建时这不起作用 - 遗憾的是,云没有配备 USB 端口 :D

现在,GlobalSign 最近开始 advertising Azure Key Vault 作为密钥存储选项,他们非常乐意将其出售给我们,但我不确定我们如何实际整合它使用我们的构建管道(或者实际上这是否可能)。

有人真的做过这个吗?

是的,它能够在 Azure DevOps 服务构建管道中执行此操作。

一般情况下,我们通常在市场上使用SignTool.exe commands to sign files. There is also an extension Code Signing,它可以签署单个文件,您可以使用脚本对多个文件执行运行 SignTool.exe命令。

因此,您可以将代码签名证书导出到 pfx 文件,然后将其作为安全文件上传到 Azure Devops 安全文件存储,使其可用于您的构建。

Azure DevOps 可以存储安全文件。查看此 link 了解详细信息:Secure files

Azure Key Vault 实例有点复杂。我们还有一个 Azure Key Vault 任务。

Use this task in a build or release pipeline to download secrets such as authentication keys, storage account keys, data encryption keys, .PFX files, and passwords from an Azure Key Vault instance.

The task can be used to fetch the latest values of all or a subset of secrets from the vault, and set them as variables that can be used in subsequent tasks of a pipeline.

不确定 GlobalSign 将如何将代码签名与您的环境集成。从理论上讲,它能够做到这一点。对于细节部分和实施,您可能需要与他们的售前讨论。希望这有帮助。

代码签名

我一直在与 Azure Key Vault 和 Azure Pipelines 进行斗争以对我们的代码进行签名,并取得了成功。这就是我的发现。

重要的是,用于代码签名的扩展验证 (EV) 证书与 'normal' SSL 证书截然不同。标准的可以随心所欲地导出,这意味着您可以将其上传到 Azure Pipelines 并与标准的 Microsoft Sign Tool 一起使用。

但是,一旦 EV 证书进入 Azure Key Vault,它就不会以任何通常的方式出现。您必须使用出色的 Azure Sign Tool as discovered by

从管道调用它

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

要获得从外部访问此证书的权限,您可以 follow this page 请注意 它遗漏了一个步骤。因此,请先阅读该文档,然后阅读这些总结步骤,以设置 Key Vault:

  1. 打开Azure portal,进入Azure Active Directory区域,创建一个App registration:输入好记的名字,忽略Redirect URI,保存
  2. 转到您的特定 Key Vault,然后 Access control (IAM),然后 Add role assignment。在 select 输入框中输入您刚刚创建的应用程序的名称。同样选择一个Role,我建议Reader然后保存。
  3. 缺少的部分: 仍然在 Key Vault 中,单击 Access policies 菜单项。单击 Add Access Policy 并添加您的应用程序。 Certificate Permissions 需要勾选 GetKey Permissions,尽管您在这个保险库中可能根本没有任何钥匙,但需要 GetSign。你会认为这两个会在证书权限中...
  4. 返回刚刚创建的应用程序。 Select Certificates & secrets,然后选择上传证书(一个新的纯粹用于远程访问 Key Vault 的证书)或创建一个 client secret。如果是后者,请保留一份密码,以后就不会再看到了!
  5. 应用程序的 Overview 部分将是 Application (client) ID。这以及密码或证书将在稍后的管道任务中提供给 Azure 签名工具。

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

  1. Azure Sign Tool 需要安装 .NET Core SDK,但版本至少为 2.x,并且自 最新 .NET Core SDK 是 always used, this means as long as the version of Windows is current enough, you don't need to install it yourself. And you can see which version of the SDK is shipped with which Windows agent.

    Azure Pipelines 中的当前 Hosted OS 版本,也称为 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

  2. 然后创建一个命令行任务来安装 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)。

  3. 最后,创建另一个命令行任务并输入您希望 运行 使用的 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
    

理论上,你应该成功了! sign工具的输出效果还是不错的,一般都能指出问题所在

重新颁发证书

如果需要重新颁发证书,情况就大不相同了。

  1. 在 Azure 中,转到证书并单击它,打开一个显示该证书版本的页面,包括当前版本和旧版本。

  2. 单击 'New Version' 按钮,可能接受默认值(取决于您希望做出的选择)并单击 'Create'。

  3. 这会将您带回到“版本”页面,并且会出现一个消息框,说明 'The creation of certificate XXXX is currently pending'。单击此处(或 'Certificate Operation' 按钮)打开 'Certificate Operation' 侧页。在那里,下载 CSR(证书签名请求)。

  4. 在 GlobalSign 中,按照他们的说明 re-issue 现有证书。重新发布后,他们将发送一封电子邮件,说明如何下载。

  5. 再次登录GlobalSign,输入临时密码后,打开CSR,将-----BEGIN CERTIFICATE REQUEST-----开头的全文复制到GlobalSign。提交。

  6. 使用 'Install My Certificate' 按钮下载。然后在 Azure 'Certificate Operation' 侧页中 - 使用 'Merge Signed Request' 按钮将 .CER 文件上传到 Azure。这将创建新版本的证书。

  7. 禁用旧版本的证书。

如果其他人正在寻找并使用 RBAC,我发现这些步骤必不可少:

  1. RESOURCE GROUP
  2. 上的 Key Vault Reader
  3. KEY VAULT 和 CERTIFICATE 上的 Key Vault Certificates Officer
  4. 证书上的 Key Vault Crypto Office(使用密钥进行签名!)