為保證API的安全調用,在調用API時阿里云會對每個API請求通過簽名(Signature)進行身份驗證。無論使用HTTP還是HTTPS協議提交請求,請求中都需要包含簽名信息。
概述
RESTful API需要按以下格式在API請求頭(Request Header)中添加Authorization參數進行簽名。
Authorization:acs AccessKeyId:Signature
- acs:表示阿里云服務,固定標識不可修改。
- AccessKeyId:調用者調用API所用的密鑰ID。
- Signature:使用AccessKey Secret對請求進行對稱加密的簽名。
計算簽名
簽名算法遵循RFC 2104 HMAC-SHA1規范,使用AccessKey Secret對編碼、排序后的整個請求串計算HMAC值作為簽名。簽名的元素是請求自身的一些參數,由于每個API請求內容不同,所以簽名的結果也不盡相同。
Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(
StringToSign)) )
- 構建待簽名字符串。
待簽名字符串(StringToSign)是API請求拼裝的字符串,用于計算簽名,包括:
待簽名字符串必須按照以下順序構造。
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+Tn87******w7Q== 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-44665544**** x-acs-signature-method: HMAC-SHA1 x-acs-signature-version: 1.0 x-eventbridge-version: 2020-04-01
規范請求示例如下:
POST application/json ChDfdfwC+Tn87******w7Q== application/x-www-form-urlencoded;charset=utf-8 Thu, 22 Feb 2018 07:46:12 GMT x-acs-signature-nonce:550e8400-e29b-41d4-a716-44665544**** x-acs-signature-method:HMAC-SHA1 x-acs-signature-version:1.0 x-eventbridge-version:2020-04-01 /stacks?name=test_alert&status=COMPLETE
- 添加簽名。
將計算好的簽名按照以下格式添加到請求的Header中。
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。
Accept: application/json
Content-MD5: ChDfdfwC+Tn87******w7Q==
Content-Type: application/x-www-form-urlencoded;charset=utf-8
Date: Thu, 22 Feb 2018 07:46:12 GMT
application/json
ChDfdfwC+Tn87******w7Q==
application/x-www-form-urlencoded;charset=utf-8
Thu, 22 Feb 2018 07:46:12 GMT
阿里云協議Header (CanonicalizedHeaders)
x-acs-
為前綴的參數。請求中必須包含以下參數:
- x-acs-signature-nonce:唯一隨機數,用于防止網絡重放攻擊。在不同請求間要使用不同的隨機數值。
- x-acs-signature-method:簽名算法,只支持HMAC-SHA1算法。
- x-acs-signature-version:簽名版本,取值:1.0。
- x-eventbridge-version:API版本號,請參照各產品的API文檔。
根據以下步驟構造阿里云規范頭:
- 將所有以
x-acs-
為前綴的HTTP請求頭的名字轉換成小寫字母。例如將
X-acs-OSS-Meta-Name: TaoBao
轉換成x-acs-oss-meta-name: TaoBao
。 - 將步驟1得到的所有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-44665544****
x-acs-signature-method: HMAC-SHA1
x-acs-signature-version: 1.0
x-eventbridge-version: 2020-04-01GMT
規范Header示例如下:
x-acs-signature-nonce: 550e8400-e29b-41d4-a716-44665544****
x-acs-signature-method: HMAC-SHA1
x-acs-signature-version: 1.0
x-eventbridge-version: 2020-04-01
規范資源(CanonicalizedResource)
CanonicalizedResource表示想要訪問資源的規范描述,需要將子資源和query參數一起按照字典序進行升序排序并以“&”為分隔符生成子資源字符串,即問號(?)后的所有參數。
/stacks?status=COMPLETE&name=test_alert
/stacks?name=test_alert&status=COMPLETE
Body
將請求的Body用MD5算法加密,再進行Base64編碼,將結果添加到Content-MD5中。