签名机制说明
Access Key ID 和 Access Key Secret 由阿里云官方颁发给访问者(可以通过阿里云官方网站申请和管理),其中 Access Key ID 用于标识访问者的身份;Access Key Secret 是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密,只有阿里云和用户知道。
容器服务会对每个访问的请求进行验证,每个向容器服务提交的请求,都需要在请求中包含签名(Signature)信息。容器服务通过使用 Access Key ID 和 Access Key Secret 进行对称加密的方法来验证请求的发送者身份。如果计算出来的验证码和提供的一样即认为该请求是有效的;否则,容器服务将拒绝处理这次请求,并返回 HTTP 403 错误。
用户可以在 HTTP 请求中增加授权(Authorization)的 Head 来包含签名信息,表明这个消息已被授权。
容器服务要求将签名包含在 HTTP Header 中,格式为 Authorization: acs [Access Key Id]:[Signature]。
Signature 的计算方法如下:Signature = base64(hmac-sha1(VERB +
"\n"+ ACCEPT +
"\n" ++ Content-MD5 +
"\n"+ Content-Type +
"\n"+ Date +
"\n"+ CanonicalizedHeaders +
"\n"+ CanonicalizedResource))
- VERB 表示 HTTP 的 Method。比如示例中的 PUT。
- Accept 客户端需要的返回值类型,支持 application/json 和 application/xml。
- Content-MD5 表示请求内容数据的 MD5 值。
- Content-Type 表示请求内容的类型。
- Date 表示此次操作的时间,不能为空,目前只支持 GMT 格式。如果请求时间与 CAS 服务器时间相差超过 1 5分钟,CAS 会判定此请求不合法,并返回 400 错误。错误信息及错误码详见本文档第 5 部分。比如示例中的 Thu, 17 Mar 2012 18:49:58 GMT。
- CanonicalizedHeaders 表示 HTTP 中以 x-acs- 开始的字段组合。
- CanonicalizedResource 表示 HTTP 所请求资源的 URI (统一资源标识符)。比如示例中的 /clusters?name=my-clusters&resource=new。
- 将所有以 x-acs- 为前缀的 HTTP 请求头的名字转换成小写字母。比如将 X-ACS-Meta-Name: TaoBao 转换为 x-acs-meta-name: TaoBao。阿里云规范请求头的名字是大小写不敏感的,建议全部使用小写。
- 如果一个公共请求头的值部分过长,则需要处理其中的 \t、\n、\r、\f分隔符,将其替换为英文半角的空格。
- 将上一步得到的所有 HTTP 阿里云规范头按照字典序进行升序排列。
- 删除请求头和内容之间分隔符两端出现的任何空格。比如将 x-acs-meta-name: TaoBao,Alipay 转换为 x-acs-meta-name:TaoBao,Alipay。
- 将所有的头和内容用 \n 分隔符分隔拼成最后的 CanonicalizedHeaders。
说明
CanonicalizedResource 的格式规范: CanonicalizedResource 表示客户想要访问资源的规范描述,需要将子资源和 qurey 一同按照字典序,从小到大排列并以 & 为分隔符生成子资源字符串(? 后的所有参数)。
http://cs.aliyuncs.com/clusters?name=my-clusters&resource=new
CanonicalizedResource 应该为:
/clusters?name=my-clusters&resource=new
签名示例
示例概述您可以通过该示例,了解加签的步骤。
示例使用的 accessKeyId 和 accessKeySecret 分别为 access_key_id 和 access_key_secret。推荐您使用自己的 OpenAPI 调用程序,来计算下面这个示例的加签串,您自己的加签结果和示例结果。请求的示例如下:POST
http:
//cs.aliyuncs.com/clusters?param1=value1¶m2=value2 HTTP/1.1Accept-
Encoding: identityContent-
Length:
210Content-
MD5:
6U4ALMkKSj0PYbeQSHqgmA==x-acs-
version:
2015
-12
-15
Accept: application/jsonUser-
Agent: cs-sdk-python
/0.0.1 (Darwin/
15.2
.0/x86_64;
2.7
.10)x-acs-signature-
nonce: fbf6909a
-93a5
-45d3
-8b1c
-3e03a7916799x-acs-signature-
version:
1.0
Date: Wed,
16 Dec
2015
12:
20:
18 GMTx-acs-signature-
method: HMAC-SHA1Content-
Type: application/json;charset=utf
-8X-Acs-Region-
Id: cn-beijing
Authorization: acs
access_key_id:/ZmVlMDNkNDA1ZTQyMWViYWY1MTRhZGVjODgxMDM4YzRiMzEzNTg0ZA=={
"password":
"Just$test",
"instance_type":
"ecs.m2.medium",
"name":
"my-test-cluster-97082734",
"size":
1,
"network_mode":
"vpc",
"data_disk_category":
"cloud",
"data_disk_size":
10,
"ecs_image_id":
"m-253llee3l"}
请求构造过程计算 Content-Length 和 Content-MD5
Content-Length: body 内容的长度。[tr=transparent][url=http://g.alicdn.com/aliyun-icms/assets/icms-main/images/note.png][/url]说明[tr=transparent]第一行行尾有一个 \n 的换行符。/clusters?param
1=value
1¶m
2=value
2
计算 Signature组装 SignatureString。示例中的加签字符串的长度为 307。除最后一行外,每一行行尾均有一个\n的换行符。POSTapplication/json
6U4ALMkKSj0PYbeQSHqgmA==application/json;charset=utf-
8Wed,
16 Dec
2015
12:
20:
18 GMTx-acs-region-id:cn-beijingx-acs-signature-method:HMAC-SHA1x-acs-signature-nonce:fbf6909a-
93a5-
45d3-
8b1c-
3e03a7916799x-acs-signature-version:
1.0x-acs-version:
2015-
12-
15/clusters?param1=value1¶m2=value2
计算 Signature
# 使用 accessKeySecret 来对加签字符串进行加密,其中示例使用的 accessKeySecret 是 access_key_secret。hmac-sha1(SignatureString): fee03d405e421ebaf514adec881038c4b313584d
# 类似于 Content-MD5 的计算方式,将得到的加密串转化成字节数组。
# 将得到的字符数组做一个 base64 转换。得到最后的签名串。base64(bytes(hmac-sha1(SignatureString))): ZmVlMDNkNDA1ZTQyMWViYWY1MTRhZGVjODgxMDM4YzRiMzEzNTg0ZA==Signature: ZmVlMDNkNDA1ZTQyMWViYWY1MTRhZGVjODgxMDM4YzRiMzEzNTg0ZA==
完成经过以上的处理,添加一些其他头部信息,最终构成的 HTTP 请求如下所示。POST
http:
//cs.aliyuncs.com/clusters?param1=value1¶m2=value2 HTTP/1.1Accept-
Encoding: identityContent-
Length:
210Content-
MD5:
6U4ALMkKSj0PYbeQSHqgmA==x-acs-
version:
2015
-12
-15
Accept: application/jsonUser-
Agent: cs-sdk-python
/0.0.1 (Darwin/
15.2
.0/x86_64;
2.7
.10)x-acs-signature-
nonce: fbf6909a
-93a5
-45d3
-8b1c
-3e03a7916799x-acs-signature-
version:
1.0
Date: Wed,
16 Dec
2015
12:
20:
18 GMTx-acs-signature-
method: HMAC-SHA1Content-
Type: application/json;charset=utf
-8X-Acs-Region-
Id: cn-beijing
Authorization: acs
access_key_id:/ZmVlMDNkNDA1ZTQyMWViYWY1MTRhZGVjODgxMDM4YzRiMzEzNTg0ZA=={
"password":
"Just$test",
"instance_type":
"ecs.m2.medium",
"name":
"my-test-cluster-97082734",
"size":
1,
"network_mode":
"vpc"[backcolor=transparent]
,[backcolor=transparent]
"data_disk_category"[backcolor=transparent]
: [backcolor=transparent]
"cloud"[backcolor=transparent]
,[backcolor=transparent]
"data_disk_size"[backcolor=transparent]
: [backcolor=transparent]
10[backcolor=transparent]
,[backcolor=transparent]
"ecs_image_id"[backcolor=transparent]
: [backcolor=transparent]
"m-253llee3l"[backcolor=transparent]
}