本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Signature Version 4 签署 AWS 请求
本节介绍如何创建签名并将其添加到针对 AWS 的 HTTP 请求中。
签名步骤摘要
要创建已签名的请求,请完成以下操作:
将请求的内容(主机、操作、标头等)组织为标准(规范)格式。规范请求是用于创建待签字符串的输入之一。
使用规范请求和额外信息(例如算法、请求日期、凭证范围和规范请求的摘要(哈希))创建待签字符串。
使用 AWS 秘密访问密钥作为初始哈希操作的密钥,对请求日期、区域和服务执行一系列加密哈希操作(HMAC 操作),从而派生签名密钥。在派生签名密钥后,通过对待签字符串执行加密哈希操作来计算签名。使用派生的签名密钥作为此操作的哈希密钥。
在计算签名后,将其添加到请求的 HTTP 标头或查询字符串中。
重要
AWS 开发工具包可以为您处理签名计算过程,因此您无需手动完成签名过程。有关更多信息,请参阅适用于 Amazon Web Services 的工具。
其他资源
以下资源全面介绍了签名过程的各个方面:
说明如何派生 Signature Version 4 签名密钥的示例。此页演示如何使用 Java、C#、Python、Ruby 和 JavaScript 派生签名密钥。
完整 Signature Version 4 签名过程的示例 (Python)。这组用 Python 编写的程序提供了完整的签名过程示例。这些示例演示了如何利用 POST 请求、利用在请求标头中具有签名信息的 GET 请求以及利用在查询字符串中具有签名信息的 GET 请求进行签名。
请求中的签署过程
以下示例演示了 HTTPS 请求(不带任何签名信息)从您的客户端发送到 AWS 时可能的样子。
GET https://iam.amazonaws.com/?Action=ListUsers&Version=2010-05-08 HTTP/1.1
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Host: iam.amazonaws.com
X-Amz-Date: 20150830T123600Z
在完成签名任务之后,请将身份验证信息添加到请求中。您可通过两种方式添加身份验证信息:
Authorization 标头
您可使用 Authorization 标头将身份验证信息添加到请求中。尽管该 HTTP 标头名为 Authorization,但签名信息实际上是用于身份验证的,目的是确定请求方。
Authorization 标头包含以下信息:
用于签名的算法 (AWS4-HMAC-SHA256)
凭证范围(包含您的访问密钥 ID)
已签名标头的列表
计算签名。该签名基于您的请求信息,由您使用 AWS 秘密访问密钥生成。该签名用于向 AWS 确认您的身份。
下面的示例说明在您创建签名信息并将它添加到请求的 Authorization 标头之后,前面的请求看起来是什么样。
GET https://iam.amazonaws.com/?Action=ListUsers&Version=2010-05-08 HTTP/1.1
Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/iam/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b5924a6f2b5d7
content-type: application/x-www-form-urlencoded; charset=utf-8
host: iam.amazonaws.com
x-amz-date: 20150830T123600Z
查询字符串
作为一种将身份验证信息添加到 HTTP 请求标头中的替代方法,您可以将它包含在查询字符串中。查询字符串包含请求的所有部分,包括操作的名称和参数、日期以及身份验证信息。
以下示例为您演示如何通过查询字符串中的操作和身份验证信息来构造 GET 请求。
GET https://iam.amazonaws.com?Action=ListUsers&Version=2010-05-08&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fiam%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=60&X-Amz-SignedHeaders=content-type%3Bhost&X-Amz-Signature=37ac2f4fde00b0ac9bd9eadeb459b1bbee224158d66e7ae5fcadb70b2d181d02 HTTP/1.1
content-type: application/x-www-form-urlencoded; charset=utf-8
host: iam.amazonaws.com
查询 API 中的 GET 和 POST 请求
许多 AWS 服务支持的查询 API 可用来通过 HTTP GET 或 POST 发送请求。(在查询 API 中,即使您提交更改状态的请求,即查询 API 本身并非 RESTful,您也可以使用 GET。) 因为 GET 请求通过查询字符串传递参数,所以它们的长度限制为 URL 的最大长度。如果请求包含大型负载(例如,您可能以 JSON 格式为 DynamoDB 请求上传大型 IAM
策略或发送大量参数),则通常使用 POST 请求。
两种类型的请求的签名过程相同。