向 OSS 發起請求時,添加包含 V4 簽名的 Authorization
要求標頭(Header),以確保請求能夠通過身分識別驗證。優先使用 OSS 提供的 SDK 發起請求,因為 SDK 已整合複雜的 V4 簽名演算法。只有在無法使用 SDK 時,才需要參考本文自行實現 V4 簽名演算法。
SDK 簽名實現
如果需要自行實現 V4 簽名演算法,優先參考 SDK 的 V4 簽名實現。
SDK | V4 簽名實現 |
Authorization 要求標頭
向 OSS 發起請求時,需在 Authorization
要求標頭中包含簽名,用於驗證請求。
Authorization
要求標頭格式如下:
Authorization: OSS4-HMAC-SHA256 Credential=<AccessKeyId>/<SignDate>/<SignRegion>/oss/aliyun_v4_request, AdditionalHeaders=<AdditionalHeadersVal>, Signature=<SignatureVal>
Authorization
要求標頭說明如下:
組成部分 | 說明 |
OSS4-HMAC-SHA256 | 用於指定計算簽名的演算法。該字串指定了 OSS V4 簽名版本(OSS4)和簽名演算法(HMAC-SHA256)。當您使用 V4 簽名進行身分識別驗證時,必須提供此值。 |
Credential | AccessKey ID和範圍資訊(包括用於計算簽名的日期、地區和雲產品)。當您使用 V4 簽名進行身分識別驗證時,必須提供該欄位。 格式如下:
其中:
|
AdditionalHeaders | 指定參與計算簽名的可選要求標頭(不需要指定必須參與簽名的要求標頭),僅包含小寫頭名稱,並按字典序排序,以分號(;)分隔。 樣本如下:
|
Signature | 計算得到的簽名。當您使用 V4 簽名進行身分識別驗證時,必須提供該欄位。 用 64 個小寫十六進位數字表示的256 位的簽名值樣本如下:
|
簽名計算
OSS 收到請求後,會計算簽名,並與 Authorization
要求標頭中的簽名對比。如果一致,則請求成功;否則,請求失敗。
簽名計算過程
簽名計算過程如下圖所示:
簽名計算過程分為以下三步:
構造正常化請求:按照 OSS 簽名定義的規範,對請求進行格式化,得到正常化請求。
構造待簽名字串:對正常化請求進行統一計算處理,得到待簽名字串。
計算簽名:對 AccessKey Secret 進行多步雜湊運算產生衍生金鑰,然後使用衍生金鑰對待簽名字串進行計算,最終得到簽名。
1. 構造正常化請求
正常化請求格式如下:
HTTP Verb + "\n" +
Canonical URI + "\n" +
Canonical Query String + "\n" +
Canonical Headers + "\n" +
Additional Headers + "\n" +
Hashed PayLoad
正常化請求說明如下:
參數 | 說明 |
HTTP Verb | HTTP 要求方法,包含PUT、GET、POST、HEAD、DELETE、OPTIONS等。 |
Canonical URI | URI 編碼的資源路徑。資源路徑不包含查詢字串,其中正斜線(
|
Canonical Query String | 按字典排序的URI編碼的查詢參數。
|
Canonical Headers | 要求標頭列表。 要求標頭包含以下三類:
格式如下:
樣本如下:
|
Additional Headers | 指定參與計算簽名的可選要求標頭(不需要指定必須參與簽名的要求標頭),僅包含小寫頭名稱,並按字典序排序,以分號(;)分隔,和 樣本如下:
|
Hashed PayLoad | 請求負載的 SHA256 雜湊值的十六進位表現形式。目前只支援取值為 |
2. 構造待簽名字串
待簽名字串格式如下:
"OSS4-HMAC-SHA256" + "\n" +
TimeStamp + "\n" +
Scope + "\n" +
Hex(SHA256Hash(<CanonicalRequest>))
待簽名字串說明如下:
參數 | 說明 |
OSS4-HMAC-SHA256 | 簽名雜湊演算法,取值必須是 |
TimeStamp | 當前UTC時間,格式必須是ISO8601,例如 |
Scope | 擷取衍生金鑰的參數集。該參數集指明了日期、地區和服務。因此,通過衍生金鑰計算的簽名只能在指定的日期、地區和服務中有效。 格式如下:
說明如下:
|
CanonicalRequest | 構造的正常化請求。 |
3. 計算簽名
計算簽名分為以下兩步:
計算
SigningKey
。DateKey = HMAC-SHA256("aliyun_v4" + SK, Date); DateRegionKey = HMAC-SHA256(DateKey, Region); DateRegionServiceKey = HMAC-SHA256(DateRegionKey, "oss"); SigningKey = HMAC-SHA256(DateRegionServiceKey, "aliyun_v4_request");
SK
:參與簽名的AccessKey Secret。Date
:參與簽名的日期,以YYYYMMDD
格式表示,必須和待簽名字串中的SignDate
一致。Region
:參與簽名所使用的地區ID,例如cn-hangzhou
,必須和待簽名字串中的SignRegion
一致。
使用
SigningKey
與待簽名字串計算Signature
。Signature = HEX(HMAC-SHA256(SigningKey, StringToSign))
簽名計算樣本
以 PutObject 為例,進行簽名計算。
簽名計算參數
參數 | 值 |
AccessKeyId | LTAI**************** |
AccessKeySecret | yourAccessKeySecret |
Timestamp | 20250411T064124Z |
Bucket | examplebucket |
Object | exampleobject |
Region | cn-hangzhou |
簽名計算過程樣本
構造正常化請求。
PUT /examplebucket/exampleobject content-disposition:attachment content-length:3 content-md5:ICy5YqxZB1uWSwcVLSNLcA== content-type:text/plain x-oss-content-sha256:UNSIGNED-PAYLOAD x-oss-date:20250411T064124Z content-disposition;content-length UNSIGNED-PAYLOAD
構造待簽名字串。
OSS4-HMAC-SHA256 20250411T064124Z 20250411/cn-hangzhou/oss/aliyun_v4_request c46d96390bdbc2d739ac9363293ae9d710b14e48081fcb22cd8ad54b63136eca
計算簽名。
計算SigningKey。
說明為便於閱讀,以下
SigningKey
以十六進位格式展示。3543b7686e65eda71e5e5ca19d548d78423c37e8ddba4dc9d83f90228b457c76
計算Signature。
053edbf550ebd239b32a9cdfd93b0b2b3f2d223083aa61f75e9ac16856d61f23