1.3.3 签名机制

优质
小牛编辑
132浏览
2023-12-01

参与签名的信息

签名前需要拼接一下签名的原文,包括以下信息:

名称描述示例值
HTTPMethod请求类型,固定为POST,全部大写POST
Accept请求响应体类型,固定值application/json
Content-MD5与请求Header中相同
Content-Type请求响应体类型,固定值application/text; charset=UTF-8
ext预留字段,暂时为空
Url请求的路径(不包含域名部分),详情见下面说明

拼接方式:

HTTPMethod + "\n" + 
Accept + "\n" + 
Content-MD5 + "\n" 
Content-Type + "\n" + 
ext + "\n" + 
Url

注意: 如果除Url以外,信息为空也时需要添加换行符”\n”

拼接结果举例:

POST
application/json
WexLprqKNf8bWCLObiw9Iw==
application/text; charset=UTF-8

/v1/gateway/loan_app.app.stsQuery

签名算法

Mac hmacSha256 = Mac.getInstance("HmacSHA256");
byte[] keyBytes = secret.getBytes("UTF-8");
hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, "HmacSHA256"));
String sign = new String(Base64.encodeBase64(Sha256.doFinal(stringToSign.getBytes("UTF-8")),"UTF-8"));

secret 为 APP 的密钥,联系对接专员获取。

签名错误排查方法

当签名校验失败时,会将服务端的签名前原文放到 HTTP Response 的 Header 中返回到客户端,Key为:X-Ca-Error-Message,只需要将本地计算的签名前原文与服务端返回的签名前原文进行对比即可找到问题; 例如:

X-Ca-Error-Message=Invalid Signature, Server StringToSign:POST#application/json#BF1TIG9npPtL5ynNshx2yQ==#application/text; charset=UTF-8##/v1/gateway/loan_app.app.stsQuery

如果服务端与客户端的签名前原文一致,请检查用于签名计算的密钥是否正确;

注意: 因为 HTTP Header 中无法表示换行,因此签名前原文中的换行符都被过滤掉了,对比时请忽略换行符