签名方法
靠谱云 OpenAPI 会对每个访问请求进行身份验证,即每个请求都需要在公共参数请求中包含签名信息(Signature)以验证请求者身份。
签名信息有安全凭证生成,安全凭证包括 AccessKeyId 和 AccessKeySecret。
1. 申请安全凭证
在第一次使用云 API 之前,请与我们联系获取安全凭证。
安全凭证包括 AccessKeyId 和 AccessKeySecret:
AccessKeyId 用于标识 API 调用者身份
AccessKeySecret 用于加密签名字符串和服务器端验证签名字符串的密钥。
用户必须严格保管安全凭证,避免泄露
2.生成签名串
2.1 对参数排序
对所有请求参数按参数名首字母顺序排序,排序参数包括公共参数和接口自定义参数,不包括公共请求参数中的 Signature参数。
以查询地域列表(DescribeRegionConfig)请求为例,当用户调用接口时,请求参数可能如下:
参数名 | 描述 | 参数值 |
---|---|---|
Action | 方法名 | DescribeRegionConfig |
Version | API版本号 | 2014-05-26 |
AccessKeyId | 访问密钥ID | pm00003fm05q |
SignatureVersion | 签名版本 | 1.0 |
Format | 请求格式 | JSON |
SignatureNonce | 签名随机值 | 971856e0-1177-4a4a-8a84-3022025c78b8 |
SignatureMethod | 签名方式 | HMAC-SHA1 |
Timestamp | 时间戳 | 2023-03-06T12:30:20Z |
RegionCode | 待查询的地域(接口参数) | demo-1 |
上述示例参数的排序结果如下:
{
"AccessKeyId":"pm00003fm05q",
"Action":"DescribeRegionConfig",
"Format":"JSON",
"RegionCode":"demo-1",
"SignatureMethod":"HMAC-SHA1",
"SignatureNonce":"971856e0-1177-4a4a-8a84-3022025c78b8",
"SignatureVersion":"1.0",
"Timestamp":"2022-06-06T12:30:20Z",
"Version":"2014-05-26"
}
2.2 参数拼接
- 编码参数。使用 UTF-8 字符集按照
RFC 3986
规则 URL 编码请求参数和参数值,也可以先用 Java 标准库中percentEncode
编码,随后将编码后的字符中加号+ 替换为 %20、星号* 替换为%2A、%7E替换为波浪号~。 使用等号= 连接编码后的请求参数和参数值。
使用与号& 连接编码后的请求参数。
拼接好的参数字符串
paramsString
如下:
AccessKeyId=pm00003fm05q&Action=DescribeRegionConfig&Format=JSON&SignatureMethod=HMAC-SHA1&SignatureNonce=971856e0-1177-4a4a-8a84-3022025c78b8&SignatureVersion=1.0&Timestamp=2022-06-06T12%3A30%3A20Z&Version=2014-05-26
2.3 构造签名字符串
构造待签名字符串
strToSign
:strToSign= HTTPMethod + "&" + //HTTPMethod:发送请求的 HTTP 方法,目前全部请求都为GET。 percentEncode("/") + "&" + //percentEncode("/"):字符(/)UTF-8 编码得到的值,即 %2F。 percentEncode(paramsString) //上面的参数字符串。
得到待签名字符串
strToSign
为:GET&%2F&AccessKeyId%3Dpm00003fm05q%26Action%3DDescribeRegionConfig%26Format%3DJSON%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D971856e0-1177-4a4a-8a84-3022025c78b8%26SignatureVersion%3D1.0%26Timestamp%3D2022-06-06T12%253A30%253A20Z%26Version%3D2014-05-26
计算 HMAC 值:
按照 RFC 2104 的定义,使用上面得到的字符串
strToSign
计算签名 HMAC 值。注:计算签名时使用的Key就是您持有的
AccessKeySecret
并加上一个"&"字符,使用的哈希算法是 SHA1。示例如下:
(示例的 AccessKeySecret 值为"Cen4w8eH7jQX6Q04x35Nie3m4yW707Xf")
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(new SecretKeySpec("Cen4w8eH7jQX6Q04x35Nie3m4yW707Xf&".getBytes("UTF-8"), "HmacSHA1"));
byte[] rawHmac = mac.doFinal(strToSign.getBytes("UTF-8"));
计算签名值:
按照 BASE64 编码规则把上一步骤中 HMAC 值
rawHmac
编码成字符串,并进行 URL 编码,即得到签名值signature
:
signature = percentEncode(Base64.encode(rawHmac);
最终值为:Ewk3rhwnazsD7eThC08qA%2Fh5pDA%3D
签名作为 Signature 参数加入到 URL 请求中,最后得到的 URL 如下:
https://openapi.kaopuyun.com/?AccessKeyId=pm00003fm05q&Action=DescribeRegionConfig&Format=JSON&SignatureMethod=HMAC-SHA1&SignatureNonce=971856e0-1177-4a4a-8a84-3022025c78b8&SignatureVersion=1.0&Timestamp=2022-06-06T12%3A30%3A20Z&Version=2014-05-26&Signature=Ewk3rhwnazsD7eThC08qA%2Fh5pDA%3D