对 HTTP 请求进行签名 - Amazon Redshift
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

对 HTTP 请求进行签名

Amazon Redshift 要求您发送到管理 API 的每个请求都必须使用签名进行身份验证。本主题介绍如何为请求签名。

如果您使用的是Amazon软件开发工具包 (SDK) 或Amazon Command Line Interface,请求签名将自动处理,您可以跳过此部分。有关使用的更多信息Amazon开发工具包,请参阅。使用 Amazon Redshift 管理界面。有关如何使用 Amazon Redshift 命令行界面的更多信息,请转到Amazon Redshift 命令行参考

要为请求签名,可以使用加密哈希函数计算数字签名。加密哈希一种是根据输入内容返回唯一哈希值的函数。对哈希函数的输入内容包括您的请求文本和秘密访问密钥。哈希函数返回哈希值,您将该值包含在请求中,作为签名。该签名是您的请求的 Authorization 标头的一部分。

注意

对于 API 访问,您需要访问密钥 ID 和秘密访问密钥。使用 IAM 用户访问密钥而不是Amazon账户根用户访问密钥。有关创建访问密钥的更多信息,请参阅。管理 IAM 用户的访问密钥中的IAM 用户指南

Amazon Redshift 收到您的请求后,会使用用于对该请求进行签名的同一哈希函数和输入来重新计算签名。如果得出的签名与请求中的签名相匹配,Amazon Redshift 将处理请求;否则请求将被拒绝。

Amazon Redshift 支持使用Amazon签名版本 4。计算签名的流程包含三个任务。这些任务在下文的示例中有所说明。

  • 任务 1:创建规范请求

    将您的 HTTP 请求重新排列为规范格式。必须使用规范格式,因为 Amazon Redshift 会使用同一规范格式计算要与您发送的签名进行比较的签名。

  • 任务 2:创建待签字符串

    创建一个字符串,将该字符串用作您的加密哈希函数输入值中的一项。该字符串称为“待签字符串”,是哈希算法名称、请求日期、凭证范围字符串以及来自上一任务的规范化请求的结合。凭证范围字符串本身是日期、区域和服务信息的结合。

  • 任务 3:创建签名

    使用加密哈希函数为您的请求创建签名,该函数接受两种输入字符串:待签字符串和派生密钥。派生密钥的计算方法是,以您的秘密访问密钥开头,并使用凭证范围字符串来创建一系列基于哈希的消息身份验证代码 (HMAC-SHA256)。

示例签名计算

以下示例将为您详细介绍为 CreateCluster 请求创建签名的过程。您可以使用该示例作为参考,检查您自己的签名计算方法。在 Amazon Web Services 术语表的签名版本 4 测试套件中包含其他参考计算。

您可以使用 GET 或 POST 请求将请求发送到 Amazon Redshift。这两者之间的区别是对于 GET 请求,您的参数作为查询字符串参数发送。对于 POST 请求,参数包含在请求正文中。以下示例显示的是 POST 请求。

示例假定以下各项:

  • 请求的时间戳为 Fri, 07 Dec 2012 00:00:00 GMT

  • 终端节点为美国东部(弗吉尼亚北部)地区 (us-east-1)。

一般的请求语法为:

https://redshift.us-east-1.amazonaws.com/ ?Action=CreateCluster &ClusterIdentifier=examplecluster &MasterUsername=masteruser &MasterUserPassword=12345678Aa &NumberOfNode=2 &NodeType=ds2.xlarge &Version=2012-12-01 &x-amz-algorithm=AWS4-HMAC-SHA256 &x-amz-credential=AKIAIOSFODNN7EXAMPLE/20121207/us-east-1/redshift/aws4_request &x-amz-date=20121207T000000Z &x-amz-signedheaders=content-type;host;x-amz-date

为计算的请求规范格式任务 1:创建规范请求是:

POST / content-type:application/x-www-form-urlencoded; charset=utf-8 host:redshift.us-east-1.amazonaws.com x-amz-date:20121207T000000Z content-type;host;x-amz-date 55141b5d2aff6042ccd9d2af808fdf95ac78255e25b823d2dbd720226de1625d

规范请求的最后一行是请求正文的哈希值。因为没有针对此 API 的查询参数,所以规范请求的第三行是空的。

要为其签名的字符串任务 2:创建待签字符串是:

AWS4-HMAC-SHA256 20121207T000000Z 20121207/us-east-1/redshift/aws4_request 06b6bef4f4f060a5558b60c627cc6c5b5b5a959b9902b5ac2187be80cbac0714

第一行待签字符串是算法,第二行是时间戳,第三行是凭证范围,最后一行是规范请求的哈希任务 1:创建规范请求。要在凭证范围中使用的服务名称为 redshift

适用于任务 3:创建签名,派生密钥可表示为:

derived key = HMAC(HMAC(HMAC(HMAC("AWS4" + YourSecretAccessKey,"20121207"),"us-east-1"),"redshift"),"aws4_request")

派生密钥是通过系列哈希函数计算的。从上面公式中的内部 HMAC 语句开始,您可以连接短语AWS4与您的秘密访问密钥进行哈希计算,并使用它作为键来对数据 “us-east-1” 进行哈希计算。该哈希计算的结果将成为下一个哈希函数的键。

计算派生密钥后,在接受两个输入字符串、待签字符串和派生密钥的哈希函数中使用它。例如,如果您使用秘密访问密钥 wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY 和前文提到的代签字符串,那么计算出的签名如下所示:

9a6b557aa9f38dea83d9215d8f0eae54100877f3e0735d38498d7ae489117920

最终步骤是构造 Authorization 标头。对于示例访问密钥 AKIAIOSFODNN7EXAMPLE,标头(为了便于阅读,添加了换行符)为:

Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20121207/us-east-1/redshift/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=9a6b557aa9f38dea83d9215d8f0eae54100877f3e0735d38498d7ae489117920