

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 通过 ACME 颁发证书
<a name="acm-acme-issuance"></a>

在您的 PKI 管理员设置具有域验证和外部帐户绑定的 ACME 端点后，应用程序所有者可以使用 ACME 客户端颁发证书。本节描述了颁发流程，提供了使用 Certbot 的简短示例，并解释了 ACME-issued 证书在 ACM 中的显示方式。

## 发行是如何运作的
<a name="acm-acme-issuance-how-it-works"></a>

ACME 证书颁发流程遵循 RFC 8555 协议：

1. **账户注册：**ACME 客户端使用 EAB 凭证（密钥 ID 和 MAC 密钥）注册账户。这是每个 ACME 客户端的一次性步骤。

1. **证书订单：**客户端创建订单，指定证书的域名。

1. **授权：**ACME 服务器检查预配置的域验证。由于端点使用`PRE_APPROVED`授权，因此不需要客户端进行实时质询。

1. **完成：**客户提交证书签名请求 (CSR) 以完成订单，ACM 颁发证书。

1. **下载：**客户端下载已颁发的证书链。

**重要**  
私钥由 ACME 客户端生成，永远不会离开客户端的系统。

## 示例：使用 Certbot 颁发证书
<a name="acm-acme-issuance-certbot-example"></a>

此示例说明如何使用 Certbot 注册 ACME 账户并申请证书。

**先决条件**
+ 处于`ACTIVE`状态的 ACME 终端节点（你有目录 URL）
+ 您想要的域名至少有一个域名验证`VALID`处于状态
+ 来自您的 PKI 管理员的 EAB 凭证（密钥 ID 和 MAC 密钥）
+ 您的系统上安装了 Certbot

**注册账户并申请证书**

**重要**  
通过 ACM ACME 端点颁发证书最多可能需要两分钟。将 ACME 客户端的颁发超时配置为至少 120 秒（2 分钟），以防止客户端在证书交付之前超时。许多 ACME 客户端默认为 30-90 秒，但这还不够。

运行以下命令：

```
certbot certonly \
    --standalone \
    --non-interactive \
    --agree-tos \
    --email {{user@example.com}} \
    --server https://acm-acme-enroll.{{region}}.api.aws/{{00000000-0000-0000-0000-000000000000}}/directory \
    --eab-kid {{AAABBBCCC111222333}} \
    --eab-hmac-key {{base64encodedmackey}} \
    --issuance-timeout 120 \
    --domain {{www.example.com}}
```

成功颁发后，Certbot 会将证书和私钥存储在其默认位置（通常`/etc/letsencrypt/live/{{www.example.com}}/`）。

## ACM 中的 ACME 证书
<a name="acm-acme-issuance-certificates-in-acm"></a>

通过 ACME 颁发的证书会自动收到标准 ACM 证书 ARN，并显示在 ACM 证书清单中。但是， ACME-issued 证书与通过颁发的证书有重要区别`RequestCertificate`。

**主要区别**
+ **私钥在客户端：**证书私钥由 ACME 客户端生成和存储。ACM 无权访问私钥。
+ **无法绑定到集成服务：**由于 Amazon 不包含私钥，因此 ACME 证书不能与 Elastic Load Balancing 或 API Gateway 一起使用。 CloudFront
+ **不在默认列表输出中：**默认情况下，ACME 证书不会出现在`ListCertificates`结果中。必须包括带有值的`CertificateKeyPairOrigins`过滤器`ACME`才能将其包括在内。 `SearchCertificates`默认情况下返回 ACME 证书。
+ **无法通过 ACM 导出：**无法使用 `ExportCertificate` API，因为自从客户端拥有证书以来，证书已经按定义导出了。
+ **仅通过 ACME 撤销：**使用 ACME 端点的吊销证书网址。ACM `RevokeCertificate` API 不适用于 ACME-issued证书。
+ **续订由客户主导：**ACM 不会自动续订 ACME 证书。ACME 客户端必须在现有证书到期之前申请新证书。

## 查看 ACME 证书
<a name="acm-acme-issuance-viewing"></a>

在 ACM 控制台中，使用筛选器来包含以 ACME key pair 为来源的证书。有关查找证书的更多信息，请参阅[搜索证书](gs-acm-list.md)。

**列出 ACME 证书 (Amazon CLI)**

`list-certificates`与`CertificateKeyPairOrigins`过滤器一起使用：

```
aws acm list-certificates \
    --certificate-key-pair-origins ACME
```

**搜索 ACME 证书 (Amazon CLI)**

与`CertificateKeyPairOrigin`筛选器`search-certificates`一起使用，按其他条件查找 ACME 证书：

```
aws acm search-certificates \
    --filter-statement '{"Filter": {"AcmCertificateMetadataFilter": {"CertificateKeyPairOrigin": "ACME"}}}'
```

您还可以通过筛选或来搜索通过特定终端节点或 ACME 账户颁发的`AcmeEndpointArn`证书。`AcmeAccountId`

**查看证书详细信息 (Amazon CLI)**

运行以下命令：

```
aws acm describe-certificate \
    --certificate-arn arn:aws:acm:{{region}}:{{account-id}}:certificate/{{certificate-id}}
```

## 撤销 ACME 证书
<a name="acm-acme-issuance-revoking"></a>

要吊销通过 ACME 颁发的证书，请使用 ACME 协议的吊销证书端点。ACME 客户端负责处理此问题。

**注意**  
ACME-issued 无法使用 ACM `RevokeCertificate` API 吊销证书。您必须通过颁发这些证书的 ACME 终端节点吊销这些证书。

以下示例显示了如何使用 Certbot 进行撤销：

```
certbot revoke \
    --cert-path /etc/letsencrypt/live/{{www.example.com}}/cert.pem \
    --server https://acm-acme-enroll.{{region}}.api.aws/{{00000000-0000-0000-0000-000000000000}}/directory
```

撤销由与客户的外部账户绑定关联的 IAM 角色授权，因此适用于标准`acm:RevokeCertificate`操作的 IAM 策略和 SCP 在此处适用。有关所需的 IAM 角色配置的更多信息，请参阅[用于 ACME 证书自动化的 IAM](security-iam-acme.md)。

## 证书续订
<a name="acm-acme-issuance-renewal"></a>

ACM 不会续订 ACME 证书。您的 ACME 客户端负责在当前证书到期之前申请新证书。大多数 ACME 客户端（包括 Certbot）都支持通过计划任务（例如 cron 作业或 systemd 计时器）自动续订。

**续订期间的 ARN 稳定性**

当 ACME 客户端续订证书时，ACM 会确定新颁发的证书是续订现有证书还是不同证书。如果颁发来自具有相同证书元数据（例如域名和密钥算法）的同一 ACME 账户，则 ACM 会更新现有证书 ARN，而不是创建新的证书 ARN。这使ARN在续订期间保持稳定，从而简化了跟踪和自动化。

如果原始证书已从 ACM 中删除（例如，因为它已在一年多前过期并被自动删除），则后续颁发的具有相同元数据的证书将创建新的证书 ARN。

Certbot 自动续订示例（通常在 Certbot 安装期间自动配置）：

```
certbot renew --quiet
```