全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 钉钉智能硬件
消息服务

请求签名机制

更新时间:2017-06-21 14:35:25

签名机制

Access Key ID和Access Key Secret 由阿里云官方颁发给访问者(可以通过阿里云AK管理控制台申请和管理),其中 Access Key ID 用于标识访问者的身份;Access Key Secret 是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密,只有阿里云和用户知道。

MNS 服务会对每个访问的请求进行验证,每个向 MNS 提交的请求,都需要在请求的header中包含签名(Authorization)。MNS 通过使用 Access Key ID 和 Access Key Secret 进行对称加密的方法来验证请求的发送者身份。如果计算出来的验证码和提供的一样即认为该请求是有效的;否则,MNS 将拒绝处理这次请求,并返回 HTTP 403 错误。

您必须在 HTTP 请求中增加 Authorization(授权)的 Head 来包含签名信息,表明这个消息已被授权。格式为:Authorization: MNS AccessKeyId:Signature

Authorization计算方法如下:

( 您可以使用签名验证工具来验证您生成的签名 )

  1. Authorization = base64(hmac-sha1(HTTP_METHOD + "\n"
  2. + CONTENT-MD5 + "\n"
  3. + CONTENT-TYPE + "\n"
  4. + DATE + "\n"
  5. + CanonicalizedMNSHeaders
  6. + CanonicalizedResource))
  • HTTP_METHOD 表示大写的HTTP Method(如:PUT, GET, POST, DELETE)
  • Content-Md5 表示请求内容数据的MD5值。如果请求的Header中没有传Content-MD5,则此处填入空串
  • CONTENT-TYPE 表示请求内容的类型
  • DATE 表示此次操作的时间,不能为空,目前只支持GMT格式,如果请求时间和MNS服务器时间相差超过15分钟,MNS会判定此请求不合法,返回400错误,错误信息及错误码详见本文档第5部分。格式为:Thu, 07 Mar 2012 18:49:58 GMT。如果用 x-mns-date 替代 Date,则 DATE 不能填空,需用 x-mns-date 的值替换。
  • CanonicalizedMNSHeaders表示 http中的x-mns-开始的字段组合。(见下文注意事项)
  • CanonicalizedResource表示http所请求资源的URI(统一资源标识符)。(如示例中:/queues/$queueName?metaOverride=true

注意:CanonicalizedMNSHeaders(即x-mns-开头的head)在签名验证前需要符合以下规范:

  • head的名字需要变成小写;
  • head自小到大排序;
  • 分割head name和value的冒号前后不能有空格;
  • 每个Head之后都有一个\n,如果没有以x-mns-开头的head,则在签名时CanonicalizedMNSHeaders就设置为空。

其他:

  1. 用来签名的字符串为UTF-8格式。
  2. 签名的方法用RFC 2104。中定义的HMAC-SHA1方法,其中Key为AccessKeySecret。
  3. content-type和content-md5在请求中不是必须的,没有情况下,请使用''代替。

请求的示例如下:

  1. PUT /queues/$queueName?metaOverride=true HTTP/1.1
  2. Host: $AccountId.mns.cn-hangzhou.aliyuncs.com
  3. Date: Wed, 08 Mar 2012 12:00:00 GMT
  4. Authorization: MNS 15B4D3461F177624206A:xQE0diMbLRepdf3YB+FIEXAMPLE=
  5. <?xml version="1.0" encoding="UTF-8" ?>
  6. <Queue xmlns="http://mns.aliyuncs.com/doc/v1/">
  7. <VisibilityTimeout >60</VisibilityTimeout>
  8. <MaximumMessageSize>1024</MaximumMessageSize>
  9. <MessageRetentionPeriod>120</MessageRetentionPeriod>
  10. <DelaySeconds>30</DelaySeconds>
  11. </Queue>

如果传入的AccessKey Id不存在或inactive,返回403 Forbidden。

返回示例:

  1. Content-Type: text/xml
  2. Content-Length: 314
  3. Date: Wed, 18Mar 2012 08:04:06 GMT
  4. x-mns-request-id: 512B2A634403E52B1956133E
  5. <?xml version="1.0" encoding="utf-8"?>
  6. <Error xmlns="http://mns.aliyuncs.com/doc/v1/">
  7. <Code>AccessIDAuthError</Code>
  8. <Message>
  9. AccessID authentication fail, please check your AccessID and retry.
  10. </Message>
  11. <RequestId>512B2A634403E52B1956133E</RequestId>
  12. <HostId>mns.cn-hangzhou.aliyuncs.com</HostId>
  13. </Error>

如果签名验证的时候,头中没有传入Date或者格式不正确,返回403 Forbidden错误。

返回示例:

  1. Content-Type: text/xml
  2. Content-Length: 274
  3. Date: Wed, 18Mar 2012 08:04:06 GMT
  4. x-mns-request-id: 512B2A634403E52B1956133E
  5. <?xml version="1.0" encoding="UTF-8"?>
  6. <Error xmlns="http://mns.aliyuncs.com/doc/v1/">
  7. <Code>InvalidArgument</Code>
  8. <Message>Date header is invalid or missing.</Message>
  9. <RequestId>7E1A5CF258F535884403E533</RequestId>
  10. <HostId>mns.cn-hangzhou.aliyuncs.com</HostId>
  11. </Error>

传入请求的时间必须在MNS服务器当前时间之后的15分钟以内,否则返回408超时。

返回示例:

  1. Content-Type: text/xml
  2. Content-Length: 283
  3. Date: Wed, 11 May 2011 09:01:51 GMT
  4. x-mns-request-id: 512B2A634403E52B1956133E
  5. <?xml version="1.0" encoding="UTF-8"?>
  6. <Error xmlns="http://mns.aliyuncs.com/doc/v1/">
  7. <Code>TimeExpired</Code>
  8. <Message>
  9. The http request you sent is expired.
  10. </Message>
  11. <RequestId>512B2A634403E52B1956133E</RequestId>
  12. <HostId>mns.cn-hangzhou.aliyuncs.com</HostId>
  13. </Error>
本文导读目录