一、获取AKSK
- 登录CDN+ IAM,地址:vip.ctcdn.cn 。
- 在个人中心AccessKey管理页面,点击新增按键。
- 选择对应的工作区并确定,此时你可以查看到AccessKey已生成。
- 选中密钥,点击查看。为保障安全,需要填写手机验证码。验证通过后,点击显示SK,即可查看详情,并支持复制和发送邮箱操作。
二、在http_client的请求头增加3个字段,分别是eop-date、ctyun-eop-request-id、Eop-Authorization。
1.构造eop-date 。该字段的格式是“yyyymmddTHHMMSSZ”,即:年月日T时分秒Z”,示例:eop-date:20211221T163614Z。
2.构造ctyun-eop-request-id 。该字段是uuid,32位随机数。示例:27cfe4dc-e640-45f6-92ca-492ca73e8680
3.构造Eop-Authorization 。按以下步骤进行:
步骤一:构造代签字符串sigture 。
sigture = 需要进行签名的Header排序后的组合列表+ " \n " + 排序的query + " \n " +toHex(sha256(原封的body))
1)需要进行签名的Header排序后的组合列表:将ctyun-eop-request-id、eop-date以 “header_name:header_value”的形式、以“\n ”作为每个header的结尾符、以英文字母表作为header_name的排序依据将它们拼接起来。
注意注意:EOP强制要求ctyun-eop-request-id、eop-date必须进行签名。其他字段是否需要签名看自身需求。
2)排序的query:query以&作为拼接,key和值以=连接,排序规则使用26个英文字母的顺序来排序,Query参数全部都需要进行签名
3)toHex(sha256(原封的body)):传进来的body参数进行sha256摘要,对摘要出来的结果转十六进制
示例1:
假设query 为空 ,原封body内容:{"product_code": "008", "tag_group": "Ypp-group_1702950925", "tag": "1702950925-yPP_tag-1"}
需要进行签名的Header排序后的组合列表为:
1)ctyun-eop-request-id:27cfe4dc-e640-45f6-92ca-492ca73e8680
2)eop-date:20220525T160752Z
3)body参数做sha256摘要后转十六进制为:59fc6acc115298cbac86cb188f995f7804ff6633a6d6e87acab7a9131bdabc66
则sigture为:
ctyun-eop-request-id:27cfe4dc-e640-45f6-92ca-492ca73e8680\neop-date:20220525T160752Z\n\n\n59fc6acc115298cbac86cb188f995f7804ff6633a6d6e87acab7a9131bdabc66
示例2:
假设query 为:aa=1&bb=2 ,原封body内容为空
需要进行签名的Header排序后的组合列表为:
1)ctyun-eop-request-id:27cfe4dc-e640-45f6-92ca-492ca73e8680
2)eop-date:20220525T160752Z
3、body参数做sha256摘要后转十六进制为:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
则sigture为:
ctyun-eop-request-id:27cfe4dc-e640-45f6-92ca-492ca73e8680\neop-date:20220525T160930Z\n\naa=1&bb=2\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
步骤二:构造动态秘钥kdate 。
1)eop-date:yyyymmddTHHMMSSZ(20211221T163614Z)(年月日T时分秒Z)
2)Ktime:使用eop-date作为数据,sk作为密钥,算出ktime。 Ktime = hmacSha256(eop-date,sk)
3)kAk:使用ak作为数据,ktime作为密钥,算出kAk。 kAk = hmacsha256(ak,ktime)
4)kdate:使用eop-date的年月日值作为数据,kAk作为密钥,算出kdate。 kdate = hmacsha256(eop-date,kAk)
步骤三: 构造Signature 。使用kdate作为密钥、sigture作为数据,将其得到的结果进行base64编码得出Signature
Signature构造签名的方法:
1)hmacsha256(sigture,kdate)
2)将上一步的结果进行base64加密得出Signature
步骤四:构造Eop-Authorization 。
1)Headers:将需要进行签名的请求头字段以 “header_name”的形式、以“;”作为间隔符、以英文字母表作为header_name的排序依据将它们拼接起来。 假设需要将ctyun-eop-request-id、eop-date进行签名,则Headers= ctyun-eop-request-id;eop-date。
2)Eop-Authorization值为:ak Headers=xxx Signature=xxx。
注意ak、Headers、Signature之间以空格隔开。 例如:Eop-Authorization:ak Headers=ctyun-eop-request-id;eop-date Signature=Zq0Wodhwa7ShCKhQWy49MoOm3r6/tB1rBTlp+vjRkSY=
如果需要进行签名的Header不止默认的ctyun-eop-request-id和eop-date,那么需要在http_client的请求头部中加上,并且Eop-Authorization中也需要增加。
三、 签名示例
{
"host": "cdnapi-global.ctapi.ctyun.cn",
"Eop-date": "20211221T163614Z",
"ctyun-eop-request-id": "27cfe4dc-e640-45f6-92ca-492ca73e8680",
"Eop-Authorization": "e3e86563b0548543c128bcd2ea998167 Headers=ctyun-eop-request-id;eop-date Signature=Zq0Wodhwa7ShCKhQWy49MoOm3r6/tB1rBTlp+vjRkSY=",
"Content-Type": "application/json;charset=UTF-8"
}