

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

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

身份验证是用于识别和验证发送请求的当事方的过程。在身份验证的第一个阶段， Amazon 将验证创建者的身份以及创建者是否[已注册使用 Amazon](https://www.amazonaws.cn/)（有关更多信息，请参阅[步骤 1：创建一个 Amazon Web Services 账户 和 IAM 用户](sqs-setting-up.md#sqs-creating-aws-account)）。接下来，请 Amazon 遵守以下程序：

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

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

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

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

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

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

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

  1. 对请求签名必须采用 Base64 编码。下面的示例 Java 代码将执行此操作：

     ```
     package amazon.webservices.common;
     
     // Define common routines for encoding data in Amazon 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 分钟自动过期（ Amazon 服务器上Amazon 不会处理时间戳比当前时间早于 15 分钟的请求）。  
如果使用 .NET，则不得发送过于具体的时间戳（因为对如何降低额外时间精度的解释不同）。在这种情况下，应手动构造精度不超过 1 毫秒的 `dateTime` 对象。

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

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

![描述用户请求的图表。](http://docs.amazonaws.cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/images/sqs-basic-authentication-process-hmac-user.png)


1. 构造对的请求 Amazon。

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

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

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

Amazon 开始以下过程作为响应。

![描述来自 Amazon的响应的图表。](http://docs.amazonaws.cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/images/sqs-basic-authentication-process-hmac-aws.png)


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

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

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