2.3 密钥与签名
接口加签,是指应用在调用基础营销平台接口时,需要通过密钥或证书对消息内容进行加签、验签,从而保证双方通信消息的安全性和真实性。
2.3.1名词解释
对接私钥:用来给应用消息进行签名,请务必要妥善保管,避免遗失或泄露。商家自行生成并保存,无需提供给基础营销平台。
对接公钥:需要提供给基础营销平台开放平台,平台会对应用发送的消息进行签名验证。机构登录基础营销平台商家平台进行配置
平台公钥:应用收到基础营销平台的同步应答消息或者异步通知消息时,使用基础营销平台公钥验证签名信息。
签名方式:签名的算法,基础营销平台平台展示只支持两种,RSA256(SHA-256 with RSA)或者SM2国密签名算法
请求签名:商户需要使用自身的对接私钥按照基础营销平台签名规范对API URL、消息体等关键数据的组合进行签名。请求的签名信息通过HTTP头Authorization 传递,具体说明请见签名生成规范。没有携带签名或者签名验证不通过的请求,返回签名验证失败
应答签名:对于签名验证成功的请求,基础营销平台会使用基础营销平台的平台私钥对应答进行签名。机构需使用基础营销平台平台公钥根据签名验证规范进行应答消息的验签。签名的信息包含在HTTP头部中,具体说明请见签名验证规范。
2.3.2 签名规范
2.3.2.1签名机制
基础营销平台开放平台的应用管理体系,使用了公私钥的机制对请求进行加签,防止数据篡改,以此来保障商家应用和基础营销平台交互的安全性。
2.3.2.2签名生成流程
(1)构造认证串 authString。
(2)构造待签名内容。
(3)计算签名。
(4)将签名信息添加到请求。
步骤一、构造认证串 authString
authString 为认证字符串,其中包括认证身份信息和必要的安全信息,基础营销平台将根据该字段中的信息对请求进行身份认证和安全检查,校验失败则基础营销平台会拒绝处理请求
规则说明:
authString 由 key=value 形式组成, 多组 keyValue 通过逗号隔开,对参数顺序无要求。基础营销平台会按上述格式解析该字符串,获取必要的认证参数。对于非必选 key,若未使用到则不需要传递对应的 key
appid=${appid}, nonce=${nonce},reqtime=${ reqtime }
参数说明:
appid:对接方appid,由营销平台生成
nonce:随机字符串,每次请求独立生成
reqtime:请求系统时间,时间单位为毫秒,long型
步骤二、构造待签名内容
签名content按照以下规则拼接成字符串:
${authString}\n
${httpReuqestUrl}\n
${httpRequestBody}\n
签名串一共有三行,每一行为一个参数。行尾以 \n(换行符,ASCII编码值为0x0A)结束,包括最后一行。如果参数本身以\n结束,也需要附加一个\n
字段说明:
authString: 步骤一中生成的认证串 authString。
httpReuqestUrl:本次请求的uri 信息,不包括域名,例如 /dsktapi/mpmapi/getcouplist
httpRequestBody:本次请求的 body 内容。当使用GET等请求时,body 为空,该值传入空字符串,即""。
步骤三、计算签名
目前支持的签名算法为 SHA256withRSA 和 SM3WithSM2 两种,计算逻辑为: 使用签名算法对上文中得到的 content 计算签名,得到 byte 数组,然后将 byte 数组通过 Base64 方法编码得到字符串
步骤四、将签名信息添加到请求
要求请求通过HTTP Authorization头来传递签名。 Authorization由认证类型和签名信息两个部分组成。
Authorization: ${signtype} ${authString},sign=${signature}
注意签名算法和 authString 之间为空格分隔,authString 和 sign 使用逗号分隔
字段说明:
signtype: 签名算法,计算签名时使用的算法,目前支持的签名算法为 RSA256(即:SHA256withRSA) 和 SM2(即SM3WithSM2) 两种
authString:步骤一生成的认证信息串
sign:步骤三生成的签名值
2.3.3 验签规范
2.3.3.1验签机制
机构请求的同步应答或者基础营销平台开放平台的异步通知,会带上签名信息,以防止数据篡改,以此来保障机构应用和基础营销平台交互的安全性。机构需要对平台返回的签名信息进行签名校验
2.3.3.2 签名生成流程
(1)从请求头获取签名要素
(2)构造待签名内容。
(3)验证签名。
步骤一、从请求头获取签名要素
timestamp:请求时间,从请求头mkt-timestamp读取
nonce:随机字符,从请求头mkt-nonce读取
signtype:签名方式,请求头mkt-signtype读取,支持RSA256和SM2
sign:签名内容,从请求头mkt-signature读取
步骤二、构造待签名内容
签名content按照以下规则拼接成字符串:
${timestamp}\n
${nonce}\n
${httpRequestBody}\n
签名串一共有四行,每一行为一个参数。行尾以 \n(换行符,ASCII编码值为0x0A)结束,包括最后一行。如果参数本身以\n结束,也需要附加一个\n
字段说明:
httpRequestBody:本次请求的 body 内容。当使用GET等请求时,body 为空,该值传入空字符串,即""。
步骤三、验证签名
目前支持的签名算法为 RSA256(SHA256withRSA) 和 SM2(SM3WithSM2) 两种。
使用基础营销分配的验签公钥将步骤一获取的签名信息和步骤二生成签名明文进行验签.
2.3.3.3 签名密钥
验签RSA公钥
测试环境
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAofEtdePjwQuIkyjb7hKz4NaPCi8K2MPZfy0R0d/Z3x18nimBtp1n/c49LZcUUd5BVD+0Vf0rJGCjQGV2/9KYQ2qUCe3ML2A00Tn2CfngB5K70ro+T9t1pS62aMNJmQv6qPCw4VqLHHfJTCrRWdjiXD1RainmdU0x0hnOEyBdW8XfpgOT3h+C1IyoqMdt3zERtdAsuNVytOXiA5nWmFQ2w46MtR2Ru0Fowpx0toAv0feRDM8tfBRDPBl7PgmAiomVUxfODSk+iTrg4ZICHvKIqVdmwMkkEPpPA3IypSaAnVjl+Qg/5z67JyTzt+VL7IOvb7qd6Aam/NEUOmq5Utg1ywIDAQAB
生产环境
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv/ChEaVb7ehsp2jT3i+VbAkiR3KYMPod9UzH3Dr1A9lRFxhBGEDACrClkCUMuzDHAo6EsUs7xVG4MSmqvyiaoFdXyFRMbTVyRzJbyqCbbIF9oZzRgVdIOPWoZCSRVLpVYC/er48hVHQwb/D10pVuivhaxDlfzFdnlalDWSqByxxEone5rKSTAL3WzE+JE5uzYXY6wctXN9vYYZzFO/bRE9S4Rlqi5p+AlzFz8hnuQ7WkPwGsP3fnkx6N9maj85dk24JTjWFfKQMM+jJgteT0rePBDWIZ58RW0P1IZkAmjoQLCZcuwtObyciYHFBty9Jrw/HyjNugRBzkxTX01VC/LQIDAQAB
验签SM2公钥
测试环境
MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEtHQK6HATcrGGXKokXsTMrQpVnr65oARzn2jDeF1knnAbtVfAdfLdSSJ/hDCw6lOSC8+KLktTrbsFL9w4EdThog==
生产环境
MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE7EcwV+S9Lh1z3NolYDyAnSg0NllGh1tYFj2XcMjWbBgOeK1b7vfO67vcu+BWFeJGmO4GjGDgRsK9qXTH8G+Ydw==