全部產品
Search
文件中心

Object Storage Service:在Header中包含V4簽名(推薦)

更新時間:Jul 05, 2025

向 OSS 發起請求時,添加包含 V4 簽名的 Authorization 要求標頭(Header),以確保請求能夠通過身分識別驗證。優先使用 OSS 提供的 SDK 發起請求,因為 SDK 已整合複雜的 V4 簽名演算法。只有在無法使用 SDK 時,才需要參考本文自行實現 V4 簽名演算法。

SDK 簽名實現

如果需要自行實現 V4 簽名演算法,優先參考 SDK 的 V4 簽名實現。

SDK

V4 簽名實現

Java

OSSV4Signer.java

Python

v4.py

Go

v4.go

JavaScript

client.js

PHP

SignerV4.php

C#

SignerV4.cs

Android

OSSV4Signer.java

Swift

SignerV4.swift

Objective-C

OSSV4Signer.m

C++

SignerV4.cc

C

oss_auth.c

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 簽名進行身分識別驗證時,必須提供該欄位。

格式如下:

<AccessKeyId>/<SignDate>/<SignRegion>/oss/aliyun_v4_request

其中:

  • AccessKeyId:您的AccessKey ID。這是一個唯一的標識符,用於驗證請求的發起者身份。

  • SignDate:簽名日期,以 YYYYMMDD 格式表示。

  • SignRegion: 請求所使用的地區ID,例如 cn-hangzhou。

  • oss:固定字串,標識請求所針對的服務是阿里雲Object Storage Service。

  • aliyun_v4_request:固定字串,指定請求的簽名版本為V4。

AdditionalHeaders

指定參與計算簽名的可選要求標頭(不需要指定必須參與簽名的要求標頭),僅包含小寫頭名稱,並按字典序排序,以分號(;)分隔。

樣本如下:

content-disposition;content-length

Signature

計算得到的簽名。當您使用 V4 簽名進行身分識別驗證時,必須提供該欄位。

用 64 個小寫十六進位數字表示的256 位的簽名值樣本如下:

3938**********************************dcdc

簽名計算

OSS 收到請求後,會計算簽名,並與 Authorization 要求標頭中的簽名對比。如果一致,則請求成功;否則,請求失敗。

簽名計算過程

簽名計算過程如下圖所示:

簽名計算過程分為以下三步:

  1. 構造正常化請求:按照 OSS 簽名定義的規範,對請求進行格式化,得到正常化請求

  2. 構造待簽名字串:對正常化請求進行統一計算處理,得到待簽名字串

  3. 計算簽名:對 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 編碼的資源路徑。資源路徑不包含查詢字串,其中正斜線(/)不需要編碼。

  • 如果請求目標為OSS服務,則資源路徑為/,URI 編碼的資源路徑為UriEncode("/")

  • 如果請求目標為Bucket,則資源路徑:/examplebucket/,URI 編碼的資源路徑為UriEncode("/examplebucket/")

  • 如果請求目標為Bucket中的Object,則資源路徑:/examplebucket/exampleobject,URI 編碼的資源路徑:UriEncode("/examplebucket/exampleobject")

Canonical Query String

按字典排序的URI編碼的查詢參數。

  • 如果查詢參數包含參數名稱和值,先對每個參數的名稱和值分別進行 URI 編碼,然後按照參數名稱的字典順序對參數進行排序。注意,排序是在編碼之後進行的。使用 = 串連編碼後的名稱和值,並使用 & 串連不同的參數。

    • 查詢參數:prefix=somePrefix&marker=someMarker&max-keys=20

    • 正常化的查詢參數:

      UriEncode("marker")+"="+UriEncode("someMarker")+"&"+UriEncode("max-keys")+"="+UriEncode("20")+"&"+UriEncode("prefix")+"="+UriEncode("somePrefix")
  • 如果查詢參數只包含參數名稱,對參數名稱進行 URI 編碼。

    • 查詢參數:?acl

    • 正常化的查詢參數:UriEncode("acl")

  • 如果沒有查詢參數,即請求的 URI 中不包含 ?,則正常化的查詢字串設為空白字串("")。

Canonical Headers

要求標頭列表。

要求標頭包含以下三類:

  • 要求標頭中必須存在且參與簽名的:

    • x-oss-content-sha256:目前只支援UNSIGNED-PAYLOAD。

  • 要求標頭中如果存在則參與簽名的:

    • Content-Type

    • Content-MD5

    • x-oss-*:以x-oss-開頭的其他要求標頭。例如,通過 STS AK 來訪問的時候,SecurityToken 通過 x-oss-security-token:security-token 來描述。例如,請求時間通過x-oss-date來描述,格式必須為ISO8601標準時間格式,例如20231203T121212Z

  • AdditionalHeaders中指定的可選要求標頭。

格式如下:

Lowercase(<HeaderName1>) + ":" + Trim(<value>) + "\n"
Lowercase(<HeaderName2>) + ":" + Trim(<value>) + "\n"
...
Lowercase(<HeaderNameN>) + ":" + Trim(<value>) + "\n"

樣本如下:

content-disposition:attachment
content-length:3
content-md5:ICy5YqxZB1uWSwcVLSNLcA==
content-type:text/plain
x-oss-content-sha256:UNSIGNED-PAYLOAD
x-oss-date:20250328T101048Z

Additional Headers

指定參與計算簽名的可選要求標頭(不需要指定必須參與簽名的要求標頭),僅包含小寫頭名稱,並按字典序排序,以分號(;)分隔,和AdditionalHeaders保持一致。

樣本如下:

content-disposition;content-length

Hashed PayLoad

請求負載的 SHA256 雜湊值的十六進位表現形式。目前只支援取值為UNSIGNED-PAYLOAD

2. 構造待簽名字串

待簽名字串格式如下:

"OSS4-HMAC-SHA256" + "\n" +
TimeStamp + "\n" +
Scope + "\n" +
Hex(SHA256Hash(<CanonicalRequest>))

待簽名字串說明如下:

參數

說明

OSS4-HMAC-SHA256

簽名雜湊演算法,取值必須是OSS4-HMAC-SHA256

TimeStamp

當前UTC時間,格式必須是ISO8601,例如20250320T083322Z

Scope

擷取衍生金鑰的參數集。該參數集指明了日期、地區和服務。因此,通過衍生金鑰計算的簽名只能在指定的日期、地區和服務中有效。

格式如下:

<SignDate>/<SignRegion>/oss/aliyun_v4_request

說明如下:

  • SignDate:參與簽名的日期,以 YYYYMMDD格式表示。

  • SignRegion:參與簽名所使用的地區ID,例如 cn-hangzhou

  • oss:參與簽名的服務名稱,固定為oss

  • aliyun_v4_request:參與簽名的版本,固定為aliyun_v4_request

CanonicalRequest

構造的正常化請求。

3. 計算簽名

計算簽名分為以下兩步:

  1. 計算 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一致。

  2. 使用 SigningKey 與待簽名字串計算 Signature

    Signature = HEX(HMAC-SHA256(SigningKey, StringToSign))

簽名計算樣本

以 PutObject 為例,進行簽名計算。

簽名計算參數

參數

AccessKeyId

LTAI****************

AccessKeySecret

yourAccessKeySecret

Timestamp

20250411T064124Z

Bucket

examplebucket

Object

exampleobject

Region

cn-hangzhou

簽名計算過程樣本

  1. 構造正常化請求。

    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
  2. 構造待簽名字串。

    OSS4-HMAC-SHA256
    20250411T064124Z
    20250411/cn-hangzhou/oss/aliyun_v4_request
    c46d96390bdbc2d739ac9363293ae9d710b14e48081fcb22cd8ad54b63136eca
  3. 計算簽名。

    1. 計算SigningKey。

      說明

      為便於閱讀,以下SigningKey以十六進位格式展示。

      3543b7686e65eda71e5e5ca19d548d78423c37e8ddba4dc9d83f90228b457c76
    2. 計算Signature。

      053edbf550ebd239b32a9cdfd93b0b2b3f2d223083aa61f75e9ac16856d61f23