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

签名步骤

  1. 构造规范化的请求字符串。
    • 按照字母升序,对参数名称进行排序。排序的参数包括公共请求参数和要调用接口的指定参数。
      说明 当使用GET方法提交请求时,这些参数是请求URL中的参数部分(即URL中问号(?)之后由and(&)连接的部分)。
    • 对每个请求参数的名称和值进行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”替换成波浪线(~),即可得到上述规则描述的编码字符串。
    • 对编码后的参数名称和值使用等于号(=)进行连接。
    • 把等于号(=)连接得到的字符串按参数名称的字典顺序依次使用and(&)符号连接,即得到规范化请求字符串。

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

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

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

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

  2. 按照RFC2104的定义,使用上面的用于签名的字符串计算签名HMAC值。RFC2104详情,请参见RFC2104
    注意 计算签名时使用的Key是用户持有的Access Key Secret加上一个and(&)符号(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%26Action%3DCreateKey%26Format%3Djson%26SignatureMethod%3DHMAC-SHA1%26SignatureVersion%3D1.0%26Timestamp%3D2016-03-28T03%253A13%253A08Z%26Version%3D2016-01-20
			

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

41wk2SSX1GJh7fwnc5eqOfiJPFg=   

签名后的请求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****