

# 在 Amazon Certificate Manager 中准备好证书
<a name="how-to-specify-certificate-for-custom-domain-name"></a>

为 API 设置自定义域名之前，您必须先在 Amazon Certificate Manager 中准备好 SSL/TLS 证书 有关更多信息，请参阅[《Amazon Certificate Manager 用户指南》](https://docs.amazonaws.cn/acm/latest/userguide/)。

## 注意事项
<a name="how-to-specify-certificate-for-custom-domain-name-considerations"></a>

以下是 SSL/TLS 证书的注意事项。
+ 如果您创建边缘优化的自定义域名，API Gateway 将利用 CloudFront 来支持自定义域名的证书。因此，自定义域名 SSL/TLS 证书的要求和限制由 [CloudFront](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html) 决定。例如，公有密钥的最大大小为 2048，而私有密钥大小可以是 1024、2048 和 4096。公有密钥的大小取决于所用的证书颁发机构。要求证书颁发机构返回大小不同于默认长度的密钥。有关更多信息，请参阅[安全访问对象](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/using-https.html)和[创建签名 URL 和签名 Cookie](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/private-content-trusted-signers.html)。
+ 如果创建区域自定义域名，则公有密钥的最大大小为 2048。
+ 要将 ACM 证书与区域自定义域名结合使用，您必须在与 API 相同的区域中请求或导入证书。证书必须涵盖自定义域名。
+  要将 ACM 证书与边缘优化的自定义域名结合使用，您必须在美国东部（弗吉尼亚州北部） - `us-east-1` 区域中请求或导入证书。
+  您必须有一个已注册的域名，例如 `example.com`。您可以使用 [Amazon Route 53](https://docs.amazonaws.cn/Route53/latest/DeveloperGuide/) 或获得认可的第三方域注册商。要获取此类注册商的列表，请参阅 ICANN 网站上[获得认可的注册商目录](https://www.icann.org/en/accredited-registrars)。

## 在 ACM 中创建或导入 SSL/TLS 证书
<a name="how-to-specify-certificate-for-custom-domain-name-setup"></a>

以下过程说明了如何为域名创建或导入 SSL/TLS 证书。

------
#### [ To request a certificate provided by ACM for a domain name ]

1. 登录到 [Amazon Certificate Manager 控制台](https://console.amazonaws.cn/acm)。

1. 选择**请求证书**。

1. 对于**证书类型**，选择**请求公有证书**。

1. 选择**下一步**。

1. 对于**完全限定域名**，为您的 API 输入一个自定义域名，例如 `api.example.com`。

1. （可选）选择**向此证书添加一个名称**。

1. 对于**验证方法**，选择一种验证域名所有权的方法。

1. 对于**密钥算法**，选择一种加密算法。

1. 选择**请求**。

1. 如果请求有效，Internet 域中注册的拥有者必须同意请求，然后 ACM 才能颁发证书。如果您使用 Route 53 管理您的公有 DNS 记录，则可以直接通过 ACM 控制台更新您的记录。

------
#### [ To import into ACM a certificate for a domain name ]

1.  从证书颁发机构为自定义域名获取 PEM 编码的 SSL/TLS 证书。要获取此类 CA 的部分列表，请参阅 [Mozilla 内置 CA 列表](https://ccadb.my.salesforce-sites.com/mozilla/IncludedCACertificateReport) 

   1. 使用 OpenSSL 网站中的 [OpenSSL](https://www.openssl.org) 工具包生成证书的私有密钥并将输出结果保存到文件中：

      ```
      openssl genrsa -out private-key-file 2048
      ```

   1. 使用 OpenSSL 通过之前生成的私有密钥生成证书签名请求 (CSR)：

      ```
      openssl req -new -sha256 -key private-key-file -out CSR-file
      ```

   1. 将 CSR 提交给证书颁发机构并保存生成的证书。

   1. 从证书颁发机构下载证书链。
**注意**  
 如果您通过其他方式获取了私有密钥并且密钥已加密，则您可以使用以下命令解密密钥，然后再将其提交到 API Gateway 以便设置自定义域名。  

   ```
   openssl pkcs8 -topk8 -inform pem -in MyEncryptedKey.pem -outform pem -nocrypt -out MyDecryptedKey.pem
   ```

1. 将证书上传到 Amazon Certificate Manager：

   1. 登录到 [Amazon Certificate Manager 控制台](https://console.amazonaws.cn/acm)。

   1. 选择**导入证书**。

   1. 对于**证书正文**，输入从证书颁发机构提供的 PEM 格式的服务器证书的正文。下面显示了此类证书的简短示例。

      ```
      -----BEGIN CERTIFICATE-----
      EXAMPLECA+KgAwIBAgIQJ1XxJ8Pl++gOfQtj0IBoqDANBgkqhkiG9w0BAQUFADBB
      ...
      az8Cg1aicxLBQ7EaWIhhgEXAMPLE
      -----END CERTIFICATE-----
      ```

   1. 对于**证书私有密钥**，输入 PEM 格式的证书的私有密钥。下面显示了此类密钥的简短示例。

      ```
      -----BEGIN RSA PRIVATE KEY-----
      EXAMPLEBAAKCAQEA2Qb3LDHD7StY7Wj6U2/opV6Xu37qUCCkeDWhwpZMYJ9/nETO
      ...
      1qGvJ3u04vdnzaYN5WoyN5LFckrlA71+CszD1CGSqbVDWEXAMPLE
      -----END RSA PRIVATE KEY-----
      ```

   1. 对于**证书链**，输入 PEM 格式的中间证书和根证书（可选），一个接一个，不带任何空白行。如果包含了根证书，您的证书链必须以中间证书开始，以根证书结尾。使用证书颁发机构提供的中间证书。不要包含未在信任路径链中的任何中间证书。下面显示了一个简短示例。

      ```
      -----BEGIN CERTIFICATE-----
      EXAMPLECA4ugAwIBAgIQWrYdrB5NogYUx1U9Pamy3DANBgkqhkiG9w0BAQUFADCB
      ...
      8/ifBlIK3se2e4/hEfcEejX/arxbx1BJCHBvlEPNnsdw8EXAMPLE
      -----END CERTIFICATE-----
      ```

      以下是另一个示例。

      ```
      -----BEGIN CERTIFICATE-----
      Intermediate certificate 2
      -----END CERTIFICATE-----
      -----BEGIN CERTIFICATE-----
      Intermediate certificate 1
      -----END CERTIFICATE-----
      -----BEGIN CERTIFICATE-----
      Optional: Root certificate
      -----END CERTIFICATE-----
      ```

   1. 选择**下一步**，然后再次选择**下一步**。

------

成功创建或导入证书后，请记下证书的 ARN。您在设置自定义域名时会需要它。