云消息队列 RocketMQ 版会验证每个访问的HTTP请求。每个向云消息队列 RocketMQ 版提交的HTTP请求中都包含Authorization,Authorization又包含了签名(Signature)。本文介绍签名的生成机制。
背景信息
AccessKey ID和AccessKey Secret由阿里云官方颁发给访问者(可以通过阿里云管理控制台申请和管理),其中:
- AccessKey ID用于标识访问者的身份。
- AccessKey Secret用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密。
AccessKey ID和AccessKey Secret的获取方式,请参见创建AccessKey。
云消息队列 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。