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

背景信息

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

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

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

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

获取方式

Authorization 信息的格式为:

MQ <AccessKeyId>:<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 为 AccessKeySecret。