首页 > 解决方案 > 如何使用 Azure Key Vault 中的证书/密钥对使用 Azure Pipelines 构建的代码进行签名?

问题描述

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

现在,GlobalSign 最近开始宣传Azure Key Vault 作为密钥存储选项,他们非常乐意将其出售给我们,但我不确定我们如何将其与我们的构建管道实际集成(或者实际上是否甚至可能)。

有没有人真的做过这个工作?

标签: azure-devopsazure-pipelinesazure-keyvault

解决方案


代码签名

我一直在使用 Azure Key Vault 和 Azure Pipelines 来为我们的代码签名,并且成功了。所以这就是我发现的。

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

但是,一旦 EV 证书在 Azure Key Vault 中,它就不会以任何通常的方式出现。您必须使用上面 Anodyne发现的优秀Azure Sign Tool从 Pipelines 调用它

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

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

  1. 打开 Azure 门户,转到该Azure Active Directory区域,然后创建一个App registration: 输入一个容易记住的名称,忽略Redirect URI并保存它。
  2. 转到您的具体Key Vault,然后Access control (IAM),然后Add role assignmentselect在输入框中键入您刚刚创建的应用程序的名称。也选择一个Role,我建议Reader然后保存。
  3. 缺失的部分:仍在 Key Vault 中,单击Access policies菜单项。单击Add Access Policy并添加您的应用程序。Certificate Permissions需要Get打勾。并且Key Permissions,尽管您可能在此保管库中根本没有任何密钥,但仍需要GetSign。你会认为这两个会在证书烫发中......
  4. 返回到您刚刚创建的应用程序。选择Certificates & secrets,然后选择上传证书(纯粹用于远程访问 Key Vault 的新证书)或创建client secret. 如果是后者,请保留密码的副本,您将不会再看到它!
  5. Overview应用程序的部分将是Application (client) ID. 这以及密码或证书将在稍后的 Pipelines 任务中提供给 Azure 签名工具。

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

  1. Azure Sign Tool 需要安装 .NET Core SDK,但版本至少为 2.x 版本,并且由于始终使用最新的.NET Core SDK ,这意味着只要 Windows 版本足够最新,你不需要自己安装它。并且您可以看到哪个版本的SDK 与哪个 Windows 代理一起提供

    在撰写本文时,HostedAzure Pipelines 中的当前操作系统版本(也称为 )是 Windows Server 2012 R2。Default Hosted这还不够最新。安装更新的 .NET Core SDK 来解决这个问题是每次构建都会拖累时间,虽然安装工作正常,但调用 Azure 签名工具可能不起作用。它似乎只找到旧版本的 SDK,并抛出此错误:Unable to find an entry point named 'SignerSignEx3' in DLL 'mssign32'.

    因此,最简单的做法是更改您的构建以使用更高版本的操作系统映像。Windows 2019 就像一个魅力。并且无需安装任何版本的 .NET Core。

  2. 然后创建一个命令行任务来安装 Azure 签名工具。您也可以使用 .NET Core CLI 任务,但没有必要。在任务中,键入:

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

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

    DOTNET_SKIP_FIRST_TIME_EXPERIENCE 环境变量不是绝对必要的,但设置它会加快速度(请参阅此处以获取解释)。

  3. 最后,创建另一个命令行任务并键入要运行的 Azure 签名工具命令。在 Windows 上,这将如下所示,注意^不要/作为行继续标记。当然,请参阅此处了解更多参数信息

     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
    

理论上,你应该成功!标志工具的输出相当不错,通常能指出问题所在。

重新签发证书

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

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

  2. 单击“新版本”按钮,可能接受默认值(取决于您希望做出的选择),然后单击“创建”。

  3. 这将带您回到版本页面,并且会出现一个消息框,说明“证书 XXXX 的创建当前正在等待”。单击此处(或在“证书操作”按钮上)打开“证书操作”侧页。在那里,下载 CSR(证书签名请求)。

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

  5. 再次登录 GlobalSign,输入临时密码后,打开 CSR 并将整个文本(以 开头-----BEGIN CERTIFICATE REQUEST-----)复制到 GlobalSign。提交它。

  6. 使用“安装我的证书”按钮下载。然后在 Azure 的“证书操作”侧页中 - 使用“合并签名请求”按钮将 .CER 文件上传到 Azure。这将创建新版本的证书。

  7. 禁用旧版本的证书。


推荐阅读