开发者社区> 问答> 正文

消息服务 MNS的请求签名机制有哪些?

消息服务 MNS的请求签名机制有哪些?

展开
收起
保持可爱mmm 2020-03-28 23:55:46 658 0
1 条回答
写回答
取消 提交回答
  • 签名机制 AccessKeyID和AccessKeySecret由阿里云官方颁发给访问者(可以通过阿里云AK管理控制台申请和管理),其中AccessKeyId用于标识访问者的身份;AccessKeySecret是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密,只有阿里云和用户知道。 MNS服务会对每个访问的请求进行验证,每个向MNS 提交的请求,都需要在请求的header中包含签名(Authorization)。MNS通过使用 AccessKeyId和AccessKeySecret进行对称加密的方法来验证请求的发送者身份。如果计算出来的验证码和提供的一样即认为该请求是有效的;否则,MNS将拒绝处理这次请求,并返回HTTP 403错误。 您必须在HTTP请求中增加 Authorization(授权)的Head来包含签名信息,表明这个消息已被授权。格式为: Authorization: MNS AccessKeyId:Signature Authorization计算方法如下: 您可以使用签名验证工具来验证您生成的签名 。

    Authorization = base64(hmac-sha1(HTTP_METHOD + "\n" 
                + CONTENT-MD5 + "\n"     
                + CONTENT-TYPE + "\n" 
                + DATE + "\n" 
                + CanonicalizedMNSHeaders
                + CanonicalizedResource))  
    

    HTTP_METHOD表示大写的HTTP Method(例如:PUT、GET、POST、DELETE)。 Content-Md5表示请求内容数据的MD5值。如果请求的Header中没有传Content-MD5,则此处填入空串。 CONTENT-TYPE表示请求内容的类型。 DATE表示此次操作的时间,不能为空,目前只支持GMT格式,如果请求时间和MNS服务器时间相差超过15分钟,MNS会判定此请求不合法,返回400错误,错误信息及错误码详见错误响应格式。格式为:Thu, 07 Mar 2012 18:49:58 GMT。如果用x-mns-date替代DATE,则DATE不能填空,需用x-mns-date的值替换。 CanonicalizedMNSHeaders表示HTTP中的x-mns-开始的字段组合。(见下文注意事项)

    说明 CanonicalizedMNSHeaders(即x-mns-开头的head)在签名验证前需要符合以下规范: head的名字需要变成小写; head自小到大排序; 分割head name和value的冒号前后不能有空格; 每个Head之后都有一个\n,如果没有以x-mns-开头的head,则在签名时CanonicalizedMNSHeaders就设置为空。 CanonicalizedResource表示HTTP所请求资源的URI。如示例中:/queues/$queueName?metaOverride=true。

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

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

    返回示例 如果传入的AccessKeyId不存在或inactive,返回403 Forbidden。 返回示例一

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

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

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

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

    Content-Type: text/xml
    Content-Length: 283
    Date: Wed, 11 May 2011 09:01:51 GMT
    x-mns-request-id: 512B2A634403E52B1956133E
    
    <?xml version="1.0"  encoding="UTF-8"?>
    <Error xmlns="http://mns.aliyuncs.com/doc/v1/">
    <Code>TimeExpired</Code>
    <Message>    
            The http request you sent is expired.
    </Message>    
    <RequestId>512B2A634403E52B1956133E</RequestId>
    <HostId>mns.cn-hangzhou.aliyuncs.com</HostId>
    </Error>           
    
    2020-03-28 23:57:43
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
RocketMQ Client-GO 介绍 立即下载
RocketMQ Prometheus Exporter 打造定制化 DevOps 平台 立即下载
基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台 立即下载