使用 REST API 在 Amazon S3 中指定 AWS Key Management Service - Amazon Simple Storage Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本指南不再进行更新。有关当前信息和说明,请参阅新的 Amazon S3 用户指南

使用 REST API 在 Amazon S3 中指定 AWS Key Management Service

创建对象时(即上传新对象或复制现有对象时),您可以指定通过使用 AWS Key Management Service (AWS KMS) 客户主密钥 (CMK) 的服务器端加密来加密数据。为此,请将 x-amz-server-side-encryption 标头添加到请求。将标头的值设置为加密算法 aws:kms。Amazon S3 通过返回响应标头 x-amz-server-side-encryption 来确认已使用 SSE-KMS 存储您的对象。

如果您指定值为 aws:kmsx-amz-server-side-encryption 标头,则还可以使用以下请求标头:

  • x-amz-server-side-encryption-aws-kms-key-id

  • x-amz-server-side-encryption-context

支持 SSE-KMS 的 Amazon S3 REST API

以下 REST API 接受 x-amz-server-side-encryptionx-amz-server-side-encryption-aws-kms-key-idx-amz-server-side-encryption-context 请求标头。

  • PUT 对象 — 使用 PUT API 上传数据时,您可以指定这些请求标头。

  • PUT 对象 - 复制 — 在复制对象时,您同时具有源对象和目标对象。如果使用 COPY 操作传递 SSE-KMS 标头,它们仅应用于目标对象。复制现有的对象时,不论源对象是否已经加密,都不会加密目标对象,除非您显式请求了服务器端加密。

  • POST 对象 — 使用 POST 操作上传对象时,可在表单字段(而不是在请求标头)中提供相同的信息。

  • 开始分段上传 — 使用分段上传 API 上传大型对象时,可以指定这些标头。您可以在启动请求中指定这些标头。

使用服务器端加密存储对象后,以下 REST API 的响应标头将返回 x-amz-server-side-encryption 标头。

重要
  • 如果您不让针对受 AWS KMS 保护的对象的所有 GET 和 PUT 请求使用安全套接字语言 (SSL) 或 Signature Version 4,所有这些请求都将失败。

  • 如果对象使用 SSE-KMS,则不应对 GET 请求和 HEAD 请求发送加密请求标头,否则将显示 HTTP 400 BadRequest 错误。

加密上下文 (x-amz-server-side-encryption-context)

如果您指定 x-amz-server-side-encryption:aws:kms,Amazon S3 API 将支持带有 x-amz-server-side-encryption-context 标头的加密上下文。加密上下文是一组可选的键值对,可以包含有关数据的其他上下文信息。有关加密上下文的更多信息,请参阅《AWS Key Management Service 开发人员指南》中的 AWS Key Management Service 概念 - 加密上下文

加密上下文可以是您希望的任何值,前提是该标头遵循 Base64 编码的 JSON 格式。但是,由于加密上下文不会加密并且在 AWS CloudTrail 记录打开时会被记录,因此加密上下文不应包含敏感信息。我们进一步建议您的上下文描述正在加密或解密的数据,以便让您可以更好地了解 AWS KMS 生成的 CloudTrail 事件。

此外,Amazon S3 还可能为您提供的加密上下文追加一个预定义密钥 aws:s3:arn,其值等于对象的 Amazon 资源名称 (ARN)。仅当密钥 aws:s3:arn 尚未在您提供的加密上下文中时,才会发生这种情况。在这种情况下,在 Amazon S3 处理您的 PUT 请求时,会追加此预定义密钥。如果此 aws:s3:arn 密钥已存在于您的加密上下文中,则不会再次将它追加到您的加密上下文。

将此预定义密钥作为加密上下文的一部分意味着您可以在 CloudTrail 中跟踪相关请求。因此,您始终可以查看哪个 Amazon S3 对象的 ARN 与哪个加密密钥一起使用。此外,作为您的加密上下文的一部分的此预定义密钥可帮助确保不同的 Amazon S3 对象之间拥有不同的加密上下文,从而为您的对象提供更高的安全性。系统将验证您的完全加密上下文是否有等于对象的 ARN 的值。

AWS KMS 密钥 ID (x-amz-server-side-encryption-aws-kms-key-id)

您可以使用 x-amz-server-side-encryption-aws-kms-key-id 标头指定用于保护数据的客户托管 CMK 的 ID。如果您指定 x-amz-server-side-encryption:aws:kms,但未提供 x-amz-server-side-encryption-aws-kms-key-id,Amazon S3 将使用 AWS KMS 中的 AWS 托管 CMK 来保护数据。如果要使用客户托管 AWS KMS CMK,则必须提供客户托管 CMK 的 x-amz-server-side-encryption-aws-kms-key-id

重要

当您在 Amazon S3 中使用 AWS KMS CMK 进行服务器端加密时,您必须选择对称 CMK。Amazon S3 仅支持对称 CMK,不支持非对称 CMK。有关更多信息,请参阅《AWS Key Management Service 开发人员指南》中的使用对称和非对称密钥