信息的获取
登录云网门户,在“控制台”->“账号中心”->“安全设置”->“用户AccessKey”点击“查看”获取。
基本签名流程
ctyun-eop-ak/ctyun-eop-sk基本签名流程:
- 待签字符串:使用规范请求和其他信息创建待签字符串。
- 计算密钥:使用header、ctyun-eop-sk、ctyun-eop-ak来创建hmac算法的密钥。
- 计算签名:使用第三步的密钥和待签字符串在通过hmacsha256来计算签名。
- 签名应用:将生成的签名信息作为请求消息头添加到HTTP请求中。
创建待签名字符串
待签名字符串的构造规则如下:
待签名字符串=需要进行签名的header排序后的组合列表+ "\n" + 排序的query + "\n" + toHex(sha256(原封的body))
需要进行签名的header排序后的组合列表(排序的header) | header 以 header_name:header_value来一个一个通过\n拼接起来,EOP是强制要求ctyun-eop-request-id和eop-date这个头作为header中的一部分,并且必须是待签名header里的一个。需要进行签名算法的header需要进行排序(将它们的header_name以26个英文字母的顺序来排序),将排序后得到的列表进行遍历组装成待签名的header。 |
---|---|
排序的query | query以&作为拼接,key和值以=连接,排序规则使用26个英文字母的顺序来排序,Query参数全部都需要进行签名 |
toHex(sha256(原封的body)) | 传进来的body参数进行sha256摘要,对摘要出来的结果转十六进制 |
排序的header例子:
- 假设你需要将ctyun-eop-request-id、eop-date、host都要签名,则待签名的header构造出来是:
ctyun-eop-request-id:123456789\neop-date:20210531T100101Z\nhost:1.1.1.1:9080\n
ctyun-eop-request-id、eop-date和host的排序就是这个顺序。
- 如果你加入一个ccad的header,同时这个header也要是进行签名,则待签名的header组合:
ccad:123\nctyun-eop-request-id:123456789\neop-date:20210531T100101Z\nhost:1.1.1.1:9080\n
构造动态密钥
发起请求时,需要构造一个eop-date的时间,这个时间的格式是yyyymmddTHHMMSSZ。言简意赅一些,就是年月日T时分秒Z。
- 先是拿你申请来的ctyun-eop-sk作为密钥,eop-date作为数据,算出ktime。
- 拿ktime作为密钥,你申请来的ctyun-eop-ak数据,算出kAk。
- 拿kAk作为密钥,eop-date的年月日值作为数据,算出kdate。
eop-date | yyyymmddTHHMMSSZ(20211221T163614Z)(年月日T时分秒Z) |
---|---|
Ktime | 使用ctyun-eop-sk作为密钥,eop-date作为数据,算出ktime;Ktime = hmacSha256(ctyun-eop-sk, eop-date) |
kAk | 使用ktime作为密钥,你申请来的ctyun-eop-ak数据,算出kAk;kAk = hmacsha256(ktime,ctyun-eop-ak) |
kdate | 使用kAk作为密钥,eop-date的年月日值作为数据;算出kdate;kdate = hmacsha256(kAk, eop-date) |
签名应用及示例
由“构造动态密钥”和“创建待签名字符串”分别得出来的待签名字符串string_signature、kdate生成出Signature。
Signature | 待签名字符串string_signature、kdate;再根据hmacsha256(kdate,string_signature)得出的结果,再将结果进行base64编码得出Signature |
---|---|
Eop-Authorization | {ctyun-eop-ak}{空格}headers=你构造待签名字符串时的header排序{空格}Signature={Signature}。(注意ctyun-eop-ak后及Signature前都有一个空格)。header排序以分号”;”拼接。例子:你待签名的字符串header顺序是 eop-date和host;那么你加到header里的值就是Eop-Authorization: {ctyun-eop-ak} Headers=eop-date;host Signature=xad01/ada |
由上得到Eop-Authorization,然后将数据整合成header放在http_client内,发出即可。
http_client所需请求头部如下:
Eop-Authorization: ctyun-eop-ak headers=ctyun-eop-request-id;eop-date Signature=xad01/ada
eop-date:20211221T163614Z
ctyun-eop-request-id: 123456789
注意若需要进行签名的header不止默认的ctyun-eop-request-id和eop-date,需要在http_client的请求头部中加上,并且Eop-Authorization中也需要增加。