全部产品
阿里云办公

签名机制

更新时间:2018-02-28 11:42:32

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

公共请求头

名称 描述
Authorization 用于验证请求合法性的认证信息,采用 acs AccessKeyId:signature 格式。
Content-Length RFC 2616 中定义的 HTTP 请求内容长度。
Content-Type RFC 2616 中定义的 HTTP 请求内容类型。
Content-MD5 HTTP 协议消息体的 128-bit MD5 散列值转换成 BASE64 编码的结果。为了防止所有请求被篡改,建议所有请求都附加该信息。
Date 描述请求时间,GMT 格式,如: Wed, 26 Aug. 2015 17:01:00 GMT。
Accept 客户端需要的返回值类型,支持 application/json 和 application/xml。
Host 访问 Host 值,例如:ros.aliyuncs.com。
x-acs-signature-nonce 唯一随机数,用于防止网络重放攻击。用户在不同请求中要使用不同的随机数值。
x-acs-signature-method 签名方法,目前只支持 HMAC-SHA1。
x-acs-signature-version 签名版本,目前是 1.0。

签名计算方法

ROA 风格的 API 请求使用标准的 Authorization 头来签名自己的请求,请求格式如下:

  1. Authorization: acs AccessKeyId:Signature

公共请求头计算签名

http 协议 Header

计算签名必须包含参数,Accept、Content-MD5、Content-Type、Date 的值(没有 key)(Content-Length 不计入签名),并按顺序排列;若值不存在则以 “\n” 补齐。

阿里云协议 Header (CanonicalizedHeaders)

CanonicalizedHeaders(阿里云规范头)是非标准 HTTP 头部信息。是指请求中出现的以 “x-acs-“ 为前缀的参数信息。

构成阿里云规范头的方法如下:

  1. 将所有以 “x-acs-” 为前缀的 HTTP 请求头的名称转换成小写字母。如 “X-acs-OSS-Meta-Name: TaoBao” 转换成 “x-acs-oss-meta-name: TaoBao”。阿里云规范请求头的名称大小写不敏感,建议全小写。

  2. 如果一个公共请求头的值过长,则需要处理其中的 “\t”、“\n”、“\r”、“\f” 分隔符,将其替换成英文半角的空格。

  3. 将上一步得到的所有 HTTP 阿里云规范头按照字典顺序进行升序排列。

  4. 删除请求头和内容之间分隔符两端出现的任何空格。如 “x-acs-oss-meta-name。 TaoBao,Alipay” 转换成 “x-acs-oss-meta-name:TaoBao,Alipay” 。

  5. 将所有的头和内容用 “\n” 分隔符分隔,拼成最后的 CanonicalizedHeaders。

签名中如何包含 CanonicalizedResource 和 qureyString

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

如:

  1. http://ros.aliyuncs.com/stacks?name=test_alert&status=COMPLETE

排序后:

  1. name=test_alert+"\n"+
  2. status=COMPLETE

封装签名

  1. Authorization = acs AccessKeyId + ":" + Signature
  2. Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(
  3. StringToSign) ) )
  4. StringToSign =

HTTP 协议 Header

  1. HTTP-Verb + "\n" +
  2. Accept + "\n" +
  3. Content-MD5 + "\n" +
  4. Content-Type + "\n" +
  5. Date + "\n" +

阿里云协议 Header (CanonicalizedHeaders)

  1. CanonicalizedHeaders +

签名中如何包含 CanonicalizedResource 和 qureyString

  1. CanonicalizedResource