

# 对请求进行身份验证（Amazon 签名版本 4）
<a name="sig-v4-authenticating-requests"></a>

**Topics**
+ [身份验证方法](#auth-methods-intro)
+ [对请求进行签名简介](#signing-request-intro)
+ [对请求进行身份验证：使用 Authorization 标头（Amazon 签名版本 4）](sigv4-auth-using-authorization-header.md)
+ [对请求进行身份验证：使用查询参数（Amazon 签名版本 4）](sigv4-query-string-auth.md)
+ [示例：Amazon 签名版本 4 中的签名计算](sig-v4-examples-using-sdks.md)
+ [对请求进行身份验证：使用 POST 的基于浏览器的上传（Amazon 签名版本 4）](sigv4-authentication-HTTPPOST.md)
+ [特定于 Amazon S3 签名版本 4 身份验证的策略键](bucket-policy-s3-sigv4-conditions.md)

与 Amazon S3 的每一次交互都是经身份验证的或匿名的。本节介绍使用 Amazon 签名版本 4 算法进行请求身份验证。

 

**注意**  
如果您使用 Amazon SDK（请参阅[示例代码和库](https://www.amazonaws.cn/code)）发送请求，则不需要阅读本节，因为 SDK 客户端会使用您提供的访问密钥对请求进行身份验证。您应始终使用 Amazon SDK，除非您有充分的理由不这样做。在支持这两个签名版本的区域中，您可以请求 Amazon SDK 使用特定的签名版本。有关更多信息，请参阅 [使用 Amazon 开发工具包发送经身份验证的请求](AuthUsingAcctOrUserCredentials.md#send-authenticated-request-SDKs)。只有在自定义客户端中实施 Amazon 签名版本 4 算法时，才需要阅读本节。

使用 Amazon 签名版本 4 进行身份验证可提供以下部分或全部功能，具体取决于您选择如何对请求进行签名：

 
+ **验证请求者的身份**：经过身份验证的请求需要您使用访问密钥（访问密钥 ID、秘密访问密钥）创建的签名。有关获取访问密钥的信息，请参阅《Amazon Web Services 一般参考》**中的[了解和获取安全凭证](https://docs.amazonaws.cn/general/latest/gr/aws-sec-cred-types.html)。如果您使用的是临时安全凭证，则签名计算还需要安全令牌。有关更多信息，请参阅《IAM 用户指南》**中的[请求临时安全凭证](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_credentials_temp_request.html)。
+ **传输中数据保护**：为了防止在传输请求的过程中篡改请求，您可以使用一些请求元素来计算请求签名。收到请求后，Amazon S3 会使用相同的请求元素计算签名。如果 Amazon S3 收到的任何请求组件与用于计算签名的组件不匹配，Amazon S3 将拒绝该请求。
+ **防止重复使用请求的已签名部分**：请求的已签名部分（使用 Amazon 签名）在请求中时间戳的 15 分钟内有效。有权访问已签名请求的未经授权方可以在 15 分钟时段内修改请求中未签名的部分，而不会影响请求的有效性。因此，我们建议您通过对请求标头和正文进行签名、向 Amazon S3 发出 HTTPS 请求以及使用 Amazon 策略中的 `s3:x-amz-content-sha256` 条件键（请参阅[特定于 Amazon S3 签名版本 4 身份验证的策略键](bucket-policy-s3-sigv4-conditions.md)），来要求用户对 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 请求进行签名和身份验证](https://docs.amazonaws.cn/AmazonS3/latest/userguide/RESTAuthentication.html)。

## 身份验证方法
<a name="auth-methods-intro"></a>

您可以使用以下方法之一表达身份验证信息：

 
+ **HTTP Authorization 标头**：使用 HTTP `Authorization` 标头是对 Amazon S3 请求进行身份验证的最常用方法。所有 Amazon S3 REST 操作（使用 POST 请求的基于浏览器的上传除外）都需要此标头。有关 `Authorization` 标头值以及如何计算签名和相关选项的更多信息，请参阅[对请求进行身份验证：使用 Authorization 标头（Amazon 签名版本 4）](sigv4-auth-using-authorization-header.md)。
+ **查询字符串参数**：您可以使用查询字符串在 URL 中完整表达请求。在这种情况下，您可以使用查询参数来提供请求信息，包括身份验证信息。由于请求签名是 URL 的一部分，因此这类 URL 通常称为预签名 URL。您可以使用预签名 URL 在 HTML 中嵌入可单击链接，该链接的有效期最长为七天。有关更多信息，请参阅 [对请求进行身份验证：使用查询参数（Amazon 签名版本 4）](sigv4-query-string-auth.md)。

 Amazon S3 还支持使用 HTTP POST 请求的基于浏览器的上传。通过 HTTP POST 请求，您可以直接从浏览器将内容上传到 Amazon S3。有关对 POST 请求进行身份验证的信息，请参阅[使用 POST 的基于浏览器的上传（Amazon 签名版本 4）](sigv4-UsingHTTPPOST.md)。





## 对请求进行签名简介
<a name="signing-request-intro"></a>

您在请求中发送的身份验证信息必须包含签名。要计算签名，首先要将 select 请求元素连接形成一个字符串，称为*待签字符串*。然后，您可以使用签名密钥来计算待签字符串的 HMAC 散列消息认证码。

在 Amazon 签名版本 4 中，秘密访问密钥不用于对请求进行签名。相反，您可以使用秘密访问密钥派生签名密钥。派生的签名密钥特定于日期、服务和区域。有关如何在不同的编程语言中派生签名密钥的更多信息，请参阅[如何为签名版本 4 派生签名密钥的示例](https://docs.amazonaws.cn/general/latest/gr/signature-v4-examples.html)。

下图说明了计算签名的一般过程。

![三步流程，显示了使用 HMAC-SHA256 创建 StringToSign、派生签名密钥和计算签名。](http://docs.amazonaws.cn/AmazonS3/latest/developerguide/images/signing-overview.png)


待签字符串取决于请求类型。例如，使用 HTTP 授权标头或查询参数进行身份验证时，可以使用不同的请求元素组合来创建待签字符串。对于 HTTP POST 请求，请求中的 POST 策略是您签名的字符串。有关计算待签字符串的更多信息，请访问本节末尾提供的链接。

对于签名密钥，此图显示了一系列计算，计算过程中每个步骤的结果都会输入到下一步。最后一步是签名密钥。

收到经身份验证的请求后，Amazon S3 服务器使用请求中包含的身份验证信息来重新创建签名。如果签名相匹配，Amazon S3 会处理您的请求；否则将拒绝请求。

有关对请求进行身份验证的更多信息，请参阅以下主题：
+ [对请求进行身份验证：使用 Authorization 标头（Amazon 签名版本 4）](sigv4-auth-using-authorization-header.md)
+ [对请求进行身份验证：使用查询参数（Amazon 签名版本 4）](sigv4-query-string-auth.md)
+ [使用 POST 的基于浏览器的上传（Amazon 签名版本 4）](sigv4-UsingHTTPPOST.md)