Azure Key Vault 是一个基于云的数字密钥与证书保管库。相比管理物理 USB 令牌,一切都集中存储、加密,且只能通过 Azure 的策略访问。额外的好处是,你可以直接从 Azure 通过命令行对应用程序进行代码签名。
本文将逐步讲解每个步骤,补充一些实用提示,并分享几条让代码签名更轻松的技巧。
为何使用 Azure Key Vault 进行代码签名?
以下是 Azure Key Vault 如何改进代码签名流程的几个原因:
- 无需在物理令牌或本地机器上手动分发代码签名证书,Azure Key Vault 将它们集中存放在一处,并配以细粒度的访问控制。
- 证书和私钥永远不会离开保管库。即便某台机器被攻陷,这些文件也无法被复制,因为它们并不存在于本地。
- 每次访问与签名请求都会记录在审计日志中。若你需要证明谁在何时签署了什么,审计轨迹随时可用。
- 无论你是独立开发者,还是由数十名工程师组成的 CI/CD 团队,Azure 都能很好地与流水线和权限体系集成。
在实践中,许多团队在开始自动化构建或大规模分发软件时会迁移到 Azure Key Vault。它在降低"人为因素"风险的同时,给予你控制力与可见性。
另读:什么是 Azure Key Vault 以及开发者为何采用它。
使用 Azure Key Vault 签名前的先决条件
在动手签名之前,请确保已准备好以下几项:
- Azure 订阅——你需要它来创建 Key Vault。如果还没有,Azure 提供足以用于测试的免费试用额度。
- Key Vault 设置——你可以通过 Azure 门户或 CLI 创建 Key Vault。它就像一个存放证书的数字保险箱。
- 代码签名证书——可来自 DigiCert 等证书颁发机构。部分 CA 甚至允许你直接将证书配置到 Azure。若你的 CA 不提供该功能,可上传 PFX 文件到 Key Vault。
- Azure CLI——相比手动签名,通过 CLI 签名更利于自动化。请确保已安装签名工具"AzureSignTool"并已登录 Azure 账户。
- 你的应用程序文件——待签名的 .exe、.dll 或安装包应已准备就绪。
准备好这些后,即可在 Key Vault 中进行设置。
为代码签名配置 Azure Key Vault
创建保管库
在 Azure 门户中,点击"创建资源 > 安全 > Key Vault"。为其命名,选择订阅,并分配一个靠近你的用户或构建服务器的区域。
设置访问策略
这一步很重要。决定谁可以使用证书进行签名。在团队环境中,你应授予构建服务主体访问权限,而非个人。
上传或生成证书
若你的 CA 支持,可直接在 Key Vault 中生成证书。否则,上传你现有的 PFX 及其密码。Azure 会妥善保管并供签名使用。
尽可能使用基于角色的访问控制(RBAC)而非宽泛的访问策略。这样在日后新增或移除开发者时管理更轻松。
注册 Azure AD 应用程序
为实现对 Azure Key Vault 的自动化访问,你需要一个 Azure Active Directory 应用程序。该应用将作为自动化服务的安全身份。借助它,你可以在不暴露敏感凭据的情况下请求证书。
- 前往 Azure Active Directory > 应用注册 > 新建注册。
- 为应用起一个有意义的名称。如需则提供重定向 URI。注册后将获得一个应用程序(客户端)ID。请妥善保管。
- 接下来,前往"证书和密码 > 新建客户端密码"创建客户端密码。填写描述、设置过期时间并立即复制其值。请安全存储,该密码等同于你应用的口令。
- 最后,将应用关联到 Key Vault。前往你的 Key Vault,选择"访问策略 > 添加访问策略"。为应用分配所需权限,通常是证书的 Get、Sign 和 Verify。保存更改。
此设置使得任何自动化流程(如借助 AzureSignTool 的 CI/CD 流水线)都能安全获取证书并签名应用,而无需暴露私钥或人工干预。这对安全性和自动化都是关键一步。
使用 AzureSignTool 进行代码签名
一旦 Key Vault 与 Azure AD 应用就绪,CLI 方式便提供了一种快速、自动化的签名途径。推荐工具是 AzureSignTool。它是一个轻量级命令行工具,可与 Azure Key Vault 无缝集成。
- 使用 .NET CLI 安装 AzureSignTool:
dotnet tool install --global AzureSignTool - 安装完成后即可签名应用。关键在于使用你创建的(客户端)ID 与客户端密码安全地连接到 Key Vault:
azuresigntool sign -kvu "<KeyVaultURI>" -kvc "<CertificateName>" -kvi "<ClientID>" -kvs "<ClientSecret>" --azure-key-vault-tenant-id "<TenantID>" -tr http://timestamp.digicert.com -td sha256 "<PathToExecutable>"
将占位符替换为你的实际值:
- <KeyVaultURI>——你的 Key Vault URI
- <CertificateName>——存放在 Key Vault 中的证书
- <ClientID> 和 <ClientSecret>——你的 Azure AD 应用凭据
- <TenantID>——你的 Azure AD 租户 ID
- <PathToExecutable>——你要签名的应用程序文件
该命令不仅签名文件,还会为其加上时间戳。它保证即使证书过期,签名依然有效。签名后,用以下命令验证签名:
azuresigntool verify "<PathToExecutable>"
CLI 方式非常适合自动化。它完美契合 CI/CD 流水线,一旦配置好,应用便可在构建期间自动签名,减少人为错误并简化部署流程。
代码签名最佳实践
- 始终测试你的签名文件——有时签名看起来正常,但在包含正确的时间戳服务器之前,Windows 并不信任它。在 signtool 命令中加入 -tr http://timestamp.digicert.com -td sha256,使签名在证书过期后仍有效。
- 为生产环境与测试环境使用独立保管库——为开发、测试和生产维护不同的 Key Vault。这可降低用生产证书意外签署测试二进制文件的风险。
- 收紧权限——仅向真正需要的账户或服务授予签名权限,其余人应为只读或无访问权。
- 监控并轮换证书——跟踪证书过期日期并提前续期。Azure 可生成告警,避免过期签名中断发布。
- 留存日志——开启 Key Vault 诊断,并将日志保留在 Azure Monitor 或 Log Analytics 中。这提供了谁在何时访问了证书的可见性,对合规至关重要。
另读:代码签名证书最佳实践详细指南。
排查常见问题
即便设置顺利,仍有几个常见陷阱:
- 上传错误:若 PFX 上传失败,请复核密码。这是最常见的错误。
- "密钥不可用"提示:通常意味着你上传的证书缺少代码签名的扩展密钥用法(EKU)标志(OID: 1.3.6.1.5.5.7.3.3)。请确保你的 CA 签发了正确类型。
- 流水线访问问题:若构建服务器无法访问保管库,请检查其服务主体权限。十有八九是 RBAC 配置错误。
- 签名验证失败:使用 "signtool verify" 的详细模式。它通常会告诉你这是时间戳还是证书信任问题。
下一步:自动化并扩展你的签名流程
代码签名保护你的用户、你的声誉以及软件完整性。将该流程迁入 Azure Key Vault,你便在其之上叠加了强大的安全性与可扩展性。无论你是分发 Windows 应用的独立开发者,还是运行企业流水线的团队成员,这种方式都能随你成长。如果尚未开始,请先从测试环境入手。上传一张证书,签名一个小可执行文件,并验证结果。一旦你体会到它的顺畅,将其接入生产工作流便是顺理成章的下一步。
使用 Azure Key Vault 代码签名保护你的应用
抛弃过时的 USB 令牌与手动工作流。来自立海世纪的标准或 EV DigiCert 证书,让锁定密钥、自动化签名并维持可信软件交付变得简单。
购买 Azure Key Vault 代码签名证书 购买 Azure Key Vault EV 代码签名证书
相关文章:
- 如何在云 HSM 上安装 EV 代码签名证书?
- 如何使用 Microsoft SignTool 签名可执行文件?快速指南
- 如何下载并安装 SafeNet Authentication Client?
- 代码签名证书多少钱,为何你应该关注?
- 无硬件令牌的 EV 代码签名——可行吗?
- 免费代码签名证书——限时优惠