信息的获取
登录云网门户,在“控制台”->“个人中心”->“安全设置”,通过创建或者查看获取ak,sk。
基本签名过程
1、构造规范请求。将待发送的请求内容按照与EOP约定的规则组装,确保客户端签名、EOP认证时使用的请求内容一致。
2、使用规范请求和其他信息创建待签字符串。
3、使用HEADER、ctyun-eop-sk、ctyun-eop-ak来创建Hmac算法的密钥
4、使用第三步的密钥和待签字符串在通过hmacsha256来计算签名。
5、将生成的签名信息作为请求消息头添加到HTTP请求的header中。
创建待签名字符串
待签名字符串的构造规则如下:
需要进行签名的Header排序后的组合列表(键和值)+ "\n" + "排序的query" + "\n" + toHex(sha256(原封的body))
1、header 以 header_name:header_value来一个一个通过\n拼接起来,并非是把所有header都加进来做待签名字符串,而是你需要把哪些Header作为待签名字符串,EOP是强制要求eop-date这个头作为Header中的一部分,并且必须是待签名Header里的一个。 先将需要进行签名算法的Header提取出来,将它们的header_name以26个英文字母的顺序来排序,将排序后得到的列表进行遍历组装成待签名的header。 假设你需要将eop-date,host都要签名,则待签名的header构造出来是: eop-date:20210531T100101Z\nhost:1.1.1.1:9080\n;eop-date和host的排序就是这个顺序,如果你加入一个ccad的header;同时这个header也要是进行签名,则待签名的header组合:ccda:123\n eop-date:20210531T100101Z\nhost:1.1.1.1:9080\n。
2、query和header是一样的,只是它不已\n为拼接,而是以&作为拼接,key和值不是:连接而是以=连接,排序规则一致。Query参数全部都需要进行签名。
3、传进来的body参数进行sha256摘要,对摘要出来的结果转十六进制。
4、经过如上三步分别得出:排序的header,排序的query,原始的body;这三个再以\n连接起来,得出待签名的字符串。
构造动态密钥
发起请求时,需要构造一个eop-date的时间,这个时间的格式是yyyymmddTHHMMSSZ;言简意赅一些,就是年月日T时分秒Z
1、先是拿你申请来的ctyun-eop-sk作为密钥,eop-date作为数据,算出ktime;Ktime = hmacSha256(sk, eop-date)
2、拿ktime作为密钥,你申请来的ctyun-eop-ak数据,算出kAk;kAk = hmacsha256(ktime,ctyun-eop-ak)
3、拿kAk作为密钥,eop-date的年月日值作为数据;算出kdate
签名的使用
由“构造动态秘钥”和“创建待签名字符串”分别的出来的待签名字符串string_sigture、kdate;再根据hmacsha256(kdate,string_sigture)得出的结果,再将结果进行base64编码得出Sigture;
然后将数据整合成HEADER放在http_client内,发出即可。
HEADER名称为Eop-Authorization;值是你的ctyun-eop-ak Header=你构造待签名字符串时的header排序;Signature=你算来的Sigture值。
例子所述:你待签名的字符串header顺序是 eop-date和host;那么你加到header里的值就是Eop-Authorization: {ctyun-eop-ak} Header=eop-date;host Signature=xad01/ada。