为保证API的安全使用,在调用API时阿里云会对每个API请求通过签名(Signature)进行身份验证。无论使用HTTP还是HTTPS协议提交请求,都需要在请求中包含签名信息。本文介绍计算签名的方法和示例。

步骤一:构造规范化请求字符串

  1. 参数排序。按照参数首字母的字典顺序对参数排序,排序参数包括公共请求参数和接口自定义参数,不包括公共请求参数中的Signature参数。 公共请求参数详情,请参见公共参数
  2. 对请求参数和参数值进行编码。使用UTF-8字符集按照RFC3986规则编码请求参数和参数取值。为方便表述,我们将此步骤的编码方法,命名为 encodeURIComponent
    参数编码方式:
    • 字符A~Z、a~z、0~9以及字符短横线(-)、下划线(_)、英文句点(.)和波浪线(~)不编码。
    • 对其它ASCII码字符进行编码。编码格式为%加上16进制的ASCII码。例如半角双引号(")将被编码为%22
    • 非ASCII码通过UTF-8编码。
    • 空格( )编码成%20,而不是加号(+)。
  3. 使用等号(=)连接编码后的请求参数和参数取值。
  4. 使用与号(&)连接编码后的请求参数,注意参数排序与步骤1一致。
  5. 头部添加协议头和endpoint。例如https://ecs.aliyuncs.com/

    现在,您得到了规范化请求字符串,为方便表述,我们将步骤一:构造规范化请求字符串得到的字符串命名为CanonicalizedQueryString

步骤二:构造签名字符串

  1. 构造待签名字符串stringToSign
    我们以Java为例,该字符串构造规则为:
    String stringToSign =
      HTTPMethod + "&" + // HTTPMethod:发送请求的 HTTP 方法,例如 GET。
      encodeURIComponent("/") + "&" + // encodeURIComponent 为步骤一第2步的编码方法
      encodeURIComponent(CanonicalizedQueryString) // CanonicalizedQueryString 为步骤一获取的规范化请求字符串。
  2. 按照RFC2104的定义,通过您传入的AccessKeyId对应的密钥AccessSecret,使用HMAC-SHA1的签名算法,计算待签名字符串StringToSign的签名。
    以Java为例,计算方法为:
    String signature = Base64(HMAC_SHA1(AccessSecret + "&", UTF_8_Encoding_Of(stringToSign)))

    现在您得到了公共参数Signature的签名值signature

签名示例

本示例以调用ECS DescribeDedicatedHosts查询一台或多台专有宿主机的详细信息为例。假设您获得了AccessKeyID=testid以及 AccessKeySecret=testsecret,签名流程为:

  1. 构造规范化请求字符串。
    http://ecs.aliyuncs.com/?Timestamp=2016-02-23T12%253A46%253A24Z&Format=XML&AccessKeyId=testid&Action=DescribeDedicatedHosts&SignatureMethod=HMAC-SHA1&SignatureNonce=3ee8c1b8-xxxx-xxxx-xxxx-xxxxxxxxxx&Version=2014-05-26&SignatureVersion=1.0
  2. 构造待签名字符串stringToSign
    GET&%2F&AccessKeyId%3Dtestid%26Action%3DDescribeDedicatedHosts%26Format%3DXML%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D3ee8c1b8-xxxx-xxxx-xxxx-xxxxxxxxx%26SignatureVersion%3D1.0%26Timestamp%3D2016-02-23T12%253A46%253A24Z%26Version%3D2014-05-26
  3. 计算签名值。例如AccessKeySecret=testsecret,用于计算的Key为testsecret&(注意:加上后缀&)。计算得到的签名值为OLeaidS1JvxuMvnyHOwuJ+uX5qY=。本示例使用的是 Java Base64 编码方法。
    String Signature = Base64(HMAC_SHA1(AccessSecret + "&",UTF_8_Encoding_Of(stringToSign)))
  4. 添加RFC3986规则编码后的Signature=OLeaidS1JvxuMvnyHOwuJ%2BuX5qY%3D步骤1的URL中。
    http://ecs.aliyuncs.com/?SignatureVersion=1.0&Action=DescribeDedicatedHosts&Format=XML&SignatureNonce=3ee8c1b8-xxxx-xxxx-xxxx-xxxxxxxxx&Version=2014-05-26&AccessKeyId=testid&Signature=OLeaidS1JvxuMvnyHOwuJ%2BuX5qY%3D&SignatureMethod=HMAC-SHA1&Timestamp=2016-02-23T12%253A46%253A24Z

    通过步骤4得到的URL,您可以使用浏览器、curl或者 wget等工具发起HTTP请求调用DescribeDedicatedHosts,查询一台或多台专有宿主机的详细信息。