AWS Key Management Service
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Amazon Simple Email Service (Amazon SES) 如何使用 AWS KMS

您可以使用 Amazon Simple Email Service (Amazon SES) 接收电子邮件并(选择性地)加密收到的电子邮件,然后再将它们存储在您选择的 Amazon Simple Storage Service (Amazon S3) 存储桶中。如果您将 Amazon SES 配置为加密电子邮件,则必须选择 Amazon SES 加密邮件时要使用的 KMS 客户主密钥 (CMK)。您可以为 Amazon SES 选择账户默认 CMK(使用别名 aws/ses),也可以选择您在 AWS KMS 中单独创建的自定义 CMK。

有关如何使用 Amazon SES 接收电子邮件的更多信息,请参阅 Amazon Simple Email Service 开发人员指南 中的使用 Amazon SES 接收电子邮件

使用 AWS KMS 的 Amazon SES 加密概述

当您将 Amazon SES 配置为接收电子邮件并加密电子邮件,然后将其保存到 S3 存储桶时,其过程将如下所述:

  1. 您为 Amazon SES 创建一个接收规则,同时指定 S3 操作、用于存储的 S3 存储桶以及用于加密的 KMS 客户主密钥 (CMK)。

  2. Amazon SES 接收与您的接收规则匹配的电子邮件。

  3. Amazon SES 请求已使用您在适用接收规则中指定的 KMS CMK 加密的唯一数据密钥。

  4. AWS KMS 创建一个新的数据密钥,使用指定的 CMK 对其进行加密,然后将已加密的数据密钥明文副本发送到 Amazon SES。

  5. Amazon SES 使用明文数据密钥加密电子邮件,并在使用后尽快从内存中删除该明文数据密钥。

  6. Amazon SES 将加密的电子邮件和加密的数据密钥放入指定的 S3 存储桶中。加密的数据密钥将存储为加密电子邮件的元数据。

为完成步骤 3步骤 6,Amazon SES 将使用 AWS 提供的 Amazon S3 加密客户端。使用同一客户端从 Amazon S3 检索加密的电子邮件并对其进行解密。有关更多信息,请参阅获取和解密电子邮件

Amazon SES 加密上下文

当 Amazon SES 请求数据密钥来加密您收到的电子邮件时(使用 AWS KMS 的 Amazon SES 加密概述中的步骤 3),它会在请求中包含加密上下文。加密上下文提供了 AWS KMS 为确保数据完整性而使用的额外的身份验证数据。加密上下文也将写入您的 AWS CloudTrail 日志文件,这有助于您了解为什么使用给定的客户主密钥 (CMK)。Amazon SES 使用以下加密上下文:

  • 您已在其中将 AWS 配置为接收电子邮件的 Amazon SES 账户的 ID

  • 对电子邮件调用 S3 操作的 Amazon SES 接收规则的规则名称

  • 电子邮件的 Amazon SES 邮件 ID

以下示例显示了 Amazon SES 使用的加密上下文的 JSON 表示形式:

{ "aws:ses:source-account": "111122223333", "aws:ses:rule-name": "example-receipt-rule-name", "aws:ses:message-id": "d6iitobk75ur44p8kdnnp7g2n800" }

为 Amazon SES 提供使用 AWS KMS 客户主密钥 (CMK) 的权限

您可以为别名为 aws/ses 的 Amazon SES 使用账户默认客户主密钥 (CMK),也可以使用您创建的自定义 CMK。如果您为 Amazon SES 使用默认 CMK,则不需要执行任何步骤来为 Amazon SES 提供使用它的权限。但是,要在向 Amazon SES 接收规则添加 S3 操作时指定自定义 CMK,您必须确保 Amazon SES 有权使用 CMK 加密您的电子邮件。要为 Amazon SES 提供使用您的自定义 CMK 的权限,请将以下语句添加到 CMK 的密钥策略中:

{ "Sid": "Allow SES to encrypt messages using this master key", "Effect": "Allow", "Principal": {"Service": "ses.amazonaws.com"}, "Action": [ "kms:Encrypt", "kms:GenerateDataKey*" ], "Resource": "*", "Condition": { "Null": { "kms:EncryptionContext:aws:ses:rule-name": false, "kms:EncryptionContext:aws:ses:message-id": false }, "StringEquals": {"kms:EncryptionContext:aws:ses:source-account": "ACCOUNT-ID-WITHOUT-HYPHENS"} } }

ACCOUNT-ID-WITHOUT-HYPHENS 替换为您已在其中将 Amazon SES 配置为接收电子邮件的 AWS 账户的 12 位数 ID。此策略语句仅允许 Amazon SES 在以下条件下使用此 CMK 加密数据:

  • Amazon SES 必须在其 AWS KMS API 请求的 EncryptionContext 中指定 aws:ses:rule-nameaws:ses:message-id

  • Amazon SES 必须在其 AWS KMS API 请求的 EncryptionContext 中指定 aws:ses:source-account,并且 aws:ses:source-account 的值必须与密钥策略中指定的 AWS 账户 ID 匹配。

有关 Amazon SES 在加密电子邮件时使用的加密上下文的更多信息,请参阅 Amazon SES 加密上下文。有关 AWS KMS 如何使用加密上下文的一般信息,请参阅加密上下文

获取和解密电子邮件

Amazon SES 无权解密您的加密电子邮件,也无法为您解密它们。您必须编写代码以从 Amazon S3 获取电子邮件并解密它们。为方便起见,请使用 Amazon S3 加密客户端。以下 AWS 开发工具包中包含 Amazon S3 加密客户端:

Amazon S3 加密客户端可简化以下工作:构建 Amazon S3 的必要请求,以检索加密电子邮件;构建对 AWS KMS 的必要请求,以解密邮件的加密数据密钥;以及解密电子邮件。例如,要成功解密加密的数据密钥,您传递的加密上下文必须与 Amazon SES 在从 AWS KMS 请求数据密钥时传递的加密上下文(使用 AWS KMS 的 Amazon SES 加密概述中的步骤 3)。Amazon S3 加密客户端可以为您处理这一情况及其他许多工作。

对于使用AWS SDK for Java中的 Amazon S3 加密客户端执行客户端解密的示例代码,请参阅以下内容: