指定使用客户提供的密钥的服务器端加密 (SSE-C)。
要使用具有客户提供密钥的服务器端加密(SSE-C),请先确保在您的 Amazon S3 通用存储桶默认加密配置中,没有阻止 SSE-C 加密类型。如果此加密类型被阻止,您可以通过更新存储桶的默认加密配置来启用它。然后,您可以通过在上传请求中传递所需的标头来使用 SSE-C。请参阅支持使用 SSE-C 写入数据的 Amazon S3 操作,并确保包含 SSE-C 对象加密和解密请求所需的 S3 API 标头。
如果您在上传对象时指定了 SSE-C,Amazon S3 将使用您提供的加密密钥对数据应用 AES-256 加密。然后,Amazon S3 从内存中删除此加密密钥。在检索对象时,必须提供相同的加密密钥作为您请求的一部分。Amazon S3 在将对象数据返回给您之前,会首先验证您提供的加密密钥是否匹配,然后再解密对象。
使用 SSE-C 之前,请确保您已查看使用 SSE-C 之前的注意事项。
注意
Amazon S3 不存储您提供的加密密钥,而是存储加密密钥的添加了随机数据的 HMAC 散列消息认证码(HMAC)值,以验证将来的请求。无法使用添加了随机数据的 HMAC 值来推导出加密密钥的值或解密加密对象的内容。这意味着,如果您丢失加密密钥,则会失去该对象。
主题
SSE-C 操作和必需表头
在支持的 S3 API 上指定 SSE-C 需要传递特定请求参数。
注意
Amazon S3 中的 PutBucketEncryption API 用于为存储桶配置默认的服务器端加密。但是,PutBucketEncryption 不支持启用 SSE-C 作为存储桶的默认加密方法。SSE-C 是对象级加密方法,您可以随对象上传或下载的每个请求向 Amazon S3 提供加密密钥。Amazon S3 在请求处理期间使用此密钥加密或解密对象,然后丢弃密钥。这意味着 SSE-C 是按对象启用的,而不是作为默认的存储桶设置。
支持使用 SSE-C 写入数据的 Amazon S3 操作
您可以使用以下 API 操作,在向通用存储桶写入对象时,请求使用具有客户提供密钥的服务器端加密(SSE-C):
注意
S3 复制支持使用 SSE-C 加密的对象。有关复制加密对象的更多信息,请参阅复制加密对象(SSE-S3、SSE-KMS、DSSE-KMS、SSE-C)。
SSE-C 对象加密和解密请求所需的 S3 API 标头
要使用 SSE-C 加密或解密对象,您必须提供以下三个 API 标头:
x-amz-server-side-encryption-customer-algorithm:使用此标头来指定加密算法。标头值必须为 AES256。x-amz-server-side-encryption-customer-key:使用此标头来提供 256 位的 base64 编码的加密密钥,供 Amazon S3 用于加密或解密您的数据。x-amz-server-side-encryption-customer-key-MD5:使用此标头来根据 RFC 1321,提供加密密钥的 base64 编码的 128 位 MD5 摘要。Amazon S3 使用此标头进行消息完整性检查以确保加密密钥的传输无误。
请求复制使用 SSE-C 加密的源对象时需要的 S3 API 标头
要复制使用 SSE-C 加密的源对象,您必须提供以下三个 API 标头:
x-amz-copy-source-server-side-encryption-customer-algorithm:包括此标头以指定 Amazon S3 用于解密源对象的算法。此值必须为 AES256。x-amz-copy-source-server-side-encryption-customer-key:包括此标头以提供 base64 编码的加密密钥,供 Amazon S3 用于解密源对象。此加密密钥必须是您在创建源对象时为 Amazon S3 提供的加密密钥。否则,Amazon S3 无法解密对象。x-amz-copy-source-server-side-encryption-customer-key-MD5:包括此标头来根据 RFC 1321,提供加密密钥的 base64 编码的 128 位 MD5 摘要。
强制 SSE-C 加密的存储桶策略示例
如果要对写入 Amazon S3 存储桶中的所有对象要求使用 SSE-C 加密,您可以使用存储桶策略。例如,如果请求不包括用于请求 SSE-C 的 x-amz-server-side-encryption-customer-algorithm 标头,以下存储桶策略将拒绝针对所有此类请求的上传对象(s3:PutObject)权限。
{ "Version":"2012-10-17", "Id": "PutObjectPolicy", "Statement": [ { "Sid": "RequireSSECObjectUploads", "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*", "Condition": { "Null": { "s3:x-amz-server-side-encryption-customer-algorithm": "true" } } } ] }
重要
如果您使用存储桶策略在 s3:PutObject 上请求 SSE-C,则必须在所有分段上传请求中(CreateMultipartUpload、UploadPart 和 CompleteMultipartUpload)包括 x-amz-server-side-encryption-customer-algorithm 标头。
预签名 URL 和 SSE-C
您可以生成可用于上传新对象、检索现有对象或检索对象元数据等操作的预签名 URL。预签名 URL 支持 SSE-C,如下所示:
-
在创建预签名 URL 时,您必须在签名计算中使用
x-amz-server-side-encryption-customer-algorithm标头指定算法。 -
在使用预签名 URL 上传新对象、检索现有对象或仅检索对象元数据时,您必须在您的客户端应用程序的请求中提供所有加密标头。
注意
对于非 SSE-C 对象,您可以生成预签名 URL,并将该 URL 直接复制到浏览器中以访问数据。
但是,不能对 SSE-C 对象执行此操作,因为除了预签名 URL 外,还必须包含 SSE-C 对象特定的 HTTP 标头。因此,您只能以编程方式将预签名 URL 用于 SSE-C 对象。
有关预签名 URL 的更多信息,请参阅 使用预签名 URL 下载和上传对象。
使用 SSE-C 发出请求
在使用 REST API 创建对象时,您可以使用客户提供的密钥(SSE-C)指定服务器端加密。使用 SSE-C 时,必须使用请求复制使用 SSE-C 加密的源对象时需要的 S3 API 标头提供加密密钥信息。您可以使用 AWS SDK 包装库将这些标头添加到您的请求中。如果需要,您可以直接在应用程序中调用 Amazon S3 REST API。
重要
在指定具有客户提供密钥的服务器端加密(SSE-C)之前,请确保通用存储桶未阻止 SSE-C 加密。有关更多信息,请参阅 对通用存储桶阻止或取消阻止 SSE-C。
注意
您不能使用 Amazon S3 控制台上传对象并请求 SSE-C,也不能使用控制台来更新使用 SSE-C 存储的现有对象(例如,更改存储类别或添加元数据)。有关更多信息,请参阅SSE-C 对象加密和解密请求所需的 S3 API 标头。
使用 REST API
支持 SSE-C 的 Amazon S3 REST API
以下 Amazon S3 API 支持使用客户提供的加密密钥进行服务器端加密 (SSE-C)。
-
GET 操作 – 在使用 GET API 检索对象(请参阅 GET Object)时,您可以指定请求标头。
-
HEAD 操作 – 要使用 HEAD API 检索对象元数据(请参阅 HEAD Object),可以指定这些请求标头。
-
PUT 操作 – 使用 PUT Object API 上传数据(请参阅 PUT Object)时,可以指定这些请求标头。
-
分段上传 – 在使用分段上传 API 上传大对象时,可以指定这些标头。您可以在以下请求中指定这些标头:启动请求(请参阅启动分段上传),以及每个后续分段上传请求(请参阅上传分段或 UploadPartCopy)。对于每个分段上传请求,加密信息必须与您在启动分段上传请求中提供的信息相同。
-
POST 操作 – 使用 POST 操作上传对象(请参阅 POST 对象)时,可在表单字段而不是请求标头中提供相同的信息。
-
复制操作:复制对象(请参阅 CopyObject)时,您同时具有源对象和目标对象:
-
如果要指定目标对象的加密类型,您必须提供
x-amz-server-side-encryption请求标头。 -
如果您希望使用 SSE-C 加密目标对象,则必须使用SSE-C 对象加密和解密请求所需的 S3 API 标头提供加密信息。
-
如果源对象使用 SSE-C 加密,则您必须使用请求复制使用 SSE-C 加密的源对象时需要的 S3 API 标头提供加密密钥信息。
-
使用 AWS SDK 为 PUT、GET、Head 和 Copy 操作指定 SSE-C
以下示例演示如何为对象请求使用客户提供的密钥的服务器端加密 (SSE-C)。这些示例执行以下操作。每个操作均演示了如何在请求中指定 SSE-C 相关标头:
-
放置对象 – 上传对象,并请求使用客户提供的加密密钥的服务器端加密。
-
获取对象 – 下载上一步中上传的对象。在请求中,应提供上传对象时提供的同一加密信息。Amazon S3 需要此信息来解密对象,以便将对象返回给您。
-
获取对象元数据 – 检索对象的元数据。提供创建对象时使用的同一加密信息。
-
复制对象 – 复制之前上传的对象的副本。因为源对象是使用 SSE-C 存储的,因此必须在复制请求中提供其加密信息。默认情况下,仅当您显式请求加密时,Amazon S3 才会为对象的副本加密。此示例指示 Amazon S3 存储对象的加密副本。
使用 AWS SDK 为分段上传指定 SSE-C
上一部分中的示例显示了如何在 PUT、GET、Head 和 Copy 操作中请求使用客户提供的密钥的服务器端加密 (SSE-C)。本节介绍支持 SSE-C 的其他 Amazon S3 API。