开发者社区> 问答> 正文

消息服务的Endpoint签名认证是什么?


用户可以通过推送请求Header中的 x-mns-signing-cert-url 获取签名证书,并根据相应的方法来验证该请求是否由MNS系统发出,防止恶意请求对用户造成负面影响。
在 MNS 推送请求的 Header 中,Authorization 字段的值是MNS根据待签名字符串,用 SHA1-RSA 签名算法生成签名。Endpoint 可以使用公钥对签名进行验证,具体的验证方法如下:

[backcolor=transparent]第一步:获取X509证书

在 MNS 发送给 Endpoint 的 http 请求 Header 中,x-mns-signing-cert-url 指定了签名证书的地址( Base64 编码),用户需要通过 Base64 解码,获取该签名文件 URL 地址,再从中提取出签名的公钥。

[backcolor=transparent]第二步:计算待签名字符串
[backcolor=transparent]

[backcolor=transparent]

[backcolor=transparent]第三步:Authorization 解密

对Authorization 签名字段进行 Base64 Decode 解码后,使用从第一步从证书中提取的公钥对其进行解密;

[backcolor=transparent]第四步:认证

比较第二步生成的待签名字符串与第三步解密的结果是否一致。如果一致,则表明请求来自MNS,访问合法。

[backcolor=transparent]注意事项

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

[backcolor=transparent]其他
  1. 用来签名的字符串为 UTF-8 格式;
  2. 签名的方法用 RFC 3447 (http://tools.ietf.org/html/rfc3447)中定义的 sha1WithRSAEncryption 方法;
  3. Base64 是指使用 base64 算法转码文本。

[backcolor=transparent]
[backcolor=transparent]Java示例代码
[backcolor=transparent]

[backcolor=transparent]

[backcolor=transparent]

展开
收起
轩墨 2017-10-24 15:19:31 1866 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
消息服务在Serverless中的应用 立即下载
阿里云通信战略新品发布 ——国际/港澳台消息服务 立即下载
阿里云通信战略新品发布—国际/港澳台消息服务 立即下载