为保证API的安全调用,在调用API时阿里云会对每个API请求通过签名(Signature)进行身份验证。无论使用HTTP还是HTTPS协议提交请求,都需要在请求中包含签名信息。本文指导您如何进行签名处理。

对于每一次HTTP或者HTTPS协议请求,阿里云会根据访问中的签名信息验证访问请求者身份。您在访问时签名信息时,请按照以下方法对请求进行签名处理:

步骤一:构造规范化请求头

阿里云规范化请求头(CanonicalizedHeaders)是非标准HTTP头部信息。是指请求中出现的以 x-acs-为前缀的参数信息,构造方法如下:
  • 将所有以x-acs-为前缀的HTTP请求头的名称转换成小写字母。如X-acs-Meta-Name: TaoBao转换成x-acs-meta-name: TaoBao。阿里云规范请求头的名称大小写不敏感,建议全小写。
  • 如果一个公共请求头的值过长,则需要处理其中的\t\n\r\f分隔符,将其替换成英文半角的空格。
  • 将上一步得到的所有HTTP阿里云规范头按照字典顺序进行升序排列。
  • 删除请求头的名称和值之间的分隔符两端出现的任何空格。例如x-acs-oss-meta-name : TaoBao,Alipay转换成x-acs-oss-meta-name:TaoBao,Alipay
  • 在每一个请求头后添加一个\n分隔符(包括最后一个请求头),然后将所有请求头拼接在一起即获得CanonicalizedHeaders。

步骤二:构造规范化资源

规范化资源(CanonicalizedResource) 表示您想要访问资源的规范描述,具体构造方式如下:
  1. 将请求的查询字符串(queryString)中的参数按照参数名称的字典序重新排序,并以&分隔符连接生成已排序查询字符串。

    如果本次请求没有携带查询字符串,则跳过此步骤。

  2. 将请求资源路径(指URL中host与查询字符串之间的部分,包含host之后的/但不包含查询字符串前的?)与已排序查询字符串以?拼接,得到规范化资源。当查询字符串不存在时,直接用请求资源路径作为规范化资源。

示例

原始请求URL:
http://demo-product.aliyuncs.com/instances?status=ONLINE&group=test_group
规范化资源:
/instances?group=test_group&status=ONLINE

步骤三:构造待签名字符串

按照以下伪代码构造待签名字符串(StringToSign):
StringToSign = 
    HTTP-Verb + "\n" +
    Accept + “\n” +
    Content-MD5 + "\n" +
    Content-Type + "\n" +
    Date + "\n" +
    CanonicalizedHeaders +
    CanonicalizedResource
参数 描述
HTTP-Verb 大写的HTTP方法名,例如POST、GET。
Accept Accept请求头的值,当请求头不存在时,使用空字符串代替。
Content-MD5 Content-MD5请求头的值,当请求头不存在时,使用空字符串代替。
Content-Type Content-Type请求头的值,当请求头不存在时,使用空字符串代替。
Date Date请求头的值。
CanonicalizedHeaders 步骤一:构造规范化请求头中获得的规范化请求头。
CanonicalizedResource 步骤二:构造规范化资源中获得的规范化资源。

步骤四:计算签名

根据 RFC2104的定义,按照HMAC-SHA1算法对上一步生成的待签名字符串进行签名计算,并以Base64编码规则将计算结果编码成字符串,即得到最终的签名值(Signature)。
Signature = Base64( HMAC-SHA1( SigningKey, StringToSign ) )
注意 计算签名时使用的SigningKey值就是您的AccessKey Secret。更多信息,请参见 创建AccessKey

步骤五:将签名添加到请求中

计算出签名结果Signature后,按照以下规则拼接字符串,并将结果作为Authorization请求头的值。
Authorization = "acs " + AccessKeyId + ":" + Signature