向 OSS 发起请求时,添加包含 V4 签名的 Authorization
请求头(Header),以确保请求能够通过身份验证。优先使用 OSS 提供的 SDK 发起请求,因为 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
- 本页导读 (1)
- SDK 签名实现
- Authorization 请求头
- 签名计算
- 签名计算过程
- 1. 构造规范化请求
- 2. 构造待签名字符串
- 3. 计算签名
- 签名计算示例