对请求进行身份验证(Amazon 签名版本 4)
主题
与 Amazon S3 的每一次交互都是经身份验证的或匿名的。本节介绍使用 Amazon 签名版本 4 算法进行请求身份验证。
注意
如果您使用 Amazon SDK(请参阅示例代码和库
使用 Amazon 签名版本 4 进行身份验证可提供以下部分或全部功能,具体取决于您选择如何对请求进行签名:
-
验证请求者的身份:经过身份验证的请求需要您使用访问密钥(访问密钥 ID、秘密访问密钥)创建的签名。有关获取访问密钥的信息,请参阅《Amazon Web Services 一般参考》中的了解和获取安全凭证。如果您使用的是临时安全凭证,则签名计算还需要安全令牌。有关更多信息,请参阅《IAM 用户指南》中的请求临时安全凭证。
-
传输中数据保护:为了防止在传输请求的过程中篡改请求,您可以使用一些请求元素来计算请求签名。收到请求后,Amazon S3 会使用相同的请求元素计算签名。如果 Amazon S3 收到的任何请求组件与用于计算签名的组件不匹配,Amazon S3 将拒绝该请求。
-
防止重复使用请求的已签名部分:请求的已签名部分(使用 Amazon 签名)在请求中时间戳的 15 分钟内有效。有权访问已签名请求的未经授权方可以在 15 分钟时段内修改请求中未签名的部分,而不会影响请求的有效性。因此,我们建议您通过对请求标头和正文进行签名、向 Amazon S3 发出 HTTPS 请求以及使用 Amazon 策略中的
s3:x-amz-content-sha256条件键(请参阅特定于 Amazon S3 签名版本 4 身份验证的策略键),来要求用户对 Amazon S3 请求正文进行签名,从而最大限度地提供保护。
注意
Amazon S3 在所有 Amazon Web Services 区域中都支持签名版本 4,这是一种用于对 Amazon 服务的入站 API 请求进行身份验证的协议。目前,于 2014 年 1 月 30 日前创建的 Amazon Web Services 区域 将继续支持之前的协议:Signature Version 2。在 2014 年 1 月 30 日后创建的所有新区域将只支持签名版本 4,因此,发往这些区域的所有请求都必须采用签名版本 4。有关 Amazon 签名版本 2 的更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的对 REST 请求进行签名和身份验证。
身份验证方法
您可以使用以下方法之一表达身份验证信息:
-
HTTP Authorization 标头:使用 HTTP
Authorization标头是对 Amazon S3 请求进行身份验证的最常用方法。所有 Amazon S3 REST 操作(使用 POST 请求的基于浏览器的上传除外)都需要此标头。有关Authorization标头值以及如何计算签名和相关选项的更多信息,请参阅对请求进行身份验证:使用 Authorization 标头(Amazon 签名版本 4)。 -
查询字符串参数:您可以使用查询字符串在 URL 中完整表达请求。在这种情况下,您可以使用查询参数来提供请求信息,包括身份验证信息。由于请求签名是 URL 的一部分,因此这类 URL 通常称为预签名 URL。您可以使用预签名 URL 在 HTML 中嵌入可单击链接,该链接的有效期最长为七天。有关更多信息,请参阅 对请求进行身份验证:使用查询参数(Amazon 签名版本 4)。
Amazon S3 还支持使用 HTTP POST 请求的基于浏览器的上传。通过 HTTP POST 请求,您可以直接从浏览器将内容上传到 Amazon S3。有关对 POST 请求进行身份验证的信息,请参阅使用 POST 的基于浏览器的上传(Amazon 签名版本 4)。
对请求进行签名简介
您在请求中发送的身份验证信息必须包含签名。要计算签名,首先要将 select 请求元素连接形成一个字符串,称为待签字符串。然后,您可以使用签名密钥来计算待签字符串的 HMAC 散列消息认证码。
在 Amazon 签名版本 4 中,秘密访问密钥不用于对请求进行签名。相反,您可以使用秘密访问密钥派生签名密钥。派生的签名密钥特定于日期、服务和区域。有关如何在不同的编程语言中派生签名密钥的更多信息,请参阅如何为签名版本 4 派生签名密钥的示例。
下图说明了计算签名的一般过程。
待签字符串取决于请求类型。例如,使用 HTTP 授权标头或查询参数进行身份验证时,可以使用不同的请求元素组合来创建待签字符串。对于 HTTP POST 请求,请求中的 POST 策略是您签名的字符串。有关计算待签字符串的更多信息,请访问本节末尾提供的链接。
对于签名密钥,此图显示了一系列计算,计算过程中每个步骤的结果都会输入到下一步。最后一步是签名密钥。
收到经身份验证的请求后,Amazon S3 服务器使用请求中包含的身份验证信息来重新创建签名。如果签名相匹配,Amazon S3 会处理您的请求;否则将拒绝请求。
有关对请求进行身份验证的更多信息,请参阅以下主题: