用户在 HTTP 或 HTTPS 请求中添加签名(Signature)信息,阿里云才可以对请求进行身份验证。签名需要使用 AccessKey,由 AccessKey ID 和 AccessKey Secret 组成。用户可通过阿里云官方网站申请和管理 AccessKey ID 和 AccessKey Secret。

签名步骤

  1. 构造规范化的请求字符串
    • 按照字母升序,对参数名称进行排序。排序的参数包括公共请求参数和要调用的接口的指定参数。
      说明 当使用GET方法提交请求时,这些参数就是请求URI中的参数部分(即URI中“?”之后由“&”连接的部分)。
    • 对每个请求参数的名称和值进行URL编码。使用UTF-8字符集进行编码,编码规则是:
      • 对于字符 A-Z、a-z、0-9以及字符“-”、“_”、“.”、“~”不编码;
      • 对于其他字符编码成“%XY”的格式,其中XY是字符对应ASCII码的16进制表示。比如英文的双引号(")对应的编码就是%22;
      • 英文空格( )编码为%20,而不是加号(+)。
        说明 一般支持URL编码的库(比如Java中的java.net.URLEncoder)都是按照“application/x-www-form-urlencoded”的MIME类型的规则进行编码的。实现时可以直接使用这类方式进行编码,把编码后的字符串中加号(+)替换成%20、星号(*)替换成%2A、%7E替换回波浪号(~),即可得到上述规则描述的编码字符串。
    • 对编码后的参数名称和值使用英文等号(=)进行连接。
    • 再把英文等号连接得到的字符串按参数名称的字典顺序依次使用 & 符号连接,即得到规范化请求字符串。

      使用上一步构造的规范化字符串按照下面的规则构造用于计算签名的字符串:

      StringToSign=
      HTTPMethod + “&” +
      percentEncode(“/”) + ”&” +
      percentEncode(CanonicalizedQueryString)
      

      其中 HTTPMethod 是提交请求用的 HTTP 方法,比 GET。percentEncode(“/”)是按照前文描述的 URL 编码规则对字符“/”进行编码得到的值,即“%2F”。

      percentEncode(CanonicalizedQueryString)是对第1步中构造的规范化请求字符串按 1.b 中描述的 URL 编码规则编码后得到的字符串。

  2. 按照RFC2104的定义,使用上面的用于签名的字符串计算签名 HMAC 值。注意:计算签名时使用的 Key 就是用户持有的 Access Key Secret 并加上一个“&”字符(ASCII:38),使用的哈希算法是 SHA1。
  3. 按照 Base64 编码规则把上面的 HMAC 值编码成字符串,即得到签名值(Signature)。
  4. 将得到的签名值作为 Signature 参数添加到请求参数中,即完成对请求签名的过程。
    说明 得到的签名值在作为最后的请求参数值提交给 KMS 服务器的时候,要和其他参数一样,按照 RFC3986 的规则进行 URL 编码)。

示例

CreateKey为例,签名前的请求 URL 为:

https://kms.cn-hangzhou.aliyuncs.com/?Action=CreateKey
&SignatureVersion=1.0
&Format=json
&Version=2016-01-20
&AccessKeyId=testid
&SignatureMethod=HMAC-SHA1
&Timestamp=2016-03-28T03:13:08Z

那么CanonicalizedQueryString就是:

AccessKeyId=testid&Action=CreateKey&Format=json&SignatureMethod=HMAC-SHA1&SignatureVersion=1.0&Timestamp=2016-03-28T03%3A13%3A08Z&Version=2016-01-20

所以StringToSign应该是:

GET&%2F&AccessKeyId%3Dtestid&Action%3DCreateKey&Format%3Djson&SignatureMethod%3DHMAC-SHA1&SignatureVersion%3D1.0&Timestamp%3D2016-03-28T03%253A13%253A08Z&Version%3D2016-01-20

假如使用的 AccessKey Id 是testid,AccessKey Secret 是testsecret,用于计算 HMAC的 Key 就是testsecret&,则计算得到的签名值是:

s/OdVWMTmNGagvWlljdAJ7Itsew=

签名后的请求 URL 为(注意增加了Signature参数):

https://kms.cn-hangzhou.aliyuncs.com/?Action=CreateKey
&SignatureVersion=1.0
&Format=json
&Version=2016-01-20
&AccessKeyId=F585********APMU
&SignatureMethod=HMAC-SHA1
&Timestamp=2016-03-28T03:13:08Z
&Signature=41wk2SSX1GJh7fwnc5eqOfiJPF****