

# 在 IAM 中管理服务器证书
<a name="id_credentials_server-certs"></a>

要在 AWS 中启用与您的网站或应用程序的 HTTPS 连接，您需要 SSL/TLS *服务器证书*。对于 AWS Certificate Manager (ACM) 支持的区域中的证书，我们建议您使用 ACM 预置、管理和部署您的服务器证书。在不支持的区域中，您必须将 IAM 作为证书管理器。要了解 ACM 支持的具体区域，请参阅《AWS 一般参考》中的 [AWS Certificate Manager 端点和限额](https://docs.aws.amazon.com/general/latest/gr/acm.html)**。

**重要**  
ACM 是预置、管理和部署您的服务器证书的首选工具。利用 ACM，您可以请求证书或将现有 ACM 或外部证书部署到 AWS 资源。ACM 提供的证书是免费的，并将自动续订。在[支持的区域](https://docs.aws.amazon.com/general/latest/gr/acm.html)中，您可以使用 ACM 从控制台中或以编程方式管理服务器证书。有关使用 ACM 的更多信息，请参阅 [https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html](https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html)。有关请求 ACM 证书的更多信息，请参阅*AWS Certificate Manager用户指南*中的[请求公有证书](https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-request-public.html)或[请求私有证书](https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-request-private.html)。有关将第三方证书导入 ACM 中的更多信息，请参阅 *AWS Certificate Manager 用户指南*中的[导入证书](https://docs.aws.amazon.com/acm/latest/userguide/import-certificate.html)。

只有当您必须在 [ACM 不支持](https://docs.aws.amazon.com/general/latest/gr/acm.html)的区域中支持 HTTPS 连接时，才应使用 IAM 作为证书管理器。IAM 安全地加密您的私有密钥并将加密的版本存储在 IAM SSL 证书存储中。IAM 支持在所有区域部署服务器证书，但您必须从外部提供商获取证书，以便与 AWS 搭配使用。您无法将 ACM 证书上传到 IAM。此外，您还无法从 IAM 控制台管理证书，

有关将第三方证书上传到 IAM 的更多信息，请参阅以下主题。

**Topics**
+ [上传服务器证书（AWS API）](#upload-server-certificate)
+ [服务器证书的 AWS API 操作](#id_credentials_server-certs-api)
+ [排查服务器证书问题](#server-certificate-troubleshooting)

## 上传服务器证书（AWS API）
<a name="upload-server-certificate"></a>

要将服务器证书上传到 IAM，您必须提供证书及其匹配的私有密钥。如果证书不是自签名的，则您还必须提供证书链。(上传自签名证书时无需证书链。) 在上传证书前，请确保您已具有所有这些项目而且它们满足以下条件：
+ 证书在上传时必须是有效的。您不能在证书有效期开始 (证书的 `NotBefore` 日期) 之前或证书有效期到期 (证书的 `NotAfter` 日期) 之后上传证书。
+ 私有密钥必须是未加密的。您不能上传受密码或口令保护的私有密钥。有关解密已加密的私有密钥的帮助信息，请参阅[排查服务器证书问题](#server-certificate-troubleshooting)。
+ 证书、私有密钥和证书链必须均采用 PEM 编码。有关将这些项目转换为 PEM 格式的帮助信息，请参阅[排查服务器证书问题](#server-certificate-troubleshooting)。

要使用 [IAM API](https://docs.aws.amazon.com/IAM/latest/APIReference/) 上传证书，请发送 [UploadServerCertificate](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UploadServerCertificate.html) 请求。以下示例说明如何使用 [AWS Command Line Interface (AWS CLI)](https://aws.amazon.com/cli/) 执行该操作。示例假定以下各项：
+ PEM 编码的证书存储在名为 `Certificate.pem` 的文件中。
+ PEM 编码的证书链存储在名为 `CertificateChain.pem` 的文件中。
+ PEM 编码的未加密私有密钥存储在名为 `PrivateKey.pem` 的文件中。
+ （可选）您希望用键-值对标记服务器证书。例如，您可以添加标签键 `Department` 和标签值 `Engineering` 来帮助识别和组织证书。

要使用以下示例命令，请用自己的文件名替换这些文件名。将 *ExampleCertificate* 替换为已上传证书的名称。如果要标记证书，请将 *ExampleKey* 和 *ExampleValue* 标签键值对替换为您自己的值。在一个连续行上键入命令。为更便于阅读，以下示例包含了换行符和多余的空格。

```
aws iam upload-server-certificate --server-certificate-name ExampleCertificate
                                    --certificate-body file://Certificate.pem
                                    --certificate-chain file://CertificateChain.pem
                                    --private-key file://PrivateKey.pem
                                    --tags '{"Key": "ExampleKey", "Value": "ExampleValue"}'
```

如果上述命令执行成功，则它将返回有关上传的证书的元数据，包括其 [Amazon Resource Name (ARN)](reference_identifiers.md#identifiers-arns)、友好名称、标识符 (ID)、到期日期、标签等。

**注意**  
如果您要上传服务器证书以用于 Amazon CloudFront，则必须使用 `--path` 选项指定路径。路径必须以 `/cloudfront` 开头且必须包含尾部反斜杠 (例如，`/cloudfront/test/`)。

要使用 AWS Tools for Windows PowerShell上传证书，请使用 [Publish-IAMServerCertificate](https://docs.aws.amazon.com/powershell/latest/reference/Index.html?page=Publish-IAMServerCertificate.html&tocid=Publish-IAMServerCertificate)。

## 服务器证书的 AWS API 操作
<a name="id_credentials_server-certs-api"></a>

使用以下命令来查看、标记、重命名和删除服务器证书。
+ 使用 [GetServerCertificate](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetServerCertificate.html) 命令来检索证书。此请求会返回证书、证书链（如果已上传一个）和有关证书的元数据。
**注意**  
在您上传后，无法从 IAM 下载或检索私有密钥。
+ 使用 [Get-IAMServerCertificate](https://docs.aws.amazon.com/powershell/latest/reference/Index.html?page=Get-IAMServerCertificate.html&tocid=Get-IAMServerCertificate) 来检索证书。
+ 使用 [ListServerCertificates](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListServerCertificates.html) 列出已上传的服务器证书。该请求会返回包含有关每个证书的元数据的列表。
+ 使用 [Get-IAMServerCertificates](https://docs.aws.amazon.com/powershell/latest/reference/Index.html?page=Get-IAMServerCertificates.html&tocid=Get-IAMServerCertificates) 列出已上传的服务器证书。
+ 使用 [TagServerCertificate](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagServerCertificate.html) 标记现有的服务器证书。
+ 使用 [UntagServerCertificate](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UntagServerCertificate.html) 取消标记服务器证书。
+ 使用 [UpdateServerCertificate](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateServerCertificate.html) 重命名服务器证书或更新其路径。

   以下示例说明如何使用 AWS CLI 执行该操作。

  要使用以下示例命令，请将旧的证书名称和证书路径替换为新的，然后在一个连续行上键入命令。为更便于阅读，以下示例包含了换行符和多余的空格。

  ```
  aws iam update-server-certificate --server-certificate-name ExampleCertificate
                                      --new-server-certificate-name CloudFrontCertificate
                                      --new-path /cloudfront/
  ```

  要使用 AWS Tools for Windows PowerShell 重命名服务器证书或更新其路径，请使用 [Update-IAMServerCertificate](https://docs.aws.amazon.com/powershell/latest/reference/Index.html?page=Update-IAMServerCertificate.html&tocid=Update-IAMServerCertificate)。
+ 使用 [DeleteServerCertificate](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteServerCertificate.html) 删除服务器证书。

  要使用 AWS Tools for Windows PowerShell 删除服务器证书，请使用 [Remove-IAMServerCertificate](https://docs.aws.amazon.com/powershell/latest/reference/Index.html?page=Remove-IAMServerCertificate.html&tocid=Remove-IAMServerCertificate)。

## 排查服务器证书问题
<a name="server-certificate-troubleshooting"></a>

您必须先确保证书、私有密钥和证书链均是 PEM 编码的，然后才能将证书上传到 IAM。您还必须确保私有密钥是未加密的。请见以下 示例。

**Example PEM 编码证书示例**  

```
-----BEGIN CERTIFICATE-----
Base64-encoded certificate
-----END CERTIFICATE-----
```

**Example PEM 编码的未加密的私有密钥示例**  

```
-----BEGIN RSA PRIVATE KEY-----
Base64-encoded private key
-----END RSA PRIVATE KEY-----
```

**Example PEM 编码的证书链示例**  
一个证书链包含一个或多个证书。您可以使用文本编辑器、Windows 中的复制命令或 Linux cat 命令，以将证书文件串联到一个链中。如果包含多个证书，则每个证书必须证明上一个证书。您可以串联证书以完成该操作，包括最后的根 CA 证书。  
以下示例包含三个证书，但证书链可能包含更多或更少的证书。  

```
-----BEGIN CERTIFICATE-----
Base64-encoded certificate
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
Base64-encoded certificate
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
Base64-encoded certificate
-----END CERTIFICATE-----
```

如果这些项目在上传到 IAM 时未采用正确的格式，您可以使用 [OpenSSL](https://openssl.org/) 将其转换为正确的格式。

**将证书或证书链从 DER 转换为 PEM**  
使用 [OpenSSL **x509** 命令](https://openssl.org/docs/manmaster/man1/x509.html)，如以下示例所示。在以下示例命令中，将 `Certificate.der` 替换为包含您的 DER 编码的证书的文件的名称。将 `Certificate.pem` 替换为要包含 PEM 编码的证书的输出文件的首选名称。  

```
openssl x509 -inform DER -in Certificate.der -outform PEM -out Certificate.pem
```
 

**将私有密钥从 DER 转换为 PEM**  
使用 [OpenSSL **rsa** 命令](https://openssl.org/docs/manmaster/man1/rsa.html)，如以下示例所示。在以下示例命令中，将 `PrivateKey.der` 替换为包含您的 DER 编码的私有密钥的文件的名称。将 `PrivateKey.pem` 替换为要包含 PEM 编码的私有密钥的输出文件的首选名称。  

```
openssl rsa -inform DER -in PrivateKey.der -outform PEM -out PrivateKey.pem
```
 

**解密已加密的私有密钥 (删除密码或口令)**  
使用 [OpenSSL **rsa** 命令](https://openssl.org/docs/manmaster/man1/rsa.html)，如以下示例所示。要使用以下示例命令，请将 `EncryptedPrivateKey.pem` 替换为包含您的已加密的私有密钥的文件的名称。将 `PrivateKey.pem` 替换为要包含 PEM 编码的未加密私有密钥的输出文件的首选名称。  

```
openssl rsa -in EncryptedPrivateKey.pem -out PrivateKey.pem
```
 

**将证书包从 PKCS\$112 (PFX) 转换为 PEM**  
使用 [OpenSSL **pkcs12** 命令](https://openssl.org/docs/manmaster/man1/pkcs12.html)，如以下示例所示。在以下示例命令中，将 `CertificateBundle.p12` 替换为包含您的 PKCS\$112 编码的证书包的文件的名称。将 `CertificateBundle.pem` 替换为要包含 PEM 编码的证书捆绑包的输出文件的首选名称。  

```
openssl pkcs12 -in CertificateBundle.p12 -out CertificateBundle.pem -nodes
```
 

**将证书包从 PKCS\$17 转换为 PEM**  
使用 [OpenSSL **pkcs7** 命令](https://openssl.org/docs/manmaster/man1/pkcs7.html)，如以下示例所示。在以下示例命令中，将 `CertificateBundle.p7b` 替换为包含您的 PKCS\$17 编码的证书包的文件的名称。将 `CertificateBundle.pem` 替换为要包含 PEM 编码的证书捆绑包的输出文件的首选名称。  

```
openssl pkcs7 -in CertificateBundle.p7b -print_certs -out CertificateBundle.pem
```