全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
容器服务

签名机制

更新时间:2017-06-07 13:26:11

签名机制说明

Access Key IDAccess Key Secret由阿里云官方颁发给访问者(可以通过阿里云官方网站申请和管理),其中Access Key ID用于标识访问者的身份;Access Key Secret是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密,只有阿里云和用户知道。

容器服务会对每个访问的请求进行验证,每个向容器服务提交的请求,都需要在请求中包含签名(Signature)信息。容器服务通过使用Access Key IDAccess Key Secret进行对称加密的方法来验证请求的发送者身份。如果计算出来的验证码和提供的一样即认为该请求是有效的;否则,容器服务将拒绝处理这次请求,并返回 HTTP 403 错误。

用户可以在 HTTP 请求中增加授权(Authorization)的 Head 来包含签名信息,表明这个消息已被授权。

容器服务要求将签名包含在 HTTP Header 中,格式为 Authorization: acs [Access Key Id]:[Signature]

Signature 的计算方法如下:

  1. Signature = base64(hmac-sha1(VERB + "\n"
  2. + ACCEPT + "\n" +
  3. + Content-MD5 + "\n"
  4. + Content-Type + "\n"
  5. + Date + "\n"
  6. + CanonicalizedHeaders + "\n"
  7. + 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)在签名验证前需要符合以下规范:

  1. 将所有以 x-acs- 为前缀的 HTTP 请求头的名字转换成小写字母。比如将 X-ACS-Meta-Name: TaoBao 转换为 x-acs-meta-name: TaoBao。阿里云规范请求头的名字是大小写不敏感的,建议全部使用小写。
  2. 如果一个公共请求头的值部分过长,则需要处理其中的 \t\n\r\f分隔符,将其替换为英文半角的空格。
  3. 将上一步得到的所有 HTTP 阿里云规范头按照字典序进行升序排列。
  4. 删除请求头和内容之间分隔符两端出现的任何空格。比如将 x-acs-meta-name: TaoBao,Alipay 转换为 x-acs-meta-name:TaoBao,Alipay
  5. 将所有的头和内容用 \n 分隔符分隔拼成最后的 CanonicalizedHeaders。

注意:CanonicalizedResource 的格式规范:CanonicalizedResource 表示客户想要访问资源的规范描述,需要将子资源和 qurey 一同按照字典序,从小到大排列并以 & 为分隔符生成子资源字符串(? 后的所有参数)。

  1. http://cs.aliyuncs.com/clusters?name=my-clusters&resource=new

CanonicalizedResource 应该为:

  1. /clusters?name=my-clusters&resource=new

签名示例

示例概述

您可以通过该示例,了解加签的步骤。

示例使用的 accessKeyIdaccessKeySecret 分别为 access_key_idaccess_key_secret。推荐您使用自己的 OpenAPI 调用程序,来计算下面这个示例的加签串,您自己的加签结果和示例结果。

请求的示例如下:

  1. POST http://cs.aliyuncs.com/clusters?param1=value1&param2=value2 HTTP/1.1
  2. Accept-Encoding: identity
  3. Content-Length: 210
  4. Content-MD5: 6U4ALMkKSj0PYbeQSHqgmA==
  5. x-acs-version: 2015-12-15
  6. Accept: application/json
  7. User-Agent: cs-sdk-python/0.0.1 (Darwin/15.2.0/x86_64;2.7.10)
  8. x-acs-signature-nonce: fbf6909a-93a5-45d3-8b1c-3e03a7916799
  9. x-acs-signature-version: 1.0
  10. Date: Wed, 16 Dec 2015 12:20:18 GMT
  11. x-acs-signature-method: HMAC-SHA1
  12. Content-Type: application/json;charset=utf-8
  13. X-Acs-Region-Id: cn-beijing
  14. Authorization: acs access_key_id:/uA9QF5CHrr1FK3siBA4xLMTWE0=
  15. {"password": "Just$test","instance_type": "ecs.m2.medium","name": "my-test-cluster-97082734","size": 1,"network_mode": "classic","data_disk_category": "cloud","data_disk_size": 10,"ecs_image_id": "m-253llee3l"}

请求构造过程

计算Content-LengthContent-MD5

Content-Length: body 内容的长度(注意:示例 body 首位没有空格或换行符)。

  1. body: {"password": "Just$test","instance_type": "ecs.m2.medium","name": "my-test-cluster-97082734","size": 1,"network_mode": "classic","data_disk_category": "cloud","data_disk_size": 10,"ecs_image_id": "m-253llee3l"}
  2. Content-Length: 210

Content-MD5: MD5 的计算过程。

  1. body: {"password": "Just$test","instance_type": "ecs.m2.medium","name": "my-test-cluster-97082734","size": 1,"network_mode": "classic","data_disk_category": "cloud","data_disk_size": 10,"ecs_image_id": "m-253llee3l"}
  2. # 计算 body 的 md5 值
  3. md5(body): e94e002cc90a4a3d0f61b790487aa098
  4. # 将 md5 值转化成字节数组。将 md5 中的每两个十六进制位合并,转化为一个字节。
  5. # 例如:e9 -> 11111111111111111111111111101001 -> -23
  6. bytes(md5(body)): {[-23], [78], [0], [44], [-55], [10], [74], [61], [15], [97], [-73], [-112], [72], [122], [-96], [-104]}
  7. # 将得到的字节数组做一个 base64 转换
  8. base64(bytes(md5(body))): 6U4ALMkKSj0PYbeQSHqgmA==
  9. Content-MD5: 6U4ALMkKSj0PYbeQSHqgmA==

处理 CanonicalizedHeaders

  1. # 将所有以‘x-acs-’开头的头部列出来
  2. x-acs-version: 2015-12-15
  3. x-acs-signature-nonce: ca480402-7689-43ba-acc4-4d2013d9d8d4
  4. x-acs-signature-version: 1.0
  5. x-acs-signature-method: HMAC-SHA1
  6. X-Acs-Region-Id: cn-beijing
  7. # 将请求名字变成小写,去掉每一行首尾的空格,并按照字典序进行排序。删除请求头和内容之间分隔符两端出现的任何空格。
  8. # 注意:最后一行没有换行符。
  9. x-acs-region-id:cn-beijing
  10. x-acs-signature-method:HMAC-SHA1
  11. x-acs-signature-nonce:fbf6909a-93a5-45d3-8b1c-3e03a7916799
  12. x-acs-signature-version:1.0
  13. x-acs-version:2015-12-15

计算 CanonicalizedResource

示例得到的 CanonicalizedResource,长度应该为 27。

注意:第一行行尾有一个 \n 的换行符。

  1. /clusters?param1=value1&param2=value2

计算 Signature

组装 SignatureString。示例中的加签字符串的长度为 307。除最后一行外,每一行行尾均有一个\n的换行符。

  1. POST
  2. application/json
  3. 6U4ALMkKSj0PYbeQSHqgmA==
  4. application/json;charset=utf-8
  5. Wed, 16 Dec 2015 12:20:18 GMT
  6. x-acs-region-id:cn-beijing
  7. x-acs-signature-method:HMAC-SHA1
  8. x-acs-signature-nonce:fbf6909a-93a5-45d3-8b1c-3e03a7916799
  9. x-acs-signature-version:1.0
  10. x-acs-version:2015-12-15
  11. /clusters?param1=value1&param2=value2

计算 Signature

  1. # 使用 accessKeySecret 来对加签字符串进行加密,其中示例使用的 accessKeySecret 是 access_key_secret。
  2. hmac-sha1(SignatureString): fee03d405e421ebaf514adec881038c4b313584d
  3. # 类似于 Content-MD5 的计算方式,将得到的加密串转化成字节数组。
  4. # 将得到的字符数组做一个 base64 转换。得到最后的签名串。
  5. base64(bytes(hmac-sha1(SignatureString))): ZmVlMDNkNDA1ZTQyMWViYWY1MTRhZGVjODgxMDM4YzRiMzEzNTg0ZA==
  6. Signature: ZmVlMDNkNDA1ZTQyMWViYWY1MTRhZGVjODgxMDM4YzRiMzEzNTg0ZA==

完成

经过以上的处理,添加一些其他头部信息,最终构成的 HTTP 请求如下所示。

  1. POST http://cs.aliyuncs.com/clusters?param1=value1&param2=value2 HTTP/1.1
  2. Accept-Encoding: identity
  3. Content-Length: 210
  4. Content-MD5: 6U4ALMkKSj0PYbeQSHqgmA==
  5. x-acs-version: 2015-12-15
  6. Accept: application/json
  7. User-Agent: cs-sdk-python/0.0.1 (Darwin/15.2.0/x86_64;2.7.10)
  8. x-acs-signature-nonce: fbf6909a-93a5-45d3-8b1c-3e03a7916799
  9. x-acs-signature-version: 1.0
  10. Date: Wed, 16 Dec 2015 12:20:18 GMT
  11. x-acs-signature-method: HMAC-SHA1
  12. Content-Type: application/json;charset=utf-8
  13. X-Acs-Region-Id: cn-beijing
  14. Authorization: acs access_key_id:/uA9QF5CHrr1FK3siBA4xLMTWE0=
  15. {"password": "Just$test","instance_type": "ecs.m2.medium","name": "my-test-cluster-97082734","size": 1,"network_mode": "classic","data_disk_category": "cloud","data_disk_size": 10,"ecs_image_id": "m-253llee3l"}
本文导读目录