簽名機制說明

Access Key ID 和 Access Key Secret 由阿里雲官方頒發給訪問者(可以通過阿里雲官方網站申請和管理),其中 Access Key ID 用於標識訪問者的身份;Access Key Secret 是用於加密簽名字串和伺服器端驗證簽名字串的密鑰,必須嚴格保密,只有阿里雲和使用者知道。

Container Service會對每個訪問的請求進行驗證,每個向Container Service提交的請求,都需要在請求中包含簽名(Signature)資訊。Container Service通過使用 Access Key ID 和 Access Key Secret 進行對稱式加密的方法來驗證請求的寄件者身份。如果計算出來的驗證碼和提供的一樣即認為該請求是有效;否則,Container Service將拒絕處理這次請求,並返回 HTTP 403 錯誤。

使用者可以在 HTTP 要求中增加授權(Authorization)的 Head 來包含簽名資訊,表明這個訊息已被授權。

Container Service要求將簽名包含在 HTTP Header 中,格式為 Authorization: acs [Access Key Id]:[Signature]

Signature 的計算方法如下:

Signature = base64(hmac-sha1(VERB + "\n"
            + ACCEPT + "\n" +
            + Content-MD5 + "\n"
            + Content-Type + "\n"
            + Date + "\n"
            + CanonicalizedHeaders + "\n"
            + CanonicalizedResource))
  • VERB 表示 HTTP 的 Method。比如樣本中的 PUT
  • Accept 用戶端需要的傳回值類型,支援 application/json 和 application/xml。
  • Content-MD5 表示請求內容資料的 MD5 值。
  • Content-Type 表示請求內容的類型。
  • Date 表示此次操作的時間,不可為空,目前只支援 GMT 格式。如果請求時間與 CAS 伺服器時間相差超過 1 5分鐘,CAS 會判定此請求不合法,並返回 400 錯誤。錯誤資訊及錯誤碼詳見本文檔第 5 部分。比如樣本中的 Thu, 17 Mar 2012 18:49:58 GMT
  • CanonicalizedHeaders 表示 HTTP 中以 x-acs- 開始的欄位組合。
  • CanonicalizedResource 表示 HTTP 所請求資源的 URI (統一資源識別項)。比如樣本中的 /clusters?name=my-clusters&resource=new
说明 CanonicalizedHeaders(即以 x-acs- 開頭的 header)在簽名驗證前需要符合以下規範:
  1. 將所有以 x-acs- 為首碼的 HTTP 要求頭的名字轉換成小寫字母。比如將 X-ACS-Meta-Name: TaoBao 轉換為 x-acs-meta-name: TaoBao。阿里雲規範要求標頭的名字是大小寫不敏感的,建議全部使用小寫。
  2. 如果一個公用要求標頭的值部分過長,則需要處理其中的 \t\n\r\f分隔字元,將其替換為英文半形的空格。
  3. 將上一步得到的所有 HTTP 阿里雲規範頭按照字典序進行升序排列。
  4. 刪除要求標頭和內容之間分隔字元兩端出現的任何空格。比如將 x-acs-meta-name: TaoBao,Alipay 轉換為 x-acs-meta-name:TaoBao,Alipay
  5. 將所有的頭和內容用 \n 分隔字元分隔拼成最後的 CanonicalizedHeaders。
说明 CanonicalizedResource 的格式規範: CanonicalizedResource 表示客戶想要訪問資源的規範描述,需要將子資源和 qurey 一同按照字典序,從小到大排列並以 & 為分隔字元產生子資源字串( ? 後的所有參數)。
http://cs.aliyuncs.com/clusters?name=my-clusters&resource=new

CanonicalizedResource 應該為:

/clusters?name=my-clusters&resource=new

簽名樣本

樣本概述

您可以通過該樣本,瞭解加簽的步驟。

樣本使用的 accessKeyId 和 accessKeySecret 分別為 access_key_idaccess_key_secret。推薦您使用自己的 OpenAPI 調用程式,來計算下面這個樣本的加簽串,您自己的加簽結果和樣本結果。

請求的樣本如下:

POST http://cs.aliyuncs.com/clusters?param1=value1&param2=value2 HTTP/1.1
Accept-Encoding: identity
Content-Length: 210
Content-MD5: 6U4ALMkKSj0PYbeQSHqgmA==    
x-acs-version: 2015-12-15 
Accept: application/json
User-Agent: cs-sdk-python/0.0.1 (Darwin/15.2.0/x86_64;2.7.10)
x-acs-signature-nonce: fbf6909a-93a5-45d3-8b1c-3e03a7916799
x-acs-signature-version: 1.0
Date: Wed, 16 Dec 2015 12:20:18 GMT
x-acs-signature-method: HMAC-SHA1
Content-Type: application/json;charset=utf-8
X-Acs-Region-Id: cn-beijing  
Authorization: acs access_key_id:/ZmVlMDNkNDA1ZTQyMWViYWY1MTRhZGVjODgxMDM4YzRiMzEzNTg0ZA==
{"password": "Just$test","instance_type": "ecs.m2.medium","name": "my-test-cluster-97082734","size": 1,"network_mode": "vpc","data_disk_category": "cloud","data_disk_size": 10,"ecs_image_id": "m-253llee3l"}

請求構造過程

計算 Content-LengthContent-MD5

Content-Length: body 內容的長度。
说明 樣本 body 首位沒有空格或分行符號。
body: {"password": "Just$test","instance_type": "ecs.m2.medium","name": "my-test-cluster-97082734","size": 1,"network_mode": "vpc","data_disk_category": "cloud","data_disk_size": 10,"ecs_image_id": "m-253llee3l"}
Content-Length: 210

Content-MD5: MD5 的計算過程。

body: {"password": "Just$test","instance_type": "ecs.m2.medium","name": "my-test-cluster-97082734","size": 1,"network_mode": "vpc","data_disk_category": "cloud","data_disk_size": 10,"ecs_image_id": "m-253llee3l"}
# 計算 body 的 md5 值
md5(body): e94e002cc90a4a3d0f61b790487aa098
# 將 md5 值轉化成位元組數組。將 md5 中的每兩個十六進位位合并,轉化為一個位元組。
# 例如:e9 -> 11111111111111111111111111101001 -> -23
bytes(md5(body)): {[-23], [78], [0], [44], [-55], [10], [74], [61], [15], [97], [-73], [-112], [72], [122], [-96], [-104]}
# 將得到的位元組數組做一個 base64 轉換
base64(bytes(md5(body))): 6U4ALMkKSj0PYbeQSHqgmA==
Content-MD5: 6U4ALMkKSj0PYbeQSHqgmA==

處理 CanonicalizedHeaders

# 將所有以‘x-acs-’開頭的頭部列出來
x-acs-version: 2015-12-15  
x-acs-signature-nonce: ca480402-7689-43ba-acc4-4d2013d9d8d4
x-acs-signature-version: 1.0
x-acs-signature-method: HMAC-SHA1
X-Acs-Region-Id: cn-beijing
# 將請求名字變成小寫,去掉每一行首尾的空格,並按照字典序進行排序。刪除要求標頭和內容之間分隔字元兩端出現的任何空格。
# 注意:最後一行沒有分行符號。
x-acs-region-id:cn-beijing
x-acs-signature-method:HMAC-SHA1
x-acs-signature-nonce:fbf6909a-93a5-45d3-8b1c-3e03a7916799
x-acs-signature-version:1.0
x-acs-version:2015-12-15

計算 CanonicalizedResource

樣本得到的 CanonicalizedResource,長度應該為 27。

说明 第一行行尾有一個 \n 的分行符號。
/clusters?param1=value1&param2=value2

計算 Signature

組裝 SignatureString。樣本中的加簽字串的長度為 307。除最後一行外,每一行行尾均有一個\n的分行符號。

POST
application/json
6U4ALMkKSj0PYbeQSHqgmA==
application/json;charset=utf-8
Wed, 16 Dec 2015 12:20:18 GMT
x-acs-region-id:cn-beijing
x-acs-signature-method:HMAC-SHA1
x-acs-signature-nonce:fbf6909a-93a5-45d3-8b1c-3e03a7916799
x-acs-signature-version:1.0
x-acs-version:2015-12-15
/clusters?param1=value1&param2=value2

計算 Signature

# 使用 accessKeySecret 來對加簽字串進行加密,其中樣本使用的 accessKeySecret 是 access_key_secret。
hmac-sha1(SignatureString): fee03d405e421ebaf514adec881038c4b313584d
# 類似於 Content-MD5 的計算方式,將得到的加密串轉化成位元組數組。
# 將得到的字元數組做一個 base64 轉換。得到最後的簽名串。
base64(bytes(hmac-sha1(SignatureString))): ZmVlMDNkNDA1ZTQyMWViYWY1MTRhZGVjODgxMDM4YzRiMzEzNTg0ZA==
Signature: ZmVlMDNkNDA1ZTQyMWViYWY1MTRhZGVjODgxMDM4YzRiMzEzNTg0ZA==

完成

經過以上的處理,添加一些其他頭部資訊,最終構成的 HTTP 要求如下所示。

POST http://cs.aliyuncs.com/clusters?param1=value1&param2=value2 HTTP/1.1
Accept-Encoding: identity
Content-Length: 210
Content-MD5: 6U4ALMkKSj0PYbeQSHqgmA==    
x-acs-version: 2015-12-15 
Accept: application/json
User-Agent: cs-sdk-python/0.0.1 (Darwin/15.2.0/x86_64;2.7.10)
x-acs-signature-nonce: fbf6909a-93a5-45d3-8b1c-3e03a7916799
x-acs-signature-version: 1.0
Date: Wed, 16 Dec 2015 12:20:18 GMT
x-acs-signature-method: HMAC-SHA1
Content-Type: application/json;charset=utf-8
X-Acs-Region-Id: cn-beijing  
Authorization: acs access_key_id:/ZmVlMDNkNDA1ZTQyMWViYWY1MTRhZGVjODgxMDM4YzRiMzEzNTg0ZA==
{"password": "Just$test","instance_type": "ecs.m2.medium","name": "my-test-cluster-97082734","size": 1,"network_mode": "vpc","data_disk_category": "cloud","data_disk_size": 10,"ecs_image_id": "m-253llee3l"}