目前,云监控只支持数字签名算法HMAC-SHA1。通过本文您可以了解数字签名算法HMAC-SHA1的操作方法。

操作步骤

  1. 准备可用的阿里云访问密钥。
    当HTTP请求生成签名时,需要使用一对访问密钥(AccessKey ID和AccessKey Secret)。
    说明 您可以使用已存在的访问密钥,也可以创建新的访问密钥,但需要保证该密钥处在启用状态。
  2. 生成请求的签名字符串。
    HTTP签名字符串由HTTP请求中的MethodHeaderBody信息共同生成。
    SignString = VERB + "\n"
                 + CONTENT-MD5 + "\n"
                 + CONTENT-TYPE + "\n"
                 + DATE + "\n"
                 + CanonicalizedHeaders + "\n"
                 + CanonicalizedResource
    上述签名字符串中的\n表示换行转义字符,+表示字符串连接操作,其他部分定义如下表所示。
    名称 描述 示例
    VERB HTTP请求的方法名称。 PUT、GET、POST
    CONTENT-MD5 HTTP请求中Body部分的MD5值。
    说明 MD5必须为大写字母和数字字符串。
    875264590688CA6171F6228AF5BBB3D2
    CONTENT-TYPE HTTP请求中Body部分的类型。 application/json
    DATE HTTP请求中的标准时间戳头。
    说明 遵循RFC 1123格式,使用GMT标准时间。
    Mon, 3 Jan 2010 08:33:47 GMT
    CanonicalizedHeaders 由HTTP请求中以x-cmsx-acs为前缀的自定义头构造的字符串。 x-cms-api-version:0.1.0\nx-cms-signature
    CanonicalizedResource 由HTTP请求资源构造的字符串。 /event/custom/upload

    上表中CanonicalizedHeaders和CanonicalizedResource构造方式如下:

    • CanonicalizedHeaders
      1. 将所有以x-cmsx-acs为前缀的HTTP请求头的名字转换成小写字母。
      2. 将所有CMS和ACS自定义请求头按照字典序的升序进行排序。
      3. 删除请求头和内容之间分隔符两端出现的任何空格。
      4. 将所有的请求头和内容用\n分隔符组合成最后的CanonicalizedHeaders。
    • CanonicalizedResource
      1. 将CanonicalizedResource设置为空字符串(””)。
      2. 将CanonicalizedResource中放入待访问的URI,例如:/event/custom/upload
      3. 如果请求包含查询字符串(QUERY_STRING),则在CanonicalizedResource字符串尾部添加和查询字符串。

        其中QUERY_STRING是URI中请求参数按字典序排序后的字符串,其中参数名和值之间用=相隔组成字符串,并对参数名和值按照字典序升序排序,然后以&符号连接构成字符串。其公式化描述如下:

        QUERY_STRING = "KEY1=VALUE1" + "&" + "KEY2=VALUE2"
  3. 生成请求的数字签名。
    数字签名公式如下:
    Signature = base16(hmac-sha1(UTF8-Encoding-Of(SignString),AccessKeySecret))
    签名举例:
    SignString="POST" + \n
    +"875264590688CA6171F6228AF5BBB3D2" + \n
    +"application/json" + \n
    +"Tue, 11 Dec 2018 21:05:51 +0800" + \n
    +"x-cms-api-version:1.0" + \n
    +"x-cms-ip:127.0.0.1" + \n
    +"x-cms-signature:hmac-sha1" + \n
    +"/metric/custom/upload"
    
    accesskey="testkey"
    accessSecret="testsecret" //签名密钥                            
    签名结果:
    1DC19ED63F755ACDE203614C8A1157EB1097E922