

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 对 Amazon SQS 请求进行身份验证
<a name="sqs-api-request-authentication"></a>

身份验证是用于识别和验证发送请求的当事方的过程。在身份验证的第一个阶段， AWS 将验证创建者的身份以及创建者是否[已注册使用 AWS](https://aws.amazon.com/)（有关更多信息，请参阅[设置 Amazon SQS](sqs-setting-up.md)）。接下来， AWS 遵守以下程序：

1. 创建者（发件人）获取必要的凭证。

1. 创建者向使用者（接收方）发送请求和凭证。

1. 使用者使用证书来验证创建者是否发送了该请求。

1. 将出现以下情况之一：
   + 如果身份验证成功，使用者将处理该请求。
   + 如果身份验证失败，使用者将拒绝请求并返回错误。

## 基本身份验证流程 HMAC-SHA
<a name="sqs-api-basic-authentication-process"></a>

使用查询 API 访问 Amazon SQS 时，必须提供以下项来对请求进行身份验证：
+ 用于识别您的**AWS 访问密钥 ID ** AWS 账户， AWS 用于查找您的私有访问密钥。
+ **HMAC-SHA 请求签名**使用您的私有访问密钥（只有您知道的共享密钥，以及 AWS—有关更多信息，请参阅 [ RFC2104](http://www.faqs.org/rfcs/rfc2104.html)）计算得出。[AWS 开发工具包](https://aws.amazon.com/code/)可处理签名过程；但是，如果您通过 HTTP 或 HTTPS 提交查询请求，则必须在每个查询请求中包含一个签名。

  1. 派生签名版本 4 签名密钥。有关更多信息，请参阅[使用 Java 派生签名密钥](https://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html#signature-v4-examples-java)。
**注意**  
Amazon SQS 支持签名版本 4，与之前的版本相比，该版本提供了更高的SHA256-based 安全性和性能。创建使用 Amazon SQS 的新应用程序时，应使用 Signature Version 4。

  1. Base64-encode 请求签名。下面的示例 Java 代码将执行此操作：

     ```
     package amazon.webservices.common;
     
     // Define common routines for encoding data in AWS requests.
     public class Encoding {
     
         /* Perform base64 encoding of input bytes.
          * rawData is the array of bytes to be encoded.
          * return is the base64-encoded string representation of rawData.
          */
         public static String EncodeBase64(byte[] rawData) {
             return Base64.encodeBytes(rawData);
         }
     }
     ```
+ 请求的 **时间戳（或到期时间）**。在请求中使用的时间戳必须是 `dateTime` 对象，并包含[完整的日期以及小时、分钟和秒](http://www.w3.org/TR/xmlschema-2/#dateTime)。例如 `2007-01-31T23:59:59Z`。尽管没有强制要求，但还是建议您使用协调世界时（格林威治标准时间）时区提供该对象。
**注意**  
确保您的服务器时间设置正确。如果您指定时间戳（而不是过期时间），则请求将在指定时间后 15 分钟自动过期（AWS 不处理时间戳比 AWS 服务器当前时间早 15 分钟以上的请求）。  
如果使用 .NET，则不得发送过于具体的时间戳（因为对如何降低额外时间精度的解释不同）。在这种情况下，应手动构造精度不超过 1 毫秒的 `dateTime` 对象。

## 第 1 部分：来自用户的请求
<a name="sqs-authentication-user"></a>

以下是使用请求签名对 AWS 请求进行身份验证时必须遵循的HMAC-SHA 流程。

![描述用户请求的图表。](https://docs.aws.amazon.com/zh_cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/images/sqs-basic-authentication-process-hmac-user.png)


1. 构造对的请求 AWS。

1. 使用您的私有访问密钥计算密钥哈希消息身份验证码 (HMAC-SHA) 签名。

1. 在请求中包括签名和您的访问密钥 ID，然后将请求发送至 AWS。

## 第 2 部分：来自的回应 AWS
<a name="sqs-authentication-aws"></a>

AWS 作为响应，开始以下过程。

![描述来自 AWS的响应的图表。](https://docs.aws.amazon.com/zh_cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/images/sqs-basic-authentication-process-hmac-aws.png)


1. AWS 使用访问密钥 ID 来查找您的私有访问密钥。

1. AWS 使用与计算请求中发送的签名相同的算法，根据请求数据和私有访问密钥生成签名。

1. 将出现以下情况之一：
   + 如果 AWS 生成的签名与您在请求中发送的签名相匹配，则 AWS 认为该请求是真实的。
   + 如果比较失败，则请求将被丢弃，并 AWS 返回错误。