天天看點

ECS API中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以外所有的參數(值被忽略):

2、 對它們進行字典排序:

3、 挨個将它們拼接在一起(注意這個時候timestamp中的值就已經經過了urlencode了,将“:”替換為“%3a”):

4、 在前面加上get&/&:

5、 再對整個字元串做urlencode,可以看到其中的“/”、“=”和參數鍵值對中的“&”都已經被替換,注意最前面的get之後的兩個“&”并沒有被替換:

6、 然後構造hmac運算的key,很簡單,将access key secret再加上一個“&”即可:

7、 扔給電腦做hmac-sha1運算,然後算出來一個最終的字元串:

8、 這個字元串就是最終的signature值,然後将其加入到http get請求中,組成最終的get參數字元串,特别要注意signature加入後需要确認其中的特殊符号如“=”是否被轉換為%xx的字元串。

9、 然後就可以向ecs的api伺服器發送請求了

繼續閱讀