签名方法

靠谱云 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
kaopuyun all right reserved,powered by GitbookUpdated Time: 2024-10-09 06:22:14

results matching ""

    No results matching ""