

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

# 最佳实践
<a name="acm-bestpractices"></a>

 最佳实践是可以帮助您更有效地使用 Amazon Certificate Manager (Amazon Certificate Manager) 的建议。以下最佳实践基于来自当前 ACM 客户的实际经验。

**Topics**
+ [Account-level 分离](#best-practices-account-separation)
+ [Amazon CloudFormation](#best-practices-cloudformation)
+ [自定义信任存储](#best-practices-custom-trust-stores)
+ [证书固定](#best-practices-pinning)
+ [域验证](#best-practices-validating)
+ [添加或删除域名](#best-practices-add-delete)
+ [打开Amazon CloudTrail](#best-practices-ct)

## Account-level 分离
<a name="best-practices-account-separation"></a>

通过在策略中使用账户级别隔离，来控制谁可以在账户级别访问证书。将生产证书与测试和开发证书分别存放在不同的账户中。如果无法使用账户级隔离，则可以通过在策略中拒绝 `kms:CreateGrant` 操作来限制对特定角色的访问权限。这会限定账户中可以对证书进行高级别签名的角色。有关授权的信息，包括授权术语，请参阅《Amazon Key Management Service 开发人员指南》中的 [Grants in Amazon KMS](https://docs.amazonaws.cn/kms/latest/developerguide/grants.html)**。

如果您想要更精细的控制而不是限制`kms:CreateGrant`按账户使用，则可以使用 k [ms: EncryptionContext](https://docs.amazonaws.cn/kms/latest/developerguide/conditions-kms.html#conditions-kms-encryption-context) 条件密钥限制`kms:CreateGrant`特定证书。将 `arn:aws:acm` 指定为键，并指定要限制的 ARN 的值。以下示例策略会禁止使用特定的证书，但允许使用其他证书。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
       {
           "Sid": "VisualEditor0",
           "Effect": "Deny",
           "Action": "kms:CreateGrant",
           "Resource": "*",
           "Condition": {
               "StringEquals": {
                   "kms:EncryptionContext:aws:acm:arn": "arn:aws:acm:us-east-1:{{111122223333}}:certificate/b26def74-1234-4321-9876-951d4c07b197"
               }
           }
       }
   ]
}
```

------

## Amazon CloudFormation
<a name="best-practices-cloudformation"></a>

Amazon CloudFormation您可以使用创建描述您要使用的Amazon资源的模板。 Amazon CloudFormation然后为您预置和配置这些资源。 Amazon CloudFormation可以配置 ACM 支持的资源，例如 Elastic Load Balancing CloudFront、Amazon 和 Amazon API Gateway。有关更多信息，请参阅 [通过集成服务实现托管自动化](acm-services.md)。

如果您使用Amazon CloudFormation快速创建和删除多个测试环境，我们建议您不要为每个环境创建单独的 ACM 证书。这样做会快速耗尽您的证书配额。有关更多信息，请参阅 [配额](acm-limits.md)。相反，创建一个涵盖了您用于测试的所有域名的通配符证书。例如，如果您为仅因版本号而异的域名重复创建 ACM 证书 {{<version>}}`.service.example.com`，请改为为创建单个通配符证书。{{<\*>}} `.service.example.com`

**重要**  
如果您使用的是亚马逊 CloudFront 分配，请注意 HTTP 验证不支持通配符证书。在Amazon CloudFormation模板中包含通配符证书以用于 Amazon 时 CloudFront，必须使用 DNS 验证或电子邮件验证。我们建议使用 DNS 验证以获得自动续订功能。

在Amazon CloudFormation用于创建测试环境的模板中包含通配符证书。

## 自定义信任存储
<a name="best-practices-custom-trust-stores"></a>

 为了确保与受 ACM 证书保护的端点的连接，我们建议将 [Amazon 根](https://www.amazontrust.com/repository/)包含在您的自定义信任存储中。Amazon 根证书颁发机构可以表示不同的密钥类型和算法。Starfield Services Root Certificate Authority - G2 是一个较旧的根，与其他无法更新的较旧的信任存储和客户端兼容。通过包括所有根 CA，您将能够确保应用程序的最大兼容性。

## 证书固定
<a name="best-practices-pinning"></a>

证书固定（有时也称为 SSL 固定）是一种可以在应用程序中使用的过程，通过将远程主机与其 X.509 证书或公钥而不是证书层次结构关联来验证远程主机。因此，该应用程序使用锁定来绕过 SSL/TLS 证书链验证。典型的 SSL 验证过程将检查证书链 (从根证书颁发机构 (CA) 证书到从属 CA 证书 (如果有)) 中的签名。此外，它还检查层次结构底部远程主机的证书。您的应用程序可改为固定到远程主机的证书以指示*仅* 该证书 (而非根证书或链中的任何其他证书) 受信任。在应用程序开发过程中，您可以将远程主机的证书或公有密钥添加到应用程序。或者，应用程序也可以在首次连接到主机时添加证书或密钥。

**警告**  
建议您的应用程序**不**固定 ACM 证书。ACM 会在您的 Amazon-issued SSL/TLS 证书[中的托管证书续订 Amazon Certificate Manager](managed-renewal.md)到期之前自动续订证书。为了续订证书，ACM 会生成新的公有-私有密钥对。如果您的应用程序固定 ACM 证书，并且已使用新的公有密钥成功续订证书，则应用程序可能无法连接到您的域。

如果您决定固定证书，则以下选项将不会阻止您的应用程序连接到您的域：
+ [将您自己的证书导入](https://docs.amazonaws.cn/acm/latest/userguide/import-certificate.html)到 ACM，然后将您的应用程序固定到导入的证书。ACM 不会尝试自动续订导入的证书。
+ 如果您使用的是公有证书，则将您的应用程序固定到所有可用的 [Amazon 根证书](https://www.amazontrust.com/repository/)。如果您使用的是私有证书，则将您的应用程序固定到 CA 的根证书。

## 域验证
<a name="best-practices-validating"></a>

在 Amazon 证书颁发机构 (CA) 为您的网站颁发证书之前，Amazon Certificate Manager(ACM) 必须验证您是否拥有或控制您在请求中指定的所有域。您可以使用电子邮件或 DNS 执行验证。有关更多信息，请参阅 [Amazon Certificate Manager 域名系统验证DNS 验证](dns-validation.md) 和 [Amazon Certificate Manager 电子邮件验证](email-validation.md)。

## 添加或删除域名
<a name="best-practices-add-delete"></a>

您无法在现有 ACM 证书中添加或删除域名。而必须请求包含修订过的域名列表的新证书。例如，如果证书有五个域名，并且需要添加四个域名，则必须请求包含九个域名的新证书。与任何新证书一样，您必须对请求中的所有域名验证所有权，包括之前为原始证书验证过的域名。

如果使用电子邮件验证，则对于每个域，您最多将收到 8 封验证电子邮件，并且您必须在 72 小时之内至少根据其中 1 封邮件执行操作。例如，如果请求包含五个域名的证书，您最多将收到 40 封验证电子邮件，并且您必须在 72 小时之内至少根据其中 5 封执行操作。随着证书请求中域名数量的增加，使用电子邮件来验证域所有权所需的工作量也会增加。

如果改为使用 DNS 验证，则必须为需要验证的 FQDN 向数据库写入一条新 DNS 记录。ACM 会向您发送要创建的记录，并在稍后查询数据库以确定是否已添加该记录。添加该记录即声明您拥有或可以控制该域。在前面的示例中，如果请求包含五个域名的证书，则必须创建五条 DNS 记录。建议您尽量使用 DNS 验证。

## 打开Amazon CloudTrail
<a name="best-practices-ct"></a>

在开始使用 ACM 之前，请开启 CloudTrail 日志功能。 CloudTrail 允许您通过检索账户的 Amazon API 调用历史记录来监控您的Amazon部署，包括通过Amazon管理控制台、软件开发工具包和更高级别的 Amazon Web Amazon Services 进行的 API 调用。Amazon Command Line Interface您还可以确定哪些用户和账户调用了 ACM API、发出调用的源 IP 地址以及发生调用的时间。您可以使用 API CloudTrail 集成到应用程序中，为您的组织自动创建跟踪，检查跟踪的状态，并控制管理员如何开启和关闭 CloudTrail 登录功能。有关更多信息，请参阅[创建跟踪](https://docs.amazonaws.cn/awscloudtrail/latest/userguide/cloudtrail-create-and-update-a-trail.html)。转到 [CloudTrail 与一起使用 Amazon Certificate Manager](cloudtrail.md) 以查看 ACM 操作的示例跟踪记录。