签名机制
签名机制说明
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
。
CanonicalizedHeaders
(即以x-acs-
开头的 header)在签名验证前需要符合以下规范:
- 将所有以
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.1
Accept-Encoding: identity
Content-Length: 210
Content-MD5: 6U4ALMkKSj0PYbeQSHqgmA==
x-acs-version: 2015-12-15
Accept: application/json
User-Agent: cs-sdk-python/0.0.1 (Darwin/15.2.0/x86_64;2.7.10)
x-acs-signature-nonce: fbf6909a-93a5-45d3-8b1c-3e03a7916799
x-acs-signature-version: 1.0
Date: Wed, 16 Dec 2015 12:20:18 GMT
x-acs-signature-method: HMAC-SHA1
Content-Type: application/json;charset=utf-8
X-Acs-Region-Id: cn-beijing
Authorization: acs <yourAccessKeyId>:<yourSignature>
{"password": "Just$****","instance_type": "ecs.m2.medium","name": "my-test-cluster-9708****","size": 1,"network_mode": "vpc","data_disk_category": "cloud","data_disk_size": 10,"ecs_image_id": "m-253l****l"}
请求构造过程
计算 Content-Length
和 Content-MD5
Content-Length
: body 内容的长度。
body: {"password": "Just$****","instance_type": "ecs.m2.medium","name": "my-test-cluster-9708****","size": 1,"network_mode": "vpc","data_disk_category": "cloud","data_disk_size": 10,"ecs_image_id": "m-253ll****"}
Content-Length: 210
Content-MD5
: MD5 的计算过程。
body: {"password": "Just$****","instance_type": "ecs.m2.medium","name": "my-test-cluster-9708****","size": 1,"network_mode": "vpc","data_disk_category": "cloud","data_disk_size": 10,"ecs_image_id": "m-253ll****"}
# 计算 body 的 md5 值
md5(body): e94e002cc90a4a3d0f61b790487aa098
# 将 md5 值转化成字节数组。将 md5 中的每两个十六进制位合并,转化为一个字节。
# 例如:e9 -> 11111111111111111111111111101001 -> -23
bytes(md5(body)): {[-23], [78], [0], [44], [-55], [10], [74], [61], [15], [97], [-73], [-112], [72], [122], [-96], [-104]}
# 将得到的字节数组做一个 base64 转换
base64(bytes(md5(body))): 6U4ALMkKSj0PYbeQSHqgmA==
Content-MD5: 6U4ALMkKSj0PYbeQSHqgmA==
处理 CanonicalizedHeaders
# 将所有以‘x-acs-’开头的头部列出来
x-acs-version: 2015-12-15
x-acs-signature-nonce: ca480402-7689-43ba-acc4-4d2013d9d8d4
x-acs-signature-version: 1.0
x-acs-signature-method: HMAC-SHA1
X-Acs-Region-Id: cn-beijing
# 将请求名字变成小写,去掉每一行首尾的空格,并按照字典序进行排序。删除请求头和内容之间分隔符两端出现的任何空格。
# 注意:最后一行没有换行符。
x-acs-region-id:cn-beijing
x-acs-signature-method:HMAC-SHA1
x-acs-signature-nonce:fbf6909a-93a5-45d3-8b1c-3e03a7916799
x-acs-signature-version:1.0
x-acs-version:2015-12-15
计算 CanonicalizedResource
示例得到的 CanonicalizedResource
,长度应该为 27。
/n
的换行符。
/clusters?param1=value1¶m2=value2
计算 Signature
组装 SignatureString
。示例中的加签字符串的长度为 307。除最后一行外,每一行行尾均有一个/n
的换行符。
POST
application/json
6U4ALMkKSj0PYbeQSHqgmA==
application/json;charset=utf-8
Wed, 16 Dec 2015 12:20:18 GMT
x-acs-region-id:cn-beijing
x-acs-signature-method:HMAC-SHA1
x-acs-signature-nonce:fbf6909a-93a5-45d3-8b1c-3e03a7916799
x-acs-signature-version:1.0
x-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.1
Accept-Encoding: identity
Content-Length: 210
Content-MD5: 6U4ALMkKSj0PYbeQSHqgmA==
x-acs-version: 2015-12-15
Accept: application/json
User-Agent: cs-sdk-python/0.0.1 (Darwin/15.2.0/x86_64;2.7.10)
x-acs-signature-nonce: fbf6909a-93a5-45d3-8b1c-3e03a7916799
x-acs-signature-version: 1.0
Date: Wed, 16 Dec 2015 12:20:18 GMT
x-acs-signature-method: HMAC-SHA1
Content-Type: application/json;charset=utf-8
X-Acs-Region-Id: cn-beijing
Authorization: acs <yourAccessKeyId>:<yourSignature>
{"password": "Just$****","instance_type": "ecs.m2.medium","name": "my-test-cluster-9708****","size": 1,"network_mode": "vpc","data_disk_category": "cloud","data_disk_size": 10,"ecs_image_id": "m-253ll****"}
发布者:佚, 佚名,转转请注明出处:https://www.cms2.cn/aliyun/csk/5009.html