為保證API的安全調用,在調用API時阿里雲會對每個API請求通過簽名(Signature)進行身分識別驗證。無論使用HTTP還是HTTPS協議提交請求,都需要在請求中包含簽名資訊。
概述
RESTful API需要按照如下格式在API要求標頭(RequestHeader)中添加Authorization參數進行簽名。
Authorization:acs:AccessKeyId:Signatureacs:Alibaba Cloud Service的縮寫,固定標識不可修改。
AccessKeyId:調用者調用API所用的密鑰ID。
Signature:使用AccessKey Secret對請求進行對稱式加密的簽名。
計算簽名
簽名演算法遵循RFC 2104 HMAC-SHA1規範,使用AccessSecret對編碼、排序後的整個請求串計算HMAC值作為簽名。簽名的元素是請求自身的一些參數,由於每個API請求內容不同,所以簽名的結果也不盡相同。
Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(
StringToSign)) )完成以下操作,計算簽名:
構建待簽名字串。
待簽名字串(StringToSign)是API請求拼裝的字串,用於計算簽名,包括:
HTTP協議Header
阿里雲協議Header(CanonicalizedHeaders)
規範資源(CanonicalizedResource)
Body
待簽名字串必須按照以下順序構造。
StringToSign = //http協議Header HTTP-Verb + "\n" + Accept + "\n" + Content-MD5 + "\n" +//Body的MD5值放在此處 Content-Type + "\n" + Date + "\n" + //阿里雲協議header(CanonicalizedHeaders) CanonicalizedHeaders + //簽名中如何包含CanonicalizedResource(規範資源) CanonicalizedResource樣本:原始請求
POST /stacks?name=test_alert&status=COMPLETE HTTP/1.1 Host: ***.aliyuncs.com Accept: application/json Content-MD5: ChDfdfwC+Tn874znq7Dw7Q== Content-Type: application/x-www-form-urlencoded;charset=utf-8 Date: Thu, 22 Feb 2018 07:46:12 GMT x-acs-signature-nonce: 550e8400-e29b-41d4-a716-446655440000 x-acs-signature-method: HMAC-SHA1 x-acs-signature-version: 1.0 x-acs-version: 2016-01-02樣本:規範請求
POST application/json ChDfdfwC+Tn874znq7Dw7Q== application/x-www-form-urlencoded;charset=utf-8 Thu, 22 Feb 2018 07:46:12 GMT x-acs-signature-nonce: 550e8400-e29b-41d4-a716-446655440000 x-acs-signature-method:HMAC-SHA1 x-acs-signature-version:1.0 x-acs-version:2016-01-02 /stacks?name=test_alert&status=COMPLETE添加簽名。
將計算好的簽名按照如下格式添加到RequestHeader中。
Authorization: acs AccessKeyId:Signature
HTTP協議Header
計算簽名必須包含以下參數,並按字典順序排列;若值不存在則以\n補齊。
Accept :用戶端需要的傳回值類型,取值:application/json | application/xml。
Content-MD5:HTTP協議訊息體的128-bit MD5散列值轉換成BASE64編碼的結果。
Content-Type:RFC 2616中定義的HTTP請求內容類型。
Date:HTTP 1.1協議中規定的GMT時間,例如:Wed, 05 Sep. 2012 23:00:00 GMT。
說明不包含key。
樣本:原始Header
Accept: application/json
Content-MD5: ChDfdfwC+Tn874znq7Dw7Q==
Content-Type: application/x-www-form-urlencoded;charset=utf-8
Date: Thu, 22 Feb 2018 07:46:12 GMT樣本:規範Header
application/json
ChDfdfwC+Tn874znq7Dw7Q==
application/x-www-form-urlencoded;charset=utf-8
Thu, 22 Feb 2018 07:46:12 GMT阿里雲協議Header (CanonicalizedHeaders)
阿里雲規範頭,非標準HTTP頭部資訊,是請求中出現的以x-acs-為首碼的參數。請求中必須包含以下參數:
x-acs-signature-nonce:唯一隨機數,用於防止網路重放攻擊。在不同請求間要使用不同的隨機數值。
x-acs-signature-version:簽名版本,取值:1.0。
x-acs-version:API版本號碼。
完成以下操作,構造阿里雲規範頭:
將所有以
x-acs-為首碼的HTTP要求標頭的名字轉換成小寫字母。如將X-acs-OSS-Meta-Name: TaoBao轉換成x-acs-oss-meta-name: TaoBao。將上一步得到的所有HTTP阿里雲規範頭按照字典序進行升序排列。
刪除要求標頭和內容之間分隔字元兩端出現的任何空格。如將
x-acs-oss-meta-name: TaoBao,Alipay轉換成x-acs-oss-meta-name:TaoBao,Alipay。將所有的頭和內容用“\n”分隔字元分隔拼成最後的CanonicalizedHeaders。
樣本:原始Header
x-acs-signature-nonce: 550e8400-e29b-41d4-a716-446655440000
x-acs-signature-method: HMAC-SHA1
x-acs-signature-version: 1.0
x-acs-version: 2016-01-02GMT樣本:規範Header
x-acs-signature-nonce:550e8400-e29b-41d4-a716-446655440000
x-acs-signature-method:HMAC-SHA1
x-acs-signature-version:1.0
x-acs-version:2016-01-02規範資源(CanonicalizedResource)
CanonicalizedResource表示想要訪問資源的規範描述,需要將子資源和query參數一同按照字典序,從小到大排列並以“&”為分隔字元產生子資源字串(?後的所有參數)。
樣本:原始請求
/stacks?status=COMPLETE&name=test_alert樣本:規範請求
/stacks?name=test_alert&status=COMPLETEBody
將請求的body用MD5演算法加密,再進行base64編碼,將結果添加到Content-MD5中。