ctyun-eop-ak/ctyun-eop-sk基本簽名流程
1、待簽字符串:使用規范請求和其他信息創建待簽字符串;
2、計算密鑰:使用HEADER、ctyun-eop-sk、ctyun-eop-ak來創建Hmac算法的密鑰;
3、計算簽名:使用第三步的密鑰和待簽字符串在通過hmacsha256來計算簽名。
4、簽名應用:將生成的簽名信息作為請求消息頭添加到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組合:
ccda:123\n ctyun-eop-request-id:123456789\neop-date:20210531T100101Z\nhost:1.1.1.1:9080\n
構造動態密鑰
發起請求時,需要構造一個eop-date的時間,這個時間的格式是yyyymmddTHHMMSSZ;言簡意賅一些,就是年月日T時分秒Z
1、先是拿你申請來的ctyun-eop-sk作為密鑰,eop-date作為數據,算出ktime
2、拿ktime作為密鑰,你申請來的ctyun-eop-ak數據,算出kAk;
3、拿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_sigture、kdate生成出Signature;
Signature | 待簽名字符串string_sigture、kdate;再根據hmacsha256(kdate,string_sigture)得出的結果,再將結果進行base64編碼得出Signature |
Eop-Authorization | ctyun-eop-ak Header=你構造待簽名字符串時的header排序 Signature(注意中間有空格)header排序以分號”;”拼接。 例子:你待簽名的字符串header順序是 eop-date和host;那么你加到header里的值就是 Eop-Authorization: ctyun-eop-ak Header=eop-date;host Signature=xad01/ada |
由上得到Eop-Authorization,然后將數據整合成HEADER放在http_client內,發出即可。
http_client所需請求頭部如下:
Eop-Authorization: ctyun-eop-ak Header= 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中也需要增加)