Amazon Redshift
群集管理指南 (API 版本 2012-12-01)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

为 HTTP 请求签名

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

如果您使用的是 AWS 软件开发工具包 (SDK) 之一或 AWS 命令行界面,将自动为请求签名,因此您可以跳过本节。有关使用 AWS SDK 的更多信息,请参阅使用 Amazon Redshift 管理界面。有关使用 Amazon Redshift 命令行界面的更多信息,请转到 Amazon Redshift 命令行参考

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

注意

For API access, you need an access key ID and secret access key. Use IAM user access keys instead of AWS 账户根用户 access keys. IAM lets you securely control access to AWS services and resources in your AWS account. For more information about creating access keys, see How Do I Get Security Credentials? in the AWS General Reference.

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

Amazon Redshift 支持使用 AWS 签名版本 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.cn/ ?Action=CreateCluster &ClusterIdentifier=examplecluster &MasterUsername=masteruser &MasterUserPassword=12345678Aa &NumberOfNode=2 &NodeType=ds1.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.cn 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

本页内容: