技術(shù)員聯(lián)盟提供win764位系統(tǒng)下載,win10,win7,xp,裝機(jī)純凈版,64位旗艦版,綠色軟件,免費軟件下載基地!

當(dāng)前位置:主頁 > 教程 > 服務(wù)器類 >

阿里云調(diào)用API簽名機(jī)制是什么

來源:技術(shù)員聯(lián)盟┆發(fā)布時間:2017-12-08 00:12┆點擊:

  ECS 服務(wù)會對每個訪問的請求進(jìn)行身份驗證,所以無論使用 HTTP 還是 HTTPS 協(xié)議提交請求,都需要在請求中包含簽名(Signature)信息。ECS 通過使用 Access Key ID 和 Access Key Secret 進(jìn)行對稱加密的方法來驗證請求的發(fā)送者身份。Access Key ID 和 Access Key Secret 由阿里云官方頒發(fā)給訪問者(可以通過阿里云官方網(wǎng)站申請和管理),其中 Access Key ID 用于標(biāo)識訪問者的身份;Access Key Secret 是用于加密簽名字符串和服務(wù)器端驗證簽名字符串的密鑰,必須嚴(yán)格保密,只有阿里云和用戶知道。

  用戶在訪問時,按照下面的方法對請求進(jìn)行簽名處理:

  使用請求參數(shù)構(gòu)造規(guī)范化的請求字符串(Canonicalized Query String)

  (a) 參數(shù)排序。 按照參數(shù)名稱的字典順序?qū)φ埱笾兴械恼埱髤?shù)(包括“公共請求參數(shù)”和接口的自定義參數(shù),但不能包括“公共請求參數(shù)”中提到的Signature 參數(shù)本身)進(jìn)行排序。

  注:當(dāng)使用 GET 方法提交請求時,這些參數(shù)就是請求 URI 中的參數(shù)部分(即 URI 中“?”之后由“&”連接的部分)。

  (b) 參數(shù)編碼。 對排序之后的請求參數(shù)的名稱和值分別用UTF-8字符集進(jìn)行URL編碼。編碼的規(guī)則如下:

  i. 對于字符 A-Z、a-z、0-9 以及字符“-”、“_”、“.”、“~”不編碼;

  ii. 對于其他字符編碼成 “%XY” 的格式,其中 XY 是字符對應(yīng) ASCII 碼的 16 進(jìn)制表示。比如英文的雙引號(”)對應(yīng)的編碼就是 %22

  iii.對于擴(kuò)展的 UTF-8 字符,編碼成 “%XY%ZA…” 的格式;

  iv. 需要說明的是英文空格( )要被編碼是 %20,而不是加號(+)。

  注:該編碼方式和一般采用的“application/x-www-form-urlencoded” MIME格式編碼算法(比如Java標(biāo)準(zhǔn)庫中的 java.net.URLEncoder的實現(xiàn)) 相似, 但又有所不同。 實現(xiàn)時, 可以先用標(biāo)準(zhǔn)庫的方式進(jìn)行編碼, 然后把編碼后的字符串中加號(+)替換成 %20、星號(*)替換成 %2A、%7E 替換回波浪號(~),即可得到上述規(guī)則描述的編碼字符串。這個算法可以用下面的 percentEncode 方法來實現(xiàn):

  private static final String ENCODING = "UTF-8";

  private static String percentEncode(String value) throws UnsupportedEncodingException {

  return value != null ? URLEncoder.encode(value, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~") : null;

  }

  (c) 將編碼后的參數(shù)名稱和值用英文等號(=)進(jìn)行連接。

  (d) 將等號連接得到的參數(shù)組合按步驟(a)排好的順序依次使用&符號連接,即得到規(guī)范化請求字符串。

  將上一步構(gòu)造的規(guī)范化字符串按照下面的規(guī)則構(gòu)造成待簽名的字符串:

  StringToSign=

  HTTPMethod + “&” +

  percentEncode(“/”) + ”&” +

  percentEncode(CanonicalizedQueryString)

  其中 HTTPMethod 是提交請求用的 HTTP 方法,比如 GET。

  percentEncode(“/”) 是按照 1.b 中描述的 URL 編碼規(guī)則對字符 “/” 進(jìn)行編碼得到的值,即 “%2F”。

  percentEncode(CanonicalizedQueryString) 是對第 1 步中構(gòu)造的規(guī)范化請求字符串按 1.b 中描述的 URL 編碼規(guī)則編碼后得到的字符串。

  按照 RFC2104 的定義,計算待簽名字符串 StringToSign 的 HMAC 值。注意:計算簽名時使用的 Key 就是用戶持有的 Access Key Secret 并加上一個 “&” 字符(ASCII:38),使用的哈希算法是 SHA1。

  按照 Base64 編碼規(guī)則把上面的 HMAC 值編碼成字符串,即得到簽名值(Signature)。

  將得到的簽名值作為 Signature 參數(shù)添加到請求參數(shù)中,即完成對請求簽名的過程。

  注意:得到的簽名值在作為最后的請求參數(shù)值提交給ECS服務(wù)器的時候,要和其他參數(shù)一樣,按照 RFC3986 的規(guī)則進(jìn)行 URL 編碼。

  以 DescribeRegions 為例,假設(shè)使用的 Access Key Id 是 “testid”, Access Key Secret 是 “testsecret”。 那么簽名前的請求 URL 為:

  ?TimeStamp=2016-02-23T12:46:24Z&Format=XML&AccessKeyId=testid&Action=DescribeRegions&SignatureMethod=HMAC-SHA1&SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf&Version=2014-05-26&SignatureVersion=1.0

  而計算得到的待簽名字符串 StringToSign 為:

  GET&%2F&AccessKeyId%3Dtestid%26Action%3DDescribeRegions%26Format%3DXML%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf%26SignatureVersion%3D1.0%26TimeStamp%3D2016-02-23T12%253A46%253A24Z%26Version%3D2014-05-26

  因為Access Key Secret 是 “testsecret”,所以用于計算 HMAC 的 Key 為 “testsecret&”,計算得到的簽名值是:

  CT9X0VtwR86fNWSnsc6v8YGOjuE=

  將簽名作為Signature參數(shù)加入到URL請求中, 得到最后的URL 為: