AWS 一般参考
参考指南 (版本 1.0)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

利用签名版本 4 对 AWS 请求进行签名

本节介绍如何创建签名并将其添加到针对 AWS 的 HTTP 请求中。


        签名版本 4 流程

签名步骤的摘要

要创建已签名的请求,请完成以下操作:

注意

AWS 开发工具包可以为您处理签名计算过程,因此您无需手动完成签名过程。有关更多信息,请参阅适用于 Amazon Web Services 的工具

其他签名资源

以下附加资源说明了签名过程的各个方面:

  • 说明如何为 Signature 版本 4 派生签名密钥的示例。此页演示如何使用 Java、C#、Python、Ruby 和 JavaScript 派生签名密钥。

  • 完整版本 4 签名过程的示例 (Python)。这组用 Python 编写的程序提供了完整的签名过程示例。这些示例演示了如何利用 POST 请求、利用在请求标头中具有签名信息的 GET 请求以及利用在查询字符串中具有签名信息的 GET 请求进行签名。

  • Signature Version 4测试套件。此可下载的程序包中有一组示例,其中包括签名过程中各步骤的签名信息。您可以使用这些示例来验证您的签名代码在这个过程的每一个步骤中是否生成正确的结果。

请求中的签署过程是什么样

以下示例演示了 HTTPS 请求(不带任何签名信息)从您的客户端发送到 AWS 时可能的样子。

GET https://iam.cn-north-1.amazonaws.com.cn.cn/?Action=ListUsers&Version=2010-05-08 HTTP/1.1 Content-Type: application/x-www-form-urlencoded; charset=utf-8 Host: iam.cn-north-1.amazonaws.com.cn.cn X-Amz-Date: 20150830T123600Z

在完成签名任务之后,请将身份验证信息添加到请求中。您可通过两种方式添加身份验证信息:

Authorization 标头

您可使用 Authorization 标头将身份验证信息添加到请求中。尽管该 HTTP 标头名为 Authorization,但签名信息实际上是用于身份验证的,目的是确定请求方。

Authorization 标头包含以下信息:

  • 用于签名的算法 (AWS4-HMAC-SHA256)

  • 凭证范围(包含您的访问密钥 ID)

  • 已签名标头的列表

  • 计算签名。该签名基于您的请求信息,由您使用 AWS 秘密访问密钥生成。该签名用于向 AWS 确认您的身份。

下面的示例说明在您创建签名信息并将它添加到请求的 Authorization 标头之后,前面的请求看起来是什么样。

POST https://iam.cn-north-1.amazonaws.com.cn.cn/?Action=ListUsers&Version=2010-05-08 HTTP/1.1 Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/cn-north-1/iam/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=d37af66cc90dc26bb2e27d2a97316b729b82589b5e4648f1ae34cb83a3f546cd content-type: application/x-www-form-urlencoded; charset=utf-8 host: iam.cn-north-1.amazonaws.com.cn.cn x-amz-date: 20150830T123600Z

查询字符串

作为一种将身份验证信息添加到 HTTP 请求标头中的替代方法,您可以将它包含在查询字符串中。查询字符串包含请求的所有部分,包括操作的名称和参数、日期以及身份验证信息。

以下示例为您演示如何通过查询字符串中的操作和身份验证信息来构造 GET 请求。

GET https://iam.cn-north-1.amazonaws.com.cn?Action=ListUsers&Version=2010-05-08&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fcn-north-1%2Fiam%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=60&X-Amz-SignedHeaders=content-type%3Bhost&X-Amz-Signature=bbb7890b2172f0cccc6d1d5cded4e690f3e1dac299599547f3d1ceb50567e83d HTTP/1.1 content-type: application/x-www-form-urlencoded; charset=utf-8 host: iam.cn-north-1.amazonaws.com.cn.cn

查询 API 中的 GET 和 POST 请求

许多 AWS 服务支持的查询 API 可用来通过 HTTP GETPOST 发送请求。(在查询 API 中,即使您提交更改状态的请求,即查询 API 本身并非 RESTful,您也可以使用 GET。) 因为 GET 请求通过查询字符串传递参数,所以它们的长度限制为 URL 的最大长度。如果请求包含大型负载(例如,您可能以 JSON 格式为 DynamoDB 请求上传大型 IAM 策略或发送大量参数),则通常使用 POST 请求。

两种类型的请求的签名过程相同。