本文主要介绍签名机制。
签名机制说明 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 服务器时间相差超过 15分钟,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
:
{"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
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****"}
md5(body): e94e002cc90a4a3d0f61b790487aa098
bytes(md5(body)): {[-23], [78], [0], [44], [-55], [10], [74], [61], [15], [97], [-73], [-112], [72], [122], [-96], [-104]}
base64(bytes(md5(body))): 6U4ALMkKSj0PYbeQSHqgmA== Content-MD5: 6U4ALMkKSj0PYbeQSHqgmA== 处理 CanonicalizedHeaders
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
hmac-sha1(SignatureString): fee03d405e421ebaf514adec881038c4b313584d
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
:
{"password": "Just$
","instance_type": "ecs.m2.medium","name": "my-test-cluster-9708","size": 1,"netwo
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。