一、获取ak、sk
- 登录CDN+IAM。
- 在个人中心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位随机数。
3.构造Eop-Authorization 。按以下步骤进行:
3.1构造代签字符串sigture 。sigture = 需要进行签名的Header排序后的组合列表+ " \n " + 排序的query + " \n " +
toHex(sha256(原封的body))
需要进行签名的Header排序后的组合列表 | 将ctyun-eop-request-id、eop-date以 “header_name:header_value”的形式、以“\n ”作为每个header的结尾符、以英文字母表作为header_name的排序依据将它们拼接起来。 注意:EOP强制要求ctyun-eop-request-id、eop-date必须进行签名。其他字段是否需要签名看自身需求。 例子(假设你需要将ctyun-eop-request-id、eop-date、host都要签名): ctyun-eop-request-id:123456789\neop-date:20210531T100101Z\n |
---|---|
排序的query | query以&作为拼接,key和值以=连接,排序规则使用26个英文字母的顺序来排序,Query参数全部都需要进行签名 |
toHex(sha256(原封的body)) | 传进来的body参数进行sha256摘要,对摘要出来的结果转十六进制 |
sigture 示例1 (假设query 为空 、需要进行签名的Header排序后的组合列表为“ctyun-eop-request-id:27cfe4dc-e640-45f6-92ca-492ca73e8680**\n eop-date:20220525T160752Z \n**”、body参数做sha256摘要后转十六进制为e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855):
ctyun-eop-request-id:27cfe4dc-e640-45f6-92ca-492ca73e8680**\n eop-date:20220525T160752Z \n\n\n**e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
sigture 示例2 (假设query 不为空 、需要进行签名的Header排序后的组合列表为“ctyun-eop-request-id:27cfe4dc-e640-45f6-92ca-492ca73e8680**\n eop-date:20220525T160752Z \n**”、body参数做sha256摘要后转十六进制为e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855):
ctyun-eop-request-id:27cfe4dc-e640-45f6-92ca-492ca73e8680**\n eop-date:20220525T160930Z \n\n**aa=1&bb=2**\n**e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
3.2 构造动态秘钥kdate 。
3.2.1 使用eop-date作为数据,sk作为密钥,算出ktime。
3.2.2 使用ak作为数据,ktime作为密钥,算出kAk。
3.2.3 使用eop-date的年月日值作为数据,kAk作为密钥,算出kdate。
eop-date | yyyymmddTHHMMSSZ(20211221T163614Z)(年月日T时分秒Z) |
---|---|
Ktime | 使用eop-date作为数据,sk作为密钥,算出ktime。 Ktime = hmacSha256(eop-date,sk) |
kAk | 使用ak作为数据,ktime作为密钥,算出kAk。 kAk = hmacsha256(ak,ktime) |
kdate | 使用eop-date的年月日值作为数据,kAk作为密钥,算出kdate。 kdate = hmacsha256(eop-date,kAk) |
3.3 构造Signature 。使用kdate作为密钥、sigture作为数据,将其得到的结果进行base64编码得出Signature
Signature | 1)hmacsha256(sigture,kdate) 2)将上一步的结果进行base64加密得出Signature |
---|
3.4 构造Eop-Authorization 。
3.4.1 构造Headers。
3.4.2得到Eop-Authorization。
Eop-Authorization:ak Headers=xxx
Signature==xxx。
Headers | 将需要进行签名的请求头字段以 “header_name”的形式、以“;”作为间隔符、以英文字母表作为header_name的排序依据将它们拼接起来。 例子(假设你需要将ctyun-eop-request-id、eop-date都要签名):Headers= ctyun-eop-request-id;eop-date |
---|---|
Eop-Authorization | Eop-Authorization:ak Headers=xxx Signature=xxx。注意,ak、Headers、Signature之间以空格隔开。 例如:Eop-Authorization:ak Headers=ctyun-eop-request-id;eop-date Signature=NlMHOhk5bVfZ9MwDSSJydcZjjENmDtpNYigJGVb 注意:如果你需要进行签名的Header不止默认的ctyun-eop-request-id和eop-date,那么你需要在http_client的请求头部中加上,并且Eop-Authorization中也需要增加 |
三、 签名示例。