消息队列RocketMQ版会验证每个访问的HTTP请求。每个向消息队列RocketMQ版提交的HTTP请求中都包含Authorization,Authorization又包含了签名(Signature)。本文介绍签名的生成机制。

背景信息

AccessKey ID和AccessKey Secret由阿里云官方颁发给访问者(可以通过阿里云管理控制台申请和管理),其中:

  • AccessKey ID用于标识访问者的身份。
  • AccessKey Secret用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密。

消息队列RocketMQ版提供的HTTP服务通过使用AccessKey ID和AccessKey Secret进行对称加密的方法来验证请求的发送者身份。如果计算出来的验证码和提供的一样,即认为该请求是有效的;否则,将拒绝处理这次请求,并返回HTTP 403错误。

您必须在HTTP请求中增加Authorization的Header来包含签名信息,表明这个消息已被授权。

获取方式

Authorization信息的格式为:

MQ <AccessKey ID>:<Signature>

Signature的生成方式如下所示。

Signature = base64(hmac-sha1(HTTP_METHOD + "\n"
                + "\n"+ CONTENT-TYPE + "\n"
                + DATE + "\n"
                + "x-mq-version:" + MQVersion + "\n"
                + CanonicalizedResource))       
  • HTTP_METHOD:表示大写的HTTP Method(如PUT、GET、POST、DELETE)。
  • CONTENT-TYPE:表示请求内容的类型,即为text/xml; charset=utf-8。
  • DATE:表示此次操作的时间,不能为空,目前只支持GMT格式,示例:Thu, 07 Mar 2012 18:49:58 GMT。
  • MQVersion:表示消息队列RocketMQ版接口的版本号,当前版本即为2015-06-06。
  • CanonicalizedResource:表示HTTP所请求资源的URI(统一资源标识符),如消费请求的URI /topics/abc/messages?consumer=GID_abc。
说明
  • 用来签名的字符串为UTF-8格式。
  • 签名的方法用RFC 2104中定义的HMAC-SHA1方法,其中Key为AccessKey Secret。