

# 使用 Amazon Certificate Manager 管理证书
<a name="origin-certificate-management-certificate-manager"></a>

[Amazon Certificate Manager（ACM）](https://www.amazonaws.cn/certificate-manager/)存储 CloudFront 在源双向 TLS 身份验证期间向原始服务器提供的客户端证书。

## 证书颁发机构支持
<a name="origin-ca-support"></a>

CloudFront 源 mTLS 需要具有扩展密钥用法（EKU）的客户端证书来进行 TLS 客户端身份验证。由于此要求，您必须从您的证书颁发机构颁发证书并将其导入到 Amazon Certificate Manager 中。ACM 的自动证书预置和续订功能不适用于源 mTLS 客户端证书。CloudFront 源 mTLS 支持来自两个来源的客户端证书：
+ **Amazon 私有证书颁发机构：**您可以使用在“扩展密钥用法”字段中包含 TLS 客户端身份验证的证书模板（例如 EndEntityClientAuthCertificate 模板）从 Amazon 私有 CA 颁发证书。从 Amazon 私有 CA 颁发证书后，您必须将其导入到美国东部（弗吉尼亚州北部）（us-east-1）中的 ACM。这种方法既可提供 Amazon 私有 CA 的安全优势，又可让您控制证书生命周期管理。
+ **第三方私有证书颁发机构：**也可以从现有的私有证书颁发机构基础设施颁发证书并将其导入到 ACM 中。这可让您在利用 CloudFront 的源 mTLS 功能的同时保留当前证书管理流程。证书必须在“扩展密钥用法”字段中包含 TLS 客户端身份验证，并且证书、私有密钥和证书链必须采用 PEM 格式。

**重要**  
对于 Amazon 私有 CA 和第三方 CA，您负责监控证书到期日期，并在到期前将续订的证书导入到 ACM 中。ACM 的自动续订功能不适用于源 mTLS 所用的导入证书。

## 证书要求和规范
<a name="origin-certificate-requirements"></a>

### 客户端证书要求
<a name="origin-ca-cert-format-requirements"></a>
+ **格式：**PEM（隐私增强邮件）格式
+ **组件：**证书、私有密钥和证书链
+ **最大证书链深度：**3（叶证书 \+ 中间证书 \+ 根证书）
+ **最大证书链大小：**64 KB
+ **证书大小：**不能超过 96 KB
+ **最大私有密钥大小：**5 KB（ACM 限制）
+ **每个 CloudFront 分配创建或更新 API 调用可以添加或修改的最大唯一源 mTLS 证书 ARN：**5
+ **区域：**证书必须存储在美国东部（弗吉尼亚州北部）区域（us-east-1）的 ACM 中

### 支持的证书规范
<a name="origin-supported-cert-specs"></a>
+ **证书类型：**X.509v3
+ **公有密钥算法：**
  + RSA：2048 位
  + ECDSA：P-256
+ **签名算法：**
  + 采用 RSA 的 SHA256、SHA384、SHA512
  + 采用 ECDSA 的 SHA256、SHA384、SHA512
  + 采用 RSASSA-PSS 与 MGF1 的 SHA256、SHA384、SHA512
+ **扩展密钥用法（必需）：**证书要求将扩展密钥用法（EKU）扩展设置为 TLS 客户端身份验证，确保其被授权用于 mTLS 目的

### 服务器证书要求
<a name="origin-server-certificate-requirements"></a>

在双向 TLS 握手期间，原始服务器必须提供来自公开信任的证书颁发机构的证书。有关原始服务器证书要求的完整详细信息，请参阅[将 SSL/TLS 证书与 CloudFront 结合使用的要求](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/using-https-cloudfront-to-custom-origin.html#using-https-cloudfront-to-origin-certificate)。

### 请求或导入证书
<a name="origin-request-import-certificate"></a>

在启用源 mTLS 之前，您必须在 ACM 中拥有可用的客户端证书。

#### 从 Amazon 私有 CA 请求并导入证书
<a name="request-certificate-aws-private-ca"></a>

先决条件：
+ 在您的账户中配置的 Amazon 私有证书颁发机构
+ 从 Amazon 私有 CA 中颁发证书的权限
+ 将证书导入到 ACM 中的权限
+ 具有适合使用案例的 `Extended key usage:TLS web client authentication` 的[证书模板](https://docs.amazonaws.cn/privateca/latest/userguide/UsingTemplates.html) ARN
+ 安装 OpenSSL、Amazon CLI 和 jq（用于解析 JSON）。

##### 从 PCA 请求证书并导入到 ACM（Amazon CLI）
<a name="request-certificate-cli"></a>

1. 在变量中设置您的私有 CA ARN，以便于重用。

   ```
   PCA_ARN="arn:aws:acm-pca:region:account:certificate-authority/12345678..."
   ```

1. 使用 OpenSSL 生成 ECDSA P-256 私有密钥（prime256v1 曲线）和证书签名请求（CSR），确保使用 -nodes 标志按照 ACM 导入要求将私有密钥保持为未加密。

   ```
   openssl req -new -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -nodes \
       -keyout private.key \
       -out request.csr \
       -subj "/CN=client.example.com"
   ```

1. 将 CSR 提交给 Amazon 私有 CA 以颁发证书，这会返回新颁发的证书的 ARN。

   ```
   CERT_ARN=$(aws acm-pca issue-certificate \
       --certificate-authority-arn "$PCA_ARN" \
       --csr fileb://request.csr \
       --signing-algorithm "SHA256WITHECDSA" \
       --validity Value=365,Type="DAYS" \
       --template-arn arn:aws:acm-pca:::template/EndEntityCertificate/V1 \
       --query 'CertificateArn' --output text)
   ```

1. 使用 get-certificate 命令从 Amazon PCA 检索证书捆绑包，该命令同时返回叶证书和链，然后使用 jq 将它们分成不同的文件。

   ```
   # Retrieve the full certificate bundle in JSON format
   aws acm-pca get-certificate \
       --certificate-authority-arn "$PCA_ARN" \
       --certificate-arn "$CERT_ARN" \
       --output json > full_cert.json
   
   # Split into Leaf and Chain
   jq -r '.Certificate' full_cert.json > leaf_cert.pem
   jq -r '.CertificateChain' full_cert.json > cert_chain.pem
   ```

1. 使用 fileb:// 协议在 CLI 中正确处理二进制文件数据，以便将未加密的私有密钥、叶证书和证书链导入到 Amazon ACM 中。

   ```
   aws acm import-certificate \
       --certificate fileb://leaf_cert.pem \
       --private-key fileb://private.key \
       --certificate-chain fileb://cert_chain.pem \
       --region us-east-1 \
       --query 'CertificateArn' \
       --output text
   ```

#### 从第三方 CA 导入证书
<a name="import-certificate-third-party-ca"></a>

先决条件：
+ 来自证书颁发机构的采用 PEM 格式的证书、未加密的私有密钥和证书链
+ 证书必须包含用于 TLS 客户端身份验证的扩展密钥用法
+ 将证书导入到 ACM 中的权限

##### 将证书导入到 ACM 中（Amazon CLI）
<a name="import-certificate-cli"></a>

```
aws acm import-certificate \
  --certificate fileb://certificate.pem \
  --private-key fileb://private-key.pem \
  --certificate-chain fileb://certificate-chain.pem \
  --region us-east-1 \
  --query 'CertificateArn' \
  --output text
```

#### 后续步骤
<a name="certificate-next-steps"></a>

在 ACM 中获取或导入客户端证书后，您可以将原始服务器配置为要求双向 TLS 身份验证，并在 CloudFront 分配上启用源 mTLS。有关在 CloudFront 中启用源 mTLS 的说明，请参阅下一节“为 CloudFront 分配启用源双向 TLS”。