亚马逊AWS官方博客

借助 AWS Certificate Manager 中的 ACME 支持,自动颁发公共 TLS 证书

如果您为应用程序管理 TLS 证书,想必知道其中的挑战:证书会过期。如果证书过期,您的客户就会遇到错误或出现服务中断。随着证书有效期的缩短(证书颁发机构(CA)/浏览器论坛要求从 2027 年 3 月起,证书最长有效期将缩减至 100 天,到 2029 年进一步缩短至 47 天),手动续订流程变得难以为继。您需要自动化。

自动证书管理环境(ACME)是一套开放协议,可在无需人工干预的情况下完成 TLS 证书的申请、续订和吊销。Let’s Encrypt 正是基于该协议构建,每个平台都有数十款客户端支持该协议。

今天,我们宣布 ACME 支持AWS Certificate Manager(ACM)中的公有证书。ACM 现已提供全托管 ACME 服务端点,兼容所有符合 ACMEv2 标准的客户端,例如 Certbot适用于 Kubernetes 的 cert-manager、acme.sh,以及您已经在使用的任何其他客户端。您可以通过标准 ACME 协议颁发来自 Amazon Trust Services 的公共 TLS 证书。

在此之前,如果您想使用 ACME 协议进行自动证书管理,则需要依赖外部证书颁发机构和 ACM,这会导致可见性体验割裂。有些证书存放在 ACM 中,其他证书则由外部管理,没有中央控制面板。PKI 管理员控制可以申请证书的人员或可授权域的能力有限。

借助 ACM 中的 ACME 支持,您现在可以设置一个或多个托管的 ACME 端点,从而集中管理和监控整个组织的 ACME 证书使用情况。

作为 PKI 管理员,您可以获得的集中控制权限不仅限于基本证书颁发。您可以将 IAM 角色绑定到 ACME 账户,以便对每个客户端可以请求哪些域进行精细的访问控制。您可以在端点级别定义域范围以强制执行组织范围的策略。而且,所有监控和可见性功能将集中在一处:AWS CloudTrail 会记录每一个证书请求以供审计,Amazon CloudWatch 会跟踪运营指标,且 ACM 会在证书即将续订时发送到期通知。使用 ACM,您的 PKI 团队可以搜索所有证书,无论该证书是通过 ACM 控制台、API 调用还是 ACME 颁发的。

工作原理
首先,您需要设置专用 ACME 端点,使用外部账户绑定(EAB)配置授权控制,验证该端点可以为哪些域颁发证书,并将现有的 ACME 客户端指向新端点。

域验证步骤很重要:它将谁可以设置证书颁发和谁可以申请证书区分开来。PKI 管理员只需使用管理员拥有的 DNS 凭证在端点级别对域进行一次验证。需要证书的应用程序所有者无需操作 DNS。所有者使用 EAB 凭证注册,端点会强制限制其可申请的域和权限范围。这意味着您可以在组织内部广泛分发证书自动化流程,而无需同时分发 DNS 密钥。

我从 AWS Certificate Manager 控制台中的 ACME 证书页面开始本次演示。

ACME 控制台

我的账户中已经有一些端点和证书,我将引导您从头开始创建一个新的端点。首先,选择创建 ACME 端点

ACME - Create endpoint 1

为我的端点命名。端点类型公共。ACME 客户端将通过公共互联网连接。证书类型公共。该证书将由 Amazon Trust Services 颁发,默认情况下受浏览器和操作系统的信任。对于证书密钥类型,我保留默认的 ECDSA P-256。如果客户端需要,也可以使用 RSA 2048 和 ECDSA P-384。

ACME - Create endpoint 2

向下滚动并配置域。输入域名并选择域范围。该范围精确控制允许您的 ACME 客户端为该域申请哪些证书模式。如果我只选中精确域,则客户端只能为该特定域名申请证书。添加子域将支持任何子域(例如 api.example.com 或 dev.example.com)的证书。添加通配符将支持使用通配符证书(*.example.com)。不选中范围则可以防止任何使用此端点的客户端请求该类型的证书,即使其 ACME 申请在其他方面是有效的。对于生产端点,您可以仅启用精确域子域,同时不选中通配符以强制执行更严格的安全态势。

我还从下拉菜单中选择了我的 Amazon Route 53 托管区域。然后,ACM 会自动创建域验证所需的 DNS CNAME 记录,无需手动操作。如果域托管在 Route 53 之外时,则需在 DNS 提供商处手动创建提供的 CNAME 记录。这一点与典型的 ACME 设置有本质区别。在典型设置中,每个客户端需要独立处理各自的域验证。

这些集中的控制功能使 PKI 管理员可以在一处完成域验证、限制客户端可以申请的证书密钥类型(ECDSA 或 RSA),并进一步限制通配符证书颁发。内置这些治理功能意味着您无需购买单独的证书生命周期管理产品,也无需投资构建自定义策略层,这两者都会产生巨大的成本和运营开销。

选择创建 ACME 端点

ACME - DNS 配置

几秒钟后,端点创建完成。控制台会显示设置进度跟踪器,其中包含后续步骤。我的域显示“正在验证”状态。验证方法是 DNS 验证,即 ACM 通过检查特定的 CNAME 记录来验证您是否控制了该域。由于我在创建时选择了 Route 53 托管区,因此我选择在 Route 53 中创建记录,让 ACM 自动处理 DNS 验证。

ACME - DNS 成功验证将在几秒钟后完成,状态更改为成功

ACME - 外部账户绑定 1

现在,我需要创建外部账户绑定(EAB)凭证。EAB 凭证是密钥标识符和 HMAC 密钥对,用于 ACME 客户端在 ACME 服务器上注册账户。注册后,客户端会生成自己的非对称密钥对,然后用于对所有后续的证书申请进行身份验证。在端点详细信息页面上,选择外部账户绑定选项卡,然后选择创建 EAB。为凭证命名,并按需设置过期时间(最好不超过完成客户端注册所需的时长)。

ACME - 外部账户绑定 2

ACME - 配置结束 - 显示密钥

选择创建 EAB 凭证后,控制台会显示密钥 IDHMAC 密钥。记下这些值,因为配置 ACME 客户端时需要用到它们。设置进度现在显示四个绿色复选标记。

ACME - 配置结束 - 成功

现在即可发起证书申请。在端点详细信息页面上,展开 CLI 参考部分。该控制台为 Certbotacme.sh 提供可直接使用的命令示例。复制 Certbot 命令,然后使用 certbot/certbot 映像在容器内运行该命令。

certbot certonly --standalone --non-interactive --agree-tos \
    --email <EMAIL> \
    --server https://acm-acme-enroll.us-east-1.api.aws/<ENDPOINT_ID>/directory \
    --eab-kid <EAB_KID> \
    --eab-hmac-key <EAB_HMAC_KEY> \
    --issuance-timeout <ISSUANCE_TIMEOUT> \
    -d <DOMAIN>

将占位符替换为端点 URL、EAB 凭证和域名。--eab-kid--eab-hmac-key 参数是 Certbot 使用我之前生成的外部账户绑定凭证向 ACME 端点注册的方式。每个 ACME 客户端都有各自执行此步骤的语法,因此请查看您的客户端文档以了解确切的选项。

Certbot 联系 ACME 端点并返回由 Amazon Trust Services 签署的有效证书。

使用 Certbot 通过 ACME 获取证书

在安装证书之前,使用 openssl 查看证书。

使用 openssl 查看证书

现在,该证书将在 ACM 控制台的 ACME 证书选项卡下显示,一同显示的还有通过控制台或 API 颁发的所有证书。

ACME 控制台中的证书视图

可用性和定价
AWS Certificate Manager 中的 ACME 支持功能现已在所有商业 AWS 区域提供,后续将在 AWS GovCloud(美国)、中国区域和 AWS European Sovereign Cloud 分区提供。

定价基于每个证书颁发时包含的每个域,完全合格域名和通配符的价格不同。批量套餐根据 AWS 账户每月颁发的所有证书的域名出现总次数计算。有关详细信息,请参阅 ACM 定价页面

要开始使用,请访问 AWS 管理控制台上的 ACM 部分或阅读相关文档

— seb