ECSAPI中Signature錯誤的排查方法
Signature的生成方法
將get中提交的引數(除了aks以外所有的引數)按照一定的組成規則拼成一個字串,前面再加上GET&/&組成StringToSign,然後對StringToSign做 HMAC計算,以Access Key Secret+一個“&”號為HMAC計算的key,最終算出的字串就是Signature。
排查思路
若碰到反饋Signature錯誤,可以排查以下幾點:
- 在構造“StringToSign”時是否對key值做了A-Z的字典排序
- 是否將所有的引數都放入了StringToSign
- 計算前是否對StringToSign中的值做了urlencode,即將一些特殊的字元替換成類似%3D這樣的字串,如“=”需要替換成“%3D”,“/”要替換成“%2F”等,參見下述說明:
a、 對於字元 A-Z、a-z、0-9 以及字元“-”、“_”、“.”、“~”不編碼;
b、 對於其他字元編碼成 “%XY” 的格式,其中 XY 是字元對應 ASCII 碼的 16 進製表示。比如英文的雙引號(”)對應的編碼就是 %22
c、 對於擴充套件的 UTF-8 字元,編碼成 “%XY%ZA…” 的格式;
d、 需要說明的是英文空格( )要被編碼是 %20,而不是加號(+)。
- 是否使用了指定的演算法,目前Signature需要使用HMAC-SHA1演算法,在Java中通過Mac mac = Mac.getInstance(“HmacSHA1”);來獲得HMAC-SHA1演算法的物件
- 檢查HMAC-SHA1運算時是否是將Access Key Secret+&作為key(如Access Key Secret為abc,那麼使用“abc&”作為運算的key),運算過程編碼使用UTF-8編碼
以下是一個例子
1、 比如說要查詢可用的映象,先加入除了Signature以外所有的引數(值被忽略):
[ImageOwnerAlias, SignatureVersion, Action, Format, PageSize, SignatureNonce, Version, AccessKeyId, SignatureMethod, RegionId, Timestamp]
2、 對它們進行字典排序:
[AccessKeyId, Action, Format, ImageOwnerAlias, PageSize, RegionId, SignatureMethod, SignatureNonce, SignatureVersion, Timestamp, Version]
3、 挨個將它們拼接在一起(注意這個時候Timestamp中的值就已經經過了urlencode了,將“:”替換為“%3A”):
AccessKeyId=6olc8au16tjr574v222c923p&Action=DescribeImages&Format=XML&ImageOwnerAlias=system&PageSize=10&RegionId=cn-hangzhou&SignatureMethod=HMAC-SHA1&SignatureNonce=352f98b6-5fbe-489c-b8a4-5d484939a8d5&SignatureVersion=1.0&Timestamp=2015-09-12T07%3A45%3A58Z&Version=2014-05-26
4、 在前面加上GET&/&:
GET&/&AccessKeyId=6olc8au16tjr574v222c923p&Action=DescribeImages&Format=XML&ImageOwnerAlias=system&PageSize=10&RegionId=cn-hangzhou&SignatureMethod=HMAC-SHA1&SignatureNonce=352f98b6-5fbe-489c-b8a4-5d484939a8d5&SignatureVersion=1.0&Timestamp=2015-09-12T07%3A45%3A58Z&Version=2014-05-26
5、 再對整個字串做urlencode,可以看到其中的“/”、“=”和引數鍵值對中的“&”都已經被替換,注意最前面的GET之後的兩個“&”並沒有被替換:
GET&%2F&AccessKeyId%3D6olc8au16tjr574v222c923p%26Action%3DDescribeImages%26Format%3DXML%26ImageOwnerAlias%3Dsystem%26PageSize%3D10%26RegionId%3Dcn-hangzhou%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D352f98b6-5fbe-489c-b8a4-5d484939a8d5%26SignatureVersion%3D1.0%26Timestamp%3D2015-09-12T07%253A45%253A58Z%26Version%3D2014-05-26
6、 然後構造HMAC運算的key,很簡單,將Access Key Secret再加上一個“&”即可:
IamAccessKeySecret&
7、 扔給電腦做HMAC-SHA1運算,然後算出來一個最終的字串:
53wPekiWxh45TgPxVb4bkXrzZ6M=
8、 這個字串就是最終的Signature值,然後將其加入到HTTP get請求中,組成最終的get引數字串,特別要注意Signature加入後需要確認其中的特殊符號如“=”是否被轉換為%xx的字串。
ImageOwnerAlias=system&SignatureVersion=1.0&Action=DescribeImages&Format=XML&PageSize=10&SignatureNonce=352f98b6-5fbe-489c-b8a4-5d484939a8d5&Version=2014-05-26&AccessKeyId=6olc8au16tjr574v222c923p&Signature=53wPekiWxh45TgPxVb4bkXrzZ6M%3D&SignatureMethod=HMAC-SHA1&RegionId=cn-hangzhou&Timestamp=2015-09-12T07%3A45%3A58Z
9、 然後就可以向ECS的API伺服器傳送請求了
參考文件
1.官網的生成Signature文件:https://help.aliyun.com/document_detail/25492.html
相關文章
- 排查錯誤日誌
- 排查開啟網站提示500錯誤的解決方法-實用技術網站
- MYSQL中 TYPE=MyISAM 錯誤的解決方法MySql
- 如何排查Web伺服器HTTP ERROR 500的錯誤?Web伺服器HTTPError
- 使用describe命令進行Kubernetes pod錯誤排查
- C中的匯流排錯誤和段錯誤
- undefined reference to錯誤的解決方法Undefined
- [譯] 修改 Git 錯誤的高明方法Git
- HEAD請求方法引起方法未定義的錯誤
- Python錯誤重試方法Python
- HTTP 錯誤 500.19- Internal Server Error 錯誤解決方法HTTPServerError
- Maven專案報錯invalid LOC header (bad signature)MavenHeader
- grpc中的錯誤處理RPC
- dbfread報錯ValueError錯誤解決方法Error
- js逆向) 某音cookie中的__ac_signatureJSCookie
- angular中ExpressionChangedAfterItHasBeenCheckedError錯誤AngularExpressError
- PbootCMS 404 錯誤解決方法boot
- 印表機提示列印錯誤怎麼解決 印表機狀態錯誤的方法
- 排查指南 | 當 mPaaS 小程式提示“應用更新錯誤(1001)”時
- 聊聊RxJS中的錯誤重試JS
- JPA 開發中遇到的錯誤
- Restful API 中的錯誤處理RESTAPI
- 【譯】RxJava 中的錯誤處理RxJava
- async/await 優雅的錯誤處理方法AI
- Mac上搭建chromedriver的錯誤解決方法MacChrome
- standby新增檔案錯誤的解決方法
- nginx出現403錯誤的解決方法Nginx
- 常見的錯誤SEO方法有哪些呢?
- ThinkPHP函式提示錯誤function undefined的方法PHP函式FunctionUndefined
- 在 Istio 中除錯 503 錯誤除錯
- 解決MyQL資料庫中1045錯誤的方法——Windows系統(轉)資料庫Windows
- 印表機錯誤無法列印怎麼處理 印表機錯誤不能列印的方法
- 從錯誤中學習
- react元件內報implementation()方法錯誤!React元件
- dedecms提示500錯誤解決方法
- Linux yum提示Loaded plugins錯誤的解決方法LinuxPlugin
- Nginx報504 gateway timeout錯誤的解決方法NginxGateway
- 談談RxSwift中的錯誤處理Swift
- DG使用中遇到的幾個錯誤