移动开发平台 mPaaS 密钥管理

By | 2021年4月23日

为了提高 MPS 与用户系统之间的交互的安全性,MPS 会对所有的服务端接口进行加签与验证,并且提供了密钥管理界面,供您进行密钥配置。

  • 推送 API 接口配置

    MPS 提供 REST 接口供您调用。为确保安全性,MPS 需要对调用者的身份进行验证。在调用 API 之前,您需要使用 RSA 算法,对请求进行签名,并在消息推送的控制台的 密钥管理 界面上的 推送 API 接口配置 区域内,配置密钥,供 MPS 验证调用者身份所用。

  • 推送回调接口配置

    若您需要获取消息下发结果的回执,则需要在 控制台 密钥管理 页面上的 推送回调接口配置 区域中,配置 MPS 回调时用到的 REST 接口地址,并获取公钥。MPS 在回调用户接口时,会对请求参数进行签名。您需要使用获取的公钥,对请求进行验签,以验证是否为 MPS 回调。

配置推送 API 接口

前置条件

进行推送 API 接口配置时,您需要先使用 RSA 算法生成 2048 位公钥。

  • RSA 公钥生成方法如下:
    1. 通过 OpenSSL 官网 下载并安装 OpenSSL 工具(1.1.1 或以上版本)。
    2. 打开 OpenSSL 工具,使用以下命令行生成 2048 位的 RSA 私钥。
            
      1. openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
    3. 根据 RSA 私钥生成 RSA 公钥。
            
      1. openssl rsa -pubout -in private_key.pem -out public_key.pem
  • 算法签名规则如下:
    • 使用 SHA 256 签名算法。
    • 将签名结果转换成 base64 字符串。
    • 将 base64 字符串中的 + 替换为 -/ 替换为 -,得到最终签名结果。

操作步骤

登录 mPaaS 控制台,选择 App,通过以下步骤,配置推送接口:

  1. 在左侧导航栏中,选择 后台服务管理 > 消息推送,进入 消息推送 页面。
  2. 在右侧页面上,点击 密钥管理 标签,进入密钥管理页面。
  3. 点击 推送 API 接口配置 区域右上角的 配置,页面上展示配置入口,如下图所示。

    推送 API 配置

    字段 是否必填 说明
    状态 推送接口的可调用状态。打开开关,即可调用 MPS 提供的接口;关闭开关,则不能调用 MPS 提供的接口。
    调用接口加密方式 仅可选 RSA 算法。
    RSA 算法公钥 填写 2048 位公钥。
    使用私钥对请求参数进行签名后,MPS 使用公钥对签名后的请求参数进行解密,验证调用者身份。
    重要:确保公钥填写正确无空格,否则将导致调用接口失败,调用接口说明参见
    API 参考
  4. 点击 确定 按钮,保存配置。

配置推送回调接口

登录 mPaaS 控制台,选择 App,通过以下步骤,配置推送回调接口:

  1. 在左侧导航栏中,选择 后台服务管理 > 消息推送,进入 消息推送 页面。
  2. 在右侧页面上,点击 密钥管理 标签,进入密钥管理页面。
  3. 点击 推送回调接口配置 区域右上角的 配置,页面上展示配置入口,如下图所示。

    密钥配置——回调

    字段 是否必填 说明
    状态 回调状态。打开开关,移动推送核心将根据配置,给用户服务端回执;关闭开关,移动推送核心将不给用户服务端回执。
    回调接口 URL 地址 填写回调接口地址,应为公网可访问的 HTTP 请求地址。MPS 对 POST 请求体以私钥进行签名,将签名后的内容作为 sign 参数进行回调。
    回调接口加密方式 MPS 使用 RSA 算法对 POST 请求体进行签名。
    RSA 算法公钥 系统自动填写,您无法修改。用户服务端获取 POST 请求体和 sign 参数后,使用公钥验证是否为 MPS 请求,确保数据传输过程中未被篡改,关于回调验签的说明,参见 API 参考 > HTTP 调用
  4. 点击 确定 按钮,保存配置。
    说明:使用不同渠道推送消息时,移动推送核心回调时机不同,具体如下所示。

    • 三方渠道(FCM/APNs/小米/华为/OPPO/vivo):调用三方服务成功时,发起回调。
    • 自建渠道:推送消息成功时,发起回调。

代码示例

  
  1. /**
  2. * Alipay.com Inc. Copyright (c) 2004-2020 All Rights Reserved.
  3. */
  4. package com.callback.demo.callbackdemo;
  5. import com.callback.demo.callbackdemo.util.SignUtil;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.web.bind.annotation.RequestBody;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import org.springframework.web.bind.annotation.RequestMethod;
  10. import org.springframework.web.bind.annotation.RequestParam;
  11. /**
  12. *
  13. * @author yqj
  14. * @version $Id: PushCallbackController.java, v 0.1 2020年03月22日 11:20 AM yqj Exp $
  15. */
  16. @Controller
  17. public class PushCallbackController {
  18. /**
  19. * 拷贝控制台中推送回调接口配置的RSA 算法公钥
  20. */
  21. private static final String pubKey = "";
  22. @RequestMapping(value = "/push/callback" ,method = RequestMethod.POST)
  23. public void callback(@RequestBody String callbackJson, @RequestParam String sign) {
  24. System.out.println(sign);
  25. //验签
  26. sign = sign.replace('-','+');
  27. sign = sign.replace('_','/');
  28. if(!SignUtil.check(callbackJson,sign,pubKey,"UTF-8")){
  29. System.out.println("验签失败");
  30. return;
  31. }
  32. System.out.println("验签成功");
  33. //json 消息体
  34. System.out.println(callbackJson);
  35. }
  36. }

callbackJson 为消息请求体,为 JASON 格式,参考如下:

  
  1. {
  2. "extInfo":{
  3. "adToken":"da64bc9d7d448684ebaeecfec473f612c57579008343a88d4dbdd145dad20e84",
  4. "osType":"ios"
  5. },
  6. "msgId":"console_1584853300103",
  7. "pushSuccess":true,
  8. "statusCode":"2",
  9. "statusDesc":"Acked",
  10. "targetId":"da64bc9d7d448684ebaeecfec473f612c57579008343a88d4dbdd145dad20e84"
  11. }

下表为 callbackJson 中各字段的说明。您可以通过此链接获取回调的 回调示例代码

字段 说明
msgId 请求的业务消息 ID
pushSuccess 推送是否成功
statusCode 消息状态码
statusDesc 消息状态码对应的描述
targetId 目标 ID

请关注公众号获取更多资料

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注