后端HTTP服务签名
概述
API网关支持后端HTTP服务签名验证功能,您可以创建密钥并且绑定API(请妥善保管此密钥,云API网关会对密钥进行加密存储保障密钥的安全性)。绑定后API网关到您的后端HTTP服务的请求将会添加上签名信息,您的后端HTTP服务需要读取网关的加签字符串,然后对收到的请求进行本地签名计算,比对云API网关与后端HTTP服务签名结果是否一致。
所有您定义的参数都会参与签名,包括你的业务参数、您的后端系统参数和API网关提供的系统参数。
读取云API网关签名
- 网关计算的签名会保存在Header中,Header名称:X-Ca-Proxy-Signature
- 所有参与签名的Header字段也保存在Header中,Header名称:X-Ca-Proxy-Signature-Headers
后端HTTP服务加签
组织参与加签的数据
String stringToSign=
HTTPMethod + "\n" +
Accept + "\n" +
Content-Type + "\n" +
Date + "\n" +
Headers + "\n" +
Uri + "\n" +
Content-MD5 + "\n"
计算签名
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是您在控制台创建并绑定于API的签名密钥,用于签名计算。
说明
参与签名计算的Accept、Content-Type、Date需要判断是否为空,如果为空则跳过,如:
if(Date != null){
Date + "\n" +
}
Headers
Headers指所有参与签名计算的Header的Key、Value。参与签名计算的Header的Key从X-Ca-Proxy-Signature-Headers中读取,多个Key用英文逗号分割。这里要注意参与签名计算的Header是不包含X-Ca-Proxy-Signature、X-Ca-Proxy-Signature-Headers的。
Headers组织方法:
先对所有参与签名计算的Header的Key按照字典排序,然后按照如下方式拼接:
String headers =
HeaderKey1 + ":" + HeaderValue1 + "\n"\+
HeaderKey2 + ":" + HeaderValue2 + "\n"\+
...
HeaderKeyN + ":" + HeaderValueN + "\n"
Uri
Uri指Path + Query + Body中Form参数,组织方法:
如果有Query或Form参数则加"?",然后对Query+Form参数按照字典对Key进行排序后按照如下方法拼接,如果没有Query或Form参数,则Uri = Path
String uri =
Path +
"?" +
Key1 + "=" + Value1 +
"&" + Key2 + "=" + Value2 +
...
"&" + KeyN + "=" + ValueN
注意这里Query或Form参数的Value可能有多个,多个的时候只取第一个Value参与签名计算
Content-MD5
Content-MD5是指Body的MD5值,只有当Body为Stream时才计算MD5,计算方式为:
String content-MD5 = Base64.encodeBase64(MD5(bodyStream.getbytes("UTF-8")));
注意如果body为空则Content-MD5保留为空,但是需要添加后面的"\n"