

# 在目录存储桶中使用具有 AWS KMS 密钥的服务器端加密（SSE-KMS）
<a name="s3-express-UsingKMSEncryption"></a>

 AWS KMS 中的安全控制可帮助您满足与加密相关的合规性要求。可以选择将目录存储桶配置为使用具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS），并使用这些 KMS 密钥保护您在 Amazon S3 目录存储桶中的数据。有关 SSE-KMS 的更多信息，请参阅 [使用具有 AWS KMS 密钥的服务器端加密（SSE-KMS）](UsingKMSEncryption.md)。

**权限**  
要将使用 AWS KMS key加密的对象上传到 Amazon S3 或从 Amazon S3 中下载该对象，您需要对密钥具有 `kms:GenerateDataKey` 和 `kms:Decrypt` 权限。有关更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的[允许密钥用户使用 KMS 密钥进行加密操作](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-users-crypto)。有关分段上传所需的 AWS KMS 权限的信息，请参阅[分段上传 API 和权限](mpuoverview.md#mpuAndPermissions)。

有关用于 SSE-KMS 的 KMS 密钥的更多信息，请参阅[使用 AWS KMS (SSE-KMS) 指定服务器端加密](specifying-kms-encryption.md)。

**Topics**
+ [AWS KMS keys](#s3-express-aws-managed-customer-managed-keys)
+ [对跨账户操作使用 SSE-KMS](#s3-express-bucket-encryption-update-bucket-policy)
+ [Amazon S3 存储桶密钥](#s3-express-sse-kms-bucket-keys)
+ [需要 SSE-KMS](#s3-express-require-sse-kms)
+ [加密上下文](#s3-express-encryption-context)
+ [发送对 AWS KMS 加密对象的请求](#s3-express-aws-signature-version-4-sse-kms)
+ [审计目录存储桶中的 SSE-KMS 加密](#s3-express-bucket-encryption-sse-auditing)
+ [为目录存储桶中的新对象上传指定具有 AWS KMS 的服务器端加密（SSE-KMS）](s3-express-specifying-kms-encryption.md)

## AWS KMS keys
<a name="s3-express-aws-managed-customer-managed-keys"></a>

在存储桶的生命周期内，SSE-KMS 配置只能支持每个目录存储桶 1 个 [customer managed key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。[https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) (`aws/s3`) 不受支持。此外，在为 SSE-KMS 指定客户自主管理型密钥后，无法覆盖存储桶的 SSE-KMS 配置的客户自主管理型密钥。

可以通过以下方式，确定您为存储桶的 SSE-KMS 配置指定的客户自主管理型密钥：
+ 您发出 `HeadObject` API 操作请求以查找响应中 `x-amz-server-side-encryption-aws-kms-key-id` 的值。

要对数据使用新的客户自主管理型密钥，我们建议使用新的客户自主管理型密钥将现有对象复制到新的目录存储桶中。

当您在目录存储桶中指定用于加密的 [AWS KMS customer managed key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk) 时，请仅使用密钥 ID 或密钥 ARN。不支持 KMS 密钥的密钥别名格式。

有关用于 SSE-KMS 的 KMS 密钥的更多信息，请参阅[AWS KMS keys](UsingKMSEncryption.md#aws-managed-customer-managed-keys)。

## 对跨账户操作使用 SSE-KMS
<a name="s3-express-bucket-encryption-update-bucket-policy"></a>

在对目录存储桶中的跨账户操作使用加密时，请注意以下事项：
+ 如果您希望授予对 S3 对象的跨账户访问权限，请配置客户自主管理型密钥的策略，以支持从其它账户进行访问。
+ 要指定客户自主管理型密钥，必须使用完全限定的 KMS 密钥 ARN。

## Amazon S3 存储桶密钥
<a name="s3-express-sse-kms-bucket-keys"></a>

始终为目录存储桶中的 `GET` 和 `PUT` 操作启用 S3 存储桶密钥，并且不能禁用。当您通过 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html)、[https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html)、[批量操作中的 Copy 操作](directory-buckets-objects-Batch-Ops.md)或 [import 任务](create-import-job.md)，将 SSE-KMS 加密的对象从通用存储桶复制到目录存储桶、从目录存储桶复制到通用存储桶，或在目录存储桶之间复制时，不支持 S3 存储桶密钥。在这种情况下，每次对 KMS 加密的对象发出复制请求时，Amazon S3 都会调用 AWS KMS。

对于除 [CopyObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) 和 [UploadPartCopy](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html) 之外的[可用区端点（对象级）API 操作](s3-express-differences.md#s3-express-differences-api-operations)，可以通过 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html) 对请求进行身份验证和为请求授权，以实现低延迟。我们建议存储桶的默认加密使用所需的加密配置，并且不要在 `CreateSession` 请求或 `PUT` 对象请求中覆盖存储桶默认加密。然后，使用所需的加密设置自动对新对象进行加密。要使用 SSE-KMS 加密目录存储桶中的新对象，必须将具有 KMS 密钥（特别是 [customer managed key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)）的 SSE-KMS 指定为目录存储桶的默认加密配置。然后，在为可用区端点 API 操作创建会话时，将在会话期间使用 SSE-KMS 和 S3 存储桶密钥自动加密和解密新对象。有关目录存储桶中加密覆盖行为的更多信息，请参阅 [Specifying server-side encryption with AWS KMS for new object uploads](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html)。

S3 存储桶密钥在 Amazon S3 内限时使用，从而进一步减少了 Amazon S3 向 AWS KMS 发出请求以完成加密操作的需求。有关使用 S3 存储桶密钥的更多信息，请参阅 [Amazon S3 存储桶密钥](UsingKMSEncryption.md#sse-kms-bucket-keys)和[使用 Amazon S3 存储桶密钥降低 SSE-KMS 的成本](bucket-key.md)。

## 需要 SSE-KMS
<a name="s3-express-require-sse-kms"></a>

如果要求对特定目录存储桶中的所有对象使用 SSE-KMS，可以使用存储桶策略。例如，当您使用 `CreateSession` API 操作授予上传新对象的权限（`PutObject`、`CopyObject` 和 `CreateMultipartUpload`）时，如果 `CreateSession` 请求不包括用于请求 SSE-KMS 的 `x-amz-server-side-encryption-aws-kms-key-id` 标头，则以下存储桶策略将拒绝向任何人授予上传对象权限 (`s3express:CreateSession`)。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Id":"UploadObjectPolicy",
   "Statement":[{
         "Sid":"DenyObjectsThatAreNotSSEKMS",
         "Effect":"Deny",
         "Principal":"*",
         "Action":"s3express:CreateSession",
         "Resource":"arn:aws:s3express:us-east-1:111122223333:bucket/amzn-s3-demo-bucket--usw2-az1--x-s3",
         "Condition":{
            "Null":{
               "s3express:x-amz-server-side-encryption-aws-kms-key-id":"true"
            }
         }
      }
   ]
}
```

------

如要求使用特定 AWS KMS key 对存储桶中的对象进行加密，可以使用 `s3express:x-amz-server-side-encryption-aws-kms-key-id` 条件键。要指定 KMS 密钥，必须使用 `arn:aws:kms:region:acct-id:key/key-id` 格式的键 Amazon 资源名称（ARN）。AWS Identity and Access Management 不验证 `s3express:x-amz-server-side-encryption-aws-kms-key-id` 的字符串是否存在。Amazon S3 用于对象加密的 AWS KMS 密钥 ID 必须与策略中的 AWS KMS 密钥 ID 匹配，否则 Amazon S3 会拒绝请求。

有关如何将 SSE-KMS 用于新对象上传的更多信息，请参阅[为目录存储桶中的新对象上传指定具有 AWS KMS 的服务器端加密（SSE-KMS）](s3-express-specifying-kms-encryption.md)。

有关目录存储桶的特定条件键的完整列表，请参阅[使用 IAM 对区域端点 API 操作进行授权](s3-express-security-iam.md)。

## 加密上下文
<a name="s3-express-encryption-context"></a>

对于目录存储桶，*加密上下文* 是一组键值对，其中包含有关数据的上下文信息。不支持额外的加密上下文值。有关加密上下文的更多信息，请参阅[加密上下文](UsingKMSEncryption.md#encryption-context)。



默认情况下，如果您在目录存储桶上使用 SSE-KMS，Amazon S3 将使用存储桶 Amazon 资源名称（ARN）作为加密上下文对：

```
arn:aws:s3express:region:account-id:bucket/bucket-base-name--zone-id--x-s3
```

确保 IAM 策略或 AWS KMS 密钥策略使用存储桶 ARN 作为加密上下文。

可以选择通过在可用区端点 API 请求（例如 [CreateSession](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html#API_CreateSession_RequestSyntax)）中使用 `x-amz-server-side-encryption-context` 标头，来提供显式加密上下文对。此标头的值是 UTF-8 编码的 JSON 的 Base64 编码字符串，其中包含作为键值对的加密上下文。对于目录存储桶，加密上下文必须与默认加密上下文 [即存储桶 Amazon 资源名称（ARN）] 相匹配。此外，由于加密上下文未加密，请确保它不包含敏感信息。

您可以使用加密上下文来标识和分类加密操作。还可以通过查看哪个目录存储桶 ARN 与哪个加密密钥一起使用，来使用默认加密上下文 ARN 值跟踪 AWS CloudTrail 中的相关请求。

在 CloudTrail 日志文件的 `requestParameters` 字段中，如果您在目录存储桶上使用 SSE-KMS，则加密上下文值为存储桶的 ARN。

```
"encryptionContext": {
    "aws:s3express:arn": "arn:aws:s3:::arn:aws:s3express:region:account-id:bucket/bucket-base-name--zone-id--x-s3"
}
```

此外，要在目录存储桶中使用 SSE-KMS 为对象加密，AWS KMS CloudTrail 事件将记录存储桶 ARN 而不是对象 ARN。

## 发送对 AWS KMS 加密对象的请求
<a name="s3-express-aws-signature-version-4-sse-kms"></a>

只能通过 HTTPS（TLS）访问目录存储桶。此外，目录存储桶使用 AWS 签名版本 4（SigV4）对请求进行签名。有关发送针对 AWS KMS 加密对象的请求的更多信息，请参阅[发送对 AWS KMS 加密对象的请求](UsingKMSEncryption.md#aws-signature-version-4-sse-kms)。

如果对象使用 SSE-KMS，则不应对 `GET` 请求和 `HEAD` 请求发送加密请求标头。否则，您会收到 HTTP 400 错误请求错误。

## 审计目录存储桶中的 SSE-KMS 加密
<a name="s3-express-bucket-encryption-sse-auditing"></a>

要审计为 SSE-KMS 加密数据使用 AWS KMS 密钥的情况，您可以使用 AWS CloudTrail 日志。您可以深入了解自己的[加密操作](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#cryptographic-operations)，例如 [https://docs.aws.amazon.com/kms/latest/developerguide/ct-generatedatakey.html](https://docs.aws.amazon.com/kms/latest/developerguide/ct-generatedatakey.html) 和 [https://docs.aws.amazon.com/kms/latest/developerguide/ct-decrypt.html](https://docs.aws.amazon.com/kms/latest/developerguide/ct-decrypt.html)。CloudTrail 支持多种[属性值](https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_LookupEvents.html)来筛选您的搜索，包括事件名称、用户名和事件源。

**Topics**
+ [AWS KMS keys](#s3-express-aws-managed-customer-managed-keys)
+ [对跨账户操作使用 SSE-KMS](#s3-express-bucket-encryption-update-bucket-policy)
+ [Amazon S3 存储桶密钥](#s3-express-sse-kms-bucket-keys)
+ [需要 SSE-KMS](#s3-express-require-sse-kms)
+ [加密上下文](#s3-express-encryption-context)
+ [发送对 AWS KMS 加密对象的请求](#s3-express-aws-signature-version-4-sse-kms)
+ [审计目录存储桶中的 SSE-KMS 加密](#s3-express-bucket-encryption-sse-auditing)
+ [为目录存储桶中的新对象上传指定具有 AWS KMS 的服务器端加密（SSE-KMS）](s3-express-specifying-kms-encryption.md)

# 为目录存储桶中的新对象上传指定具有 AWS KMS 的服务器端加密（SSE-KMS）
<a name="s3-express-specifying-kms-encryption"></a>

对于目录存储桶，要使用服务器端加密来加密您的数据，可以使用具有 Amazon S3 托管式密钥的服务器端加密（SSE-S3）（默认设置）或具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）。我们建议存储桶的默认加密使用所需的加密配置，并且不要在 `CreateSession` 请求或 `PUT` 对象请求中覆盖存储桶默认加密。然后，使用所需的加密设置自动对新对象进行加密。有关目录存储桶中加密覆盖行为的更多信息，请参阅 [Specifying server-side encryption with AWS KMS for new object uploads](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html)。

默认情况下，所有 Amazon S3 存储桶都配置了加密，所有上传到 S3 存储桶的新对象都会自动静态加密。具有 Amazon S3 托管密钥的服务器端加密（SSE-S3）是 Amazon S3 中每个存储桶的默认加密配置。如果要为目录存储桶指定不同的加密类型，可以使用具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）。要使用 SSE-KMS 加密目录存储桶中的新对象，必须将具有 KMS 密钥（特别是 [customer managed key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)）的 SSE-KMS 指定为目录存储桶的默认加密配置。[AWS 托管式密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) (`aws/s3`) 不受支持。在存储桶的生命周期内，SSE-KMS 配置只能支持每个目录存储桶 1 个 [customer managed key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。在为 SSE-KMS 指定客户自主管理型密钥后，无法覆盖存储桶的 SSE-KMS 配置的客户自主管理型密钥。然后，当您使用 SSE-KMS 为新的对象指定服务器端加密设置时，必须确保加密密钥与您为目录存储桶的默认加密配置指定的客户自主管理型密钥相同。要对数据使用新的客户自主管理型密钥，我们建议使用新的客户自主管理型密钥将现有对象复制到新的目录存储桶中。

当您上传新对象或复制现有对象时，您可以应用加密。如果更改对象的加密，则会创建一个新对象来替换旧对象。

可以使用 REST API 操作、AWS SDK 和 AWS Command Line Interface（AWS CLI）指定 SSE-KMS。

**注意**  
 对于目录存储桶，加密覆盖行为如下所示：  
当您将 [CreateSession](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html) 与 REST API 结合使用来验证可用区端点 API 请求并对其进行授权（[CopyObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) 和 [UploadPartCopy](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html) 除外）时，仅当之前使用 SSE-KMS 指定了存储桶的默认加密时，才能将加密设置覆盖为 SSE-S3 或 SSE-KMS。
当您将 [CreateSession](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html) 与 AWS CLI 或 AWS SDK 结合使用来对可用区端点 API 请求进行身份验证并为其授权（[CopyObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) 和 [UploadPartCopy](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html) 除外）时，您根本无法覆盖加密设置。
在发出 [CopyObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) 请求时，仅当之前使用 SSE-KMS 指定了存储桶的默认加密时，才能将加密设置覆盖为 SSE-S3 或 SSE-KMS。当您发出 [UploadPartCopy](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html) 请求时，无法覆盖加密设置。
您可以在 Amazon S3 中使用多区域 AWS KMS keys。但是，Amazon S3 目前将多区域密钥视为单区域密钥，且不使用密钥的多区域特征。有关更多信息，请参阅 *AWS Key Management Service 开发人员指南*中的[使用多区域密钥](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html)。
如果您希望使用其它账户拥有的 KMS 密钥，您必须有权使用该密钥。有关 KMS 密钥的跨账户权限的更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的[创建其他账户可以使用的 KMS 密钥](https://docs.aws.amazon.com//kms/latest/developerguide/key-policy-modifying-external-accounts.html#cross-account-console)。

## 使用 REST API
<a name="s3-express-KMSUsingRESTAPI"></a>

**注意**  
 在存储桶的生命周期内，对于每个目录存储桶只支持 1 个 [customer managed key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。[https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) (`aws/s3`) 不受支持。将具有客户自主管理型密钥的 SSE-KMS 指定为存储桶的默认加密配置后，您无法更改存储桶的 SSE-KMS 配置的客户自主管理型密钥。

对于除 [CopyObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) 和 [UploadPartCopy](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html) 之外的[可用区端点（对象级）API 操作](s3-express-differences.md#s3-express-differences-api-operations)，可以通过 [CreateSession](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html) 对请求进行身份验证和为请求授权，以实现低延迟。我们建议存储桶的默认加密使用所需的加密配置，并且不要在 `CreateSession` 请求或 `PUT` 对象请求中覆盖存储桶默认加密。然后，使用所需的加密设置自动对新对象进行加密。要使用 SSE-KMS 加密目录存储桶中的新对象，必须将具有 KMS 密钥（特别是 [customer managed key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)）的 SSE-KMS 指定为目录存储桶的默认加密配置。然后，在为可用区端点 API 操作创建会话时，将在会话期间使用 SSE-KMS 和 S3 存储桶密钥自动加密和解密新对象。有关目录存储桶中加密覆盖行为的更多信息，请参阅 [Specifying server-side encryption with AWS KMS for new object uploads](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html)。

在使用 REST API 的可用区端点 API 调用中（[CopyObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) 和 [UploadPartCopy](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html) 除外），您无法覆盖 `CreateSession` 请求中加密设置（`x-amz-server-side-encryption`、`x-amz-server-side-encryption-aws-kms-key-id`、`x-amz-server-side-encryption-context` 和 `x-amz-server-side-encryption-bucket-key-enabled`）的值。无需在可用区端点 API 调用中显式指定这些加密设置值，Amazon S3 将使用 `CreateSession` 请求中的加密设置值来保护目录存储桶中的新对象。

**注意**  
当您使用 AWS CLI 或 AWS SDK 时，对于 `CreateSession`，会话令牌会自动刷新，以避免在会话到期时服务中断。AWS CLI 或 AWS SDK 将存储桶的默认加密配置用于 `CreateSession` 请求。不支持覆盖 `CreateSession` 请求中的加密设置值。此外，在可用区端点 API 调用（[CopyObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) 和 [UploadPartCopy](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html) 除外）中，不支持覆盖 `CreateSession` 请求中加密设置的值。

对于 [CopyObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html)，要使用 SSE-KMS 加密目录存储桶中新的对象副本，必须将具有 KMS 密钥（特别是 [customer managed key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)）的 SSE-KMS 指定为目录存储桶的默认加密配置。然后，当您使用 SSE-KMS 为新的对象副本指定服务器端加密设置时，必须确保加密密钥与您为目录存储桶的默认加密配置指定的客户自主管理型密钥相同。对于 [UploadPartCopy](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html)，要使用 SSE-KMS 加密目录存储桶中新的对象分段副本，必须将具有 KMS 密钥（特别是 [customer managed key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)）的 SSE-KMS 指定为目录存储桶的默认加密配置。无法在 [UploadPartCopy](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html) 请求标头中使用 SSE-KMS 为新的对象分段副本指定服务器端加密设置。此外，您在 [CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html) 请求中提供的加密设置必须与目标存储桶的默认加密配置相匹配。



**Topics**
+ [支持 SSE-KMS 的 Amazon S3 REST API 操作](#s3-express-sse-request-headers-kms)
+ [加密上下文（`x-amz-server-side-encryption-context`）](#s3-express-s3-kms-encryption-context)
+ [AWS KMS 密钥 ID（`x-amz-server-side-encryption-aws-kms-key-id`）](#s3-express-s3-kms-key-id-api)
+ [S3 桶密钥（`x-amz-server-side-encryption-aws-bucket-key-enabled`）](#s3-express-bucket-key-api)

### 支持 SSE-KMS 的 Amazon S3 REST API 操作
<a name="s3-express-sse-request-headers-kms"></a>

目录存储桶中的以下对象级 REST API 操作接受 `x-amz-server-side-encryption`、`x-amz-server-side-encryption-aws-kms-key-id` 和 `x-amz-server-side-encryption-context` 请求标头。
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html)：当您使用可用区端点（对象级）API 操作（CopyObject 和 UploadPartCopy 除外）时，可以指定这些请求标头。
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) – 使用 `PUT` API 操作上传数据时，您可以指定这些请求标头。
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) – 复制对象时，您同时具有源对象和目标对象。如果使用 `CopyObject` 操作传递 SSE-KMS 标头，这些标头仅应用于目标对象。
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html) – 使用分段上传 API 操作上传大型对象时，可以指定这些标头。您可以在 `CreateMultipartUpload` 请求中指定这些标头。

使用服务器端加密存储对象时，以下 REST API 操作的响应标头将返回 `x-amz-server-side-encryption` 标头。
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html)

**重要**  
如果您针对受 AWS KMS 保护的对象发出 `GET` 和 `PUT` 请求时未使用传输层安全性协议（TLS）或签名版本 4，则所有这些请求都将失败。
如果对象使用 SSE-KMS，则不应对 `GET` 请求和 `HEAD` 请求发送加密请求标头，否则将显示 HTTP 400 BadRequest 错误。

### 加密上下文（`x-amz-server-side-encryption-context`）
<a name="s3-express-s3-kms-encryption-context"></a>

如果您指定 `x-amz-server-side-encryption:aws:kms`，Amazon S3 API 将支持您可选提供带有 `x-amz-server-side-encryption-context` 标头的显式加密上下文。对于目录存储桶，加密上下文是一组键值对，其中包含有关数据的上下文信息。该值必须与默认加密上下文 [即存储桶的 Amazon 资源名称（ARN）] 相匹配。不支持额外的加密上下文值。

有关目录存储桶中加密上下文的信息，请参阅[加密上下文](s3-express-UsingKMSEncryption.md#s3-express-encryption-context)。有关加密上下文的一般信息，请参阅 *AWS Key Management Service 开发人员指南*中的 [AWS Key Management Service 概念 - 加密上下文](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)。

### AWS KMS 密钥 ID（`x-amz-server-side-encryption-aws-kms-key-id`）
<a name="s3-express-s3-kms-key-id-api"></a>

您可以使用 `x-amz-server-side-encryption-aws-kms-key-id` 标头指定用于保护数据的客户自主管理型密钥的 ID。

在存储桶的生命周期内，SSE-KMS 配置只能支持每个目录存储桶 1 个 [customer managed key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。[https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) (`aws/s3`) 不受支持。此外，在为 SSE-KMS 指定客户自主管理型密钥后，无法覆盖存储桶的 SSE-KMS 配置的客户自主管理型密钥。

可以通过以下方式，确定您为存储桶的 SSE-KMS 配置指定的客户自主管理型密钥：
+ 您发出 `HeadObject` API 操作请求以查找响应中 `x-amz-server-side-encryption-aws-kms-key-id` 的值。

要对数据使用新的客户自主管理型密钥，我们建议使用新的客户自主管理型密钥将现有对象复制到新的目录存储桶中。

有关目录存储桶中加密上下文的信息，请参阅[AWS KMS keys](s3-express-UsingKMSEncryption.md#s3-express-aws-managed-customer-managed-keys)。

### S3 桶密钥（`x-amz-server-side-encryption-aws-bucket-key-enabled`）
<a name="s3-express-bucket-key-api"></a>

始终为目录存储桶中的 `GET` 和 `PUT` 操作启用 S3 存储桶密钥，并且不能禁用。当您通过 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html)、[https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html)、[批量操作中的 Copy 操作](directory-buckets-objects-Batch-Ops.md)或 [import 任务](create-import-job.md)，将 SSE-KMS 加密的对象从通用存储桶复制到目录存储桶、从目录存储桶复制到通用存储桶，或在目录存储桶之间复制时，不支持 S3 存储桶密钥。在这种情况下，每次对 KMS 加密的对象发出复制请求时，Amazon S3 都会调用 AWS KMS。有关目录存储桶中 S3 存储桶密钥的信息，请参阅[加密上下文](s3-express-UsingKMSEncryption.md#s3-express-encryption-context)。

## 使用 AWS CLI
<a name="s3-express-KMSUsingCLI"></a>

**注意**  
当您使用 AWS CLI 时，对于 `CreateSession`，会话令牌会自动刷新，以避免在会话到期时服务中断。不支持覆盖 `CreateSession` 请求的加密设置值。此外，在可用区端点 API 调用（[CopyObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) 和 [UploadPartCopy](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html) 除外）中，不支持覆盖 `CreateSession` 请求中加密设置的值。  
要使用 SSE-KMS 加密目录存储桶中的新对象，必须将具有 KMS 密钥（特别是客户自主管理型密钥）的 SSE-KMS 指定为目录存储桶的默认加密配置。然后，在为可用区端点 API 操作创建会话时，将在会话期间使用 SSE-KMS 和 S3 存储桶密钥自动加密和解密新对象。

要使用以下示例 AWS CLI 命令，请将 `user input placeholders` 替换为您自己的信息。

当您上传新对象或复制现有对象时，可以指定使用具有 AWS KMS 密钥的服务器端加密来加密数据。为此，请使用 `put-bucket-encryption` 命令将目录存储桶的默认加密配置设置为 SSE-KMS (`aws:kms`)。具体而言，就是将 `--server-side-encryption aws:kms` 标头添加到请求。使用 `--ssekms-key-id example-key-id` 添加您创建的[客户托管式 AWS KMS 密钥](https://docs.aws.amazon.com//kms/latest/developerguide/concepts.html#customer-cmk)。如果您指定 `--server-side-encryption aws:kms`，则必须提供客户自主管理型密钥的 AWS KMS 密钥 ID。目录存储桶不使用 AWS 托管式密钥。有关示例命令，请参阅 [使用 AWS CLI](s3-express-bucket-encryption.md#s3-express-default-bucket-encryption-cli)。

然后，当您使用以下命令上传新对象时，Amazon S3 默认情况下使用存储桶默认加密设置来加密该对象。

```
aws s3api put-object --bucket bucket-base-name--zone-id--x-s3 --key example-object-key --body filepath
```

您不需要在可用区端点 API 操作命令中显式添加 `-\-bucket-key-enabled`。始终为目录存储桶中的 `GET` 和 `PUT` 操作启用 S3 存储桶密钥，并且不能禁用。当您通过 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html)、[https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html)、[批量操作中的 Copy 操作](directory-buckets-objects-Batch-Ops.md)或 [import 任务](create-import-job.md)，将 SSE-KMS 加密的对象从通用存储桶复制到目录存储桶、从目录存储桶复制到通用存储桶，或在目录存储桶之间复制时，不支持 S3 存储桶密钥。在这种情况下，每次对 KMS 加密的对象发出复制请求时，Amazon S3 都会调用 AWS KMS。

可以将对象从源存储桶（例如通用存储桶）复制到新的存储桶（例如目录存储桶），然后对目标对象使用 SSE-KMS 加密。为此，请使用 `put-bucket-encryption` 命令将目标存储桶（例如目录存储桶）的默认加密配置设置为 SSE-KMS (`aws:kms`)。有关示例命令，请参阅 [使用 AWS CLI](s3-express-bucket-encryption.md#s3-express-default-bucket-encryption-cli)。然后，当您使用以下命令复制对象时，Amazon S3 默认情况下使用存储桶默认加密设置来加密该对象。

```
aws s3api copy-object --copy-source amzn-s3-demo-bucket/example-object-key --bucket bucket-base-name--zone-id--x-s3 --key example-object-key  
```

## 使用 AWS SDK
<a name="s3-express-kms-using-sdks"></a>

使用 AWS SDK 时，您可以请求 Amazon S3 使用 AWS KMS keys 进行服务器端加密。以下示例展示了如何将 SSE-KMS 与适用于 Java 和 .NET 的 AWS SDK 结合使用。有关其它 SDK 的信息，请参阅 AWS 开发人员中心上的[示例代码和库](https://aws.amazon.com/code)。

**注意**  
当您使用 AWS SDK 时，对于 `CreateSession`，会话令牌会自动刷新，以避免在会话到期时服务中断。不支持覆盖 `CreateSession` 请求的加密设置值。此外，在可用区端点 API 调用（[CopyObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) 和 [UploadPartCopy](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html) 除外）中，不支持覆盖 `CreateSession` 请求中加密设置的值。  
要使用 SSE-KMS 加密目录存储桶中的新对象，必须将具有 KMS 密钥（特别是客户自主管理型密钥）的 SSE-KMS 指定为目录存储桶的默认加密配置。然后，在为可用区端点 API 操作创建会话时，将在会话期间使用 SSE-KMS 和 S3 存储桶密钥自动加密和解密新对象。  
有关使用 AWS SDK 将目录存储桶的默认加密配置设置为 SSE-KMS 的更多信息，请参阅[使用 AWS SDK](s3-express-bucket-encryption.md#s3-express-kms-put-bucket-encryption-using-sdks)。

**重要**  
在 Amazon S3 中使用 AWS KMS key 进行服务器端加密时，您必须选择对称加密 KMS 密钥。Amazon S3 仅支持对称加密 KMS 密钥。有关这些密钥的更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的[对称加密 KMS 密钥](https://docs.aws.amazon.com//kms/latest/developerguide/concepts.html#symmetric-cmks)。

有关创建客户托管密钥的更多信息，请参阅 *AWS Key Management Service 开发人员指南*中的[对 AWS KMS API 进行编程](https://docs.aws.amazon.com/kms/latest/developerguide/programming-top.html)。