对 HTTP 请求进行签名
Amazon Redshift 要求您发送到管理 API 的每个请求都必须使用签名进行身份验证。本主题介绍如何为请求签名。
如果您使用的是 AWS 开发工具包 (SDK) 之一或 AWS Command Line Interface,将自动为请求签名,因此您可以跳过本节。有关如何使用 AWS 开发工具包的更多信息,请参阅使用预置集群的 Amazon Redshift 管理界面。有关使用 Amazon Redshift 命令行界面的更多信息,请转到 Amazon Redshift 命令行参考。
要为请求签名,可以使用加密哈希函数计算数字签名。加密哈希一种是根据输入内容返回唯一哈希值的函数。对哈希函数的输入内容包括您的请求文本和您从临时凭证获得的秘密访问密钥。哈希函数返回哈希值,您将该值包含在请求中,作为签名。该签名是您的请求的 Authorization
标头的一部分。
注意
如果用户需要在 AWS Management Console 之外与 AWS 交互,则需要编程式访问权限。授予编程式访问权限的方法取决于访问 AWS 的用户类型。
要向用户授予编程式访问权限,请选择以下选项之一。
哪个用户需要编程式访问权限? | 目的 | 方式 |
---|---|---|
人力身份 (在 IAM Identity Center 中管理的用户) |
使用临时凭证签署向 AWS CLI、AWS SDK 或 AWS API 发出的编程请求。 |
按照您希望使用的界面的说明进行操作。
|
IAM | 使用临时凭证签署向 AWS CLI、AWS SDK 或 AWS API 发出的编程请求。 | 按照《IAM 用户指南》中将临时凭证用于 AWS 资源中的说明进行操作。 |
IAM | (不推荐使用) 使用长期凭证签署向 AWS CLI、AWS SDK 或 AWS API 发出的编程请求。 |
按照您希望使用的界面的说明进行操作。
|
Amazon Redshift 收到您的请求后,它将使用您在为请求签名时使用的相同哈希函数和输入来重新计算签名。如果得出的签名与请求中的签名相匹配,Amazon Redshift 会处理请求;否则请求将被拒绝。
Amazon Redshift 支持使用 AWS 签名版本 4 进行身份验证。计算签名的流程包含三个任务。这些任务在下文的示例中有所说明。
-
将您的 HTTP 请求重新排列为规范格式。必须使用规范格式,因为 Amazon Redshift 会使用同一规范格式计算要与您发送的签名进行比较的签名。
-
创建一个字符串,将该字符串用作您的加密哈希函数输入值中的一项。该字符串称为待签字符串,是哈希算法名称、请求日期、凭证范围字符串以及来自上一任务的规范化请求的结合。凭证范围字符串本身是日期、区域和服务信息的结合。
-
使用加密哈希函数为您的请求计算签名,该函数接受两种输入字符串:待签名字符串和派生密钥。派生密钥的计算方法是,以您的秘密访问密钥开头,并使用凭证范围字符串来创建一系列基于哈希的消息身份验证代码 (HMAC-SHA256)。
示例签名计算
以下示例将为您详细介绍为 CreateCluster 请求创建签名的过程。您可以使用该示例作为参考,检查您自己的签名计算方法。其他参考计算包含在《IAM 用户指南》的“请求签名示例”部分中。
您可以使用 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=dc2.large
&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