开发者社区> 问答> 正文

云监控中签名算法

反向一觉 2017-10-31 10:42:35 989

签名API请求
第一步:准备可用的阿里云访问秘钥

给 API 请求生成签名,需使用一对访问秘钥(AccessKeyId/AccessKeySecret)。您可以使用已经存在的访问秘钥对,也可以创建新的访问秘钥对,但需要保证使用的秘钥对处在“启用”状态。

第二步: 生成请求的签名字符串

事件监控的API 签名字符串由 HTTP 请求中的 Method,Header 和 Body 信息一同生成,具体方式如下:
  1. [backcolor=transparent]SignString[backcolor=transparent] [backcolor=transparent]=[backcolor=transparent] VERB [backcolor=transparent]+[backcolor=transparent] [backcolor=transparent]"\n"
  2. [backcolor=transparent]             [backcolor=transparent]+[backcolor=transparent] CONTENT[backcolor=transparent]-[backcolor=transparent]MD5 [backcolor=transparent]+[backcolor=transparent] [backcolor=transparent]"\n"
  3. [backcolor=transparent]             [backcolor=transparent]+[backcolor=transparent] CONTENT[backcolor=transparent]-[backcolor=transparent]TYPE [backcolor=transparent]+[backcolor=transparent] [backcolor=transparent]"\n"
  4. [backcolor=transparent]             [backcolor=transparent]+[backcolor=transparent] DATE [backcolor=transparent]+[backcolor=transparent] [backcolor=transparent]"\n"
  5. [backcolor=transparent]             [backcolor=transparent]+[backcolor=transparent] [backcolor=transparent]CanonicalizedHeaders[backcolor=transparent] [backcolor=transparent]+[backcolor=transparent] [backcolor=transparent]"\n"
  6. [backcolor=transparent]             [backcolor=transparent]+[backcolor=transparent] [backcolor=transparent]CanonicalizedResource

上面公式中的\n 表示换行转义字符,+(加号)表示字符串连接操作,其他各个部分定义如下:
名称定义示例
VERBHTTP 请求的方法名称PUT、GET、POST 等
CONTENT-MD5HTTP 请求中 Body 部分的 MD5 值(必须为大写字母串)875264590688CA6171F6228AF5BBB3D2
CONTENT-TYPEHTTP请求中 Body 部分的类型 application/json
DATEHTTP请求中的标准时间戳头(遵循 RFC 1123 格式,使用 GMT 标准时间)Mon, 3 Jan 2010 08:33:47 GMT
CanonicalizedHeaders由 HTTP 请求中以 x-cms 和 x-acs为前缀的自定义头构造的字符串x-cms-api-version:0.1.0\nx-cms-signature
CanonicalizedResource由 HTTP 请求资源构造的字符串(具体构造方法见下面详述)/event/custom/upload

CanonicalizedHeaders 的构造方式如下:
  1. 将所有以x-cms和 x-acs 为前缀的 HTTP 请求头的名字转换成小写字母;
  2. 将上一步得到的所有 CMS自定义请求头按照字典序进行升序排序;
  3. 删除请求头和内容之间分隔符两端出现的任何空格;
  4. 将所有的头和内容用 \n 分隔符组合成最后的 CanonicalizedHeaders。

CanonicalizedResource 的构造方式如下:
  1. 将 CanonicalizedResource 设置为空字符串(””);
  2. 放入要访问的URI,如/event/custom/upload
  3. 如请求包含查询字符串(QUERY_STRING),则在 CanonicalizedResource 字符串尾部添加? 和查询字符串。

其中QUERY_STRING 是 URL 中请求参数按字典序排序后的字符串,其中参数名和值之间用= 相隔组成字符串,并对参数名-值对按照字典序升序排序,然后以 & 符号连接构成字符串。其公式化描述如下:
  1. [backcolor=transparent]QUERY_STRING [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]"KEY1=VALUE1"[backcolor=transparent] [backcolor=transparent]+[backcolor=transparent] [backcolor=transparent]"&"[backcolor=transparent] [backcolor=transparent]+[backcolor=transparent] [backcolor=transparent]"KEY2=VALUE2"

第三步 生成请求的数字签名

目前,事件上报只支持一种数字签名算法,即默认签名算法 hmac-sha1。其整个签名公式如下:
  1. [backcolor=transparent]Signature[backcolor=transparent] [backcolor=transparent]=[backcolor=transparent] base16[backcolor=transparent]([backcolor=transparent]hmac[backcolor=transparent]-[backcolor=transparent]sha1[backcolor=transparent]([backcolor=transparent]UTF8[backcolor=transparent]-[backcolor=transparent]Encoding[backcolor=transparent]-[backcolor=transparent]Of[backcolor=transparent]([backcolor=transparent]SignString[backcolor=transparent]),[backcolor=transparent]AccessKeySecret[backcolor=transparent]))

JSON 监控 算法 API 数据格式
分享到
取消 提交回答
全部回答(0)

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题