View a markdown version of this page

对请求进行身份验证:使用 Authorization 标头(Amazon 签名版本 4) - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

对请求进行身份验证:使用 Authorization 标头(Amazon 签名版本 4)

概述

使用 HTTP Authorization 标头是提供身份验证信息的最常用方法。除了 POST 请求和使用查询参数签名的请求外,所有 Amazon S3 操作都使用 Authorization 请求标头来提供身份验证信息。

以下是 Authorization 标头值的示例:为便于阅读,此示例中添加了换行符:

Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, SignedHeaders=host;range;x-amz-date, Signature=fe5f80f77d5fa3beca038a248ff027d0445342fe2855ddc963176630326f1024

下表介绍了上述示例中 Authorization 标头值的各个组成部分:

组件 说明
AWS4-HMAC-SHA256

用于计算签名的算法。使用 Amazon 签名版本 4 进行身份验证时必须提供此值。

该字符串指定 Amazon 签名版本 4 (AWS4) 和签名算法 (HMAC-SHA256)。

Credential

您的访问密钥 ID 和范围信息,包括用于计算签名的日期、区域和服务。

该字符串具有以下形式:

<your-access-key-id>/<date>/<aws-region>/<aws-service>/aws4_request

其中:

  • <date> 值使用 YYYYMMDD 格式指定。

  • 向 Amazon S3 发送请求时,<aws-service> 值为 s3

SignedHeaders

用于计算 Signature 的请求标头的分号分隔列表。该列表仅包含标头名称,并且标头名称必须为小写。例如:

host;range;x-amz-date
Signature 256 位签名以 64 个小写十六进制字符表示。例如:
fe5f80f77d5fa3beca038a248ff027d0445342fe2855ddc963176630326f1024
请注意,签名计算因所选择的传输有效负载的选项而异。

签名计算因您选择用于传输请求有效载荷的方法而异。S3 支持以下选项:

  • 在单个分块中传输有效载荷:在这种情况下,您可以使用以下签名计算选项:

    • 签名的有效载荷选项:您可以选择计算整个有效载荷校验和并将其包含在签名计算中。这增加了安全性,但您需要读取两次有效载荷或将其缓冲到内存中。

      例如,为了上传文件,您需要先读取文件以计算签名计算的有效载荷哈希值,然后在创建请求时再次读取文件以进行传输。对于较小的有效载荷,这种方法可能更可取。但是,对于大型文件,读取文件两次可能效率低下,因此您可能需要改为分块上传数据。

      为了提高安全性,我们建议您包含有效载荷校验和。

    • 未签名的有效载荷选项:不在签名计算中包含有效载荷校验和。

    有关计算签名和构造 Authorization 标头值的分步说明,请参阅 Authorization 标头的签名计算:在单个分块中传输有效载荷(Amazon 签名版本 4)

  • 在多个分块中传输有效载荷(分块上传):在这种情况下,您可以分块传输有效载荷。无论有效载荷大小如何,您都可以分块传输有效载荷。

    您可以将有效载荷分成多个分块。这些分块可以是固定大小,也可以是可变大小。通过分块上传数据,可以避免读取整个有效载荷来计算签名。相反,对于第一个分块,您可以计算仅使用请求标头的种子签名。第二个分块包含第一个分块的签名,随后的每个分块都包含其前一个分块的签名。在上传结束时,您将发送一个包含 0 字节数据的最后一个分块,其中包含有效载荷的最后一个分块的签名。有关更多信息,请参阅 Authorization 标头的签名计算:在多个分块中传输有效载荷(分块上传)(Amazon 签名版本 4)

签署请求时,您可以使用 Amazon 签名版本 4 或 Amazon 签名版本 4A。两者之间的关键区别取决于签名的计算方式。对于 Amazon 签名版本 4A,签名不包含区域特定的信息,并且使用 AWS4-ECDSA-P256-SHA256 算法计算得出。

除了这些选项外,您还可以选择在请求中加入尾部。为了在请求中包含尾部,您需要通过将 x-amz-content-sha256 设置为适当的值来在标头中指定该尾部。如果您使用的是尾随标头,则必须在标头中包含 x-amz-trailer,并将尾随标头名称指定为逗号分隔列表中的字符串。所有尾随标头都在最后一个分块之后写入。如果您要将数据分成多个分块进行上传,则在发送尾随标头之前,必须发送包含 0 字节数据的最后一个分块。

发送请求时,您必须通过添加带有以下值之一的 x-amz-content-sha256 标头,来告诉 Amazon S3 您在签名计算中选择了上述哪个选项:

标头值 说明

实际有效载荷校验和值

此值是对象的实际校验和,仅当您在单个分块中上传数据时才适用。

UNSIGNED-PAYLOAD

当您将对象作为单个未签名的分块上传时,使用此值。

STREAMING-UNSIGNED-PAYLOAD-TRAILER

在通过多个分块发送未签名的有效载荷时,使用此值。在这种情况下,在上传分块后,您还有一个尾随标头。

STREAMING-AWS4-HMAC-SHA256-PAYLOAD

在通过多个分块发送有效载荷并使用 AWS4-HMAC-SHA256 对分块进行签名时,使用此值。这会生成一个 SigV4 签名。

STREAMING-AWS4-HMAC-SHA256-PAYLOAD-TRAILER

在通过多个分块发送有效载荷并使用 AWS4-HMAC-SHA256 对分块进行签名时,使用此值。这会生成一个 SigV4 签名。此外,分块的摘要作为尾随标头包含在内。

STREAMING-AWS4-ECDSA-P256-SHA256-PAYLOAD

在通过多个分块发送有效载荷并使用 AWS4-ECDSA-P256-SHA256 对分块进行签名时,使用此值。这会生成一个 SigV4A 签名。

STREAMING-AWS4-ECDSA-P256-SHA256-PAYLOAD-TRAILER

在通过多个分块发送有效载荷并使用 AWS4-ECDSA-P256-SHA256 对分块进行签名时,使用此值。这会生成一个 SigV4A 签名。此外,分块的摘要作为尾随标头包含在内。

收到请求后,Amazon S3 使用 Authorization 标头和 date 标头中的信息重新创建待签字符串。然后,它使用身份验证服务来验证签名是否匹配。可以使用 HTTP Datex-amz-date 标头来指定请求日期。如果两个标头都存在,则 x-amz-date 优先。

如果签名匹配,Amazon S3 会处理您的请求;否则,您的请求将失败。

有关更多信息,请参阅以下主题:

Authorization 标头的签名计算:在单个分块中传输有效载荷(Amazon 签名版本 4)

Authorization 标头的签名计算:在多个分块中传输有效载荷(分块上传)(Amazon 签名版本 4)

尾随标头的签名计算(分块上传)(Amazon 签名版本 4)