全部产品
云市场

签名机制

更新时间:2018-05-23 00:21:06

签名

API 签名包含两部分:公共请求头(HTTP 协议 Header 参数和阿里云协议 Header 参数)和 CanonicalizedResource(规范资源),Body 不计入签名。

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

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

请求要求将签名包含在 HTTP Header 中,格式为 Authorization: acs [Access Key Id]:[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 格式。如果请求时间与服务器时间相差超过 15 分钟,系统会判定此请求不合法,并返回 400 错误。比如示例中的 Thu, 17 Mar 2018 18:00:00 GMT
  • CanonicalizedHeaders 表示 HTTP 中以 x-acs- 开始的字段组合。
  • CanonicalizedResource 表示 HTTP 所请求资源的 URI (统一资源标识符)。比如 /namespaces

CanonicalizedHeaders

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://cr.cn-hangzhou.aliyuncs.com/repository?name=repository1&namespace=namespace1

CanonicalizedResource 应该为:

  1. /repository?name=repository1&namespace=namespace1