主题切换
访问控制
用户签名验证(Authentication)
OSCA通过AK/SK对请求进行签名,在向osca发送请求时,客户端发送的每个消息头需要包含由SK、请求时间、请求类型等信息生成的签名信息。
AK(Access Key ID):访问密钥ID。与私有访问密钥关联的唯一标识符;访问密钥ID和私有访问密钥一起使用,对请求进行加密签名。格式例如:PIM9Z4LAahZtba1BeLW2
SK(Secret Access Key):与访问密钥ID结合使用的密钥,对请求进行加密签名,可标识发送方,并防止请求被修改。格式例如:d21a0c29066927257deddddec3035ae27cf34ce9e097b6847d6077f95faf283c 用户可以在IAM服务中获取AK和SK,获取的方法请参见获取访问密钥(AK/SK)。
osca根据应用场景,提供了Header中携带签名、URL中携带签名2种签名计算方式。
以Header中携带签名为例,用户签名验证流程如下所示。Header中携带签名方法的具体参数说明及代码示例,请参见Header中携带签名。
签名计算和验证步骤
创建V4签名的步骤简述如下,后面将详述各个步骤的操作方法。
1.创建规范请求。
2.利用规范请求和其他信息创建待签名的字符串(StringToSign)。
3.利用 SecretKey 生成签名密钥,然后将该签名密钥与在上一步中创建的字符串结合使用来创建签名。
4.将生成的签名添加到 HTTP 请求头中或者作为参数添加到 URL 中。
签名验证
1.从头域Authorization中取出AK,去IAM取回用户的SK。
2.按照签名规则计算StringToSign。
3.计算签名Signature。
4.验证签名。
在Header中包含签名
osca的所有API接口都可以通过在header中携带签名方式来进行身份认证,也是最常用的身份认证方式。
在Header中携带签名是指将通过HTTP消息中Authorization header头域携带签名信息,消息头域的格式为:
text
AWS4-HMAC-SHA256
Credential=<AccessKeyID>/<date>/<region>/<service>/aws4_request,
SignedHeaders=<signed headers>,
Signature=<signature>
签名的计算过程如下:
1.获取签名范围(scope)
2.生成字符串签名范围(stringToSign)
3.计算签名密钥(signingKey)
4.计算签名(signature)
5.构建授权头(Authorization header)
text
stringToSign = "AWS4-HMAC-SHA256" + "\n"+
TimeStamp + "\n"+
Scope + "\n"+
Hex(SHA256HASH(canonicalRequest))
构造StringToSign所需参数说明
"AWS4-HMAC-SHA256" 这是签名算法的标识符,指明使用 AWS V4 签名算法和 HMAC-SHA256 进行签名。
TimeStamp 这是时间戳,通常表示请求的发起时间。在 AWS V4 签名中,时间戳格式为 YYYYMMDDTHHMMSSZ,即年月日时分秒,后跟一个字母 'Z' 表示协调世界时(UTC)。
Scope 包含日期、AWS 区域、服务和标准 AWS 请求,以用于生成签名密钥。Scope 的格式为 YYYYMMDD/region/service/aws4_request,其中:
YYYYMMDD 是请求的日期,与 TimeStamp 中的日期相同。 region 是 AWS 区域,例如,us-east-1。 service 是 AWS 服务的名称,例如,s3。 aws4_request 是 AWS V4 签名的固定字符串。
Hex(SHA256HASH(canonicalRequest)): 这部分计算了规范请求(canonical request)的 SHA-256 哈希值,并将其转换为十六进制编码的字符串。规范请求是对 HTTP 请求的规范化表示,包括 HTTP 方法、规范化的 URI、规范化的查询字符串、规范化的头部和规范化的正文。
在URL中包含签名
URL中携带签名:OSCA-OSS服务支持用户构造一个特定操作的URL,这个URL中会包含用户AK、签名、有效期、资源等信息,任何拿到这个URL的人均可执行这个操作,OSCA-OSS服务收到这个请求后认为该请求就是签发URL用户自己在执行操作。
例如构造一个携带签名信息的下载对象的URL,拿到相应URL的人能下载这个对象,但该URL只在Expires指定的失效时间内有效。URL中携带签名主要用于在不提供给其他人Secret Access Key的情况下,让其他人能用预签发的URL来进行身份认证,并执行预定义的操作。
text
AWS4-HMAC-SHA256 Credential=<AccessKeyID>/<date>/<region>/<service>/aws4_request, SignedHeaders=<signed headers>, Signature=<signature>
用户可以使用查询字符串参数来发送签名信息,示例如下。
text
https:/osca.OSS.FZ.com/20001-cbq/S3test.txt
?X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential=<your-access-key-id>/<yyyymmdd>/<region>/s3/amz4_request
&X-Amz-Date=20231125T073515Z
&X-Amz-Expires=900
&X-Amz-Signature=<signature-value>
签名参数
参数名称 | 描述 |
---|---|
X-Amz-Algorithm | 签名算法: AWS4-HMAC-SHA256 |
X-Amz-Credential | 用户的 accessKeyId 和范围信息,范围信息包括请求日期、区域、服务、终止字符串 aws4_request,格式如下:/date/region/service/aws4_request 其中:date 格式为 YYYYMMDD。region:参阅 Region 英文名称 service:为 s3 |
X-Amz-Date | 日期和时间格式必须遵循 ISO 8601 标准,并且必须使用“yyyyMMddTHHmmssZ”格式进行格式化。例如,如果日期和时间是“08/01/2018 15:32:41.982-700”,则必须首先将其转换为 UTC(协调世界时),然后转换为“20180801T083241Z”。请求的时间戳不能大于(服务端时间戳+15分钟) |
X-Amz-Expires | 过期时间,单位秒。时间范围为 1-604800(7天)。例如,86400(表示24小时)。请求时间戳+过期时间应大于服务端时间戳。 |
X-Amz-SignedHeaders | 列出用于计算签名的标头。签名计算中需要以下标头:HTTP Host 请求头。x-amz-* 请求头。 |
X-Amz-Signature | 签名结果 |
使用参数的签名过程与使用请求头的签名过程类似,说明如下:
由于创建签名URL的时候,并不知道请求体的内容,所以设置常量 UNSIGNED-PAYLOAD。 规范查询字符串(Canonical Query String)必须包括除了X-Amz-Signature之外的所有查询参数。 规范请求头(Canonical Headers)必须包括HTTP Host请求头和x-amz-开头的请求头,这些请求头都将参与签名计算。
示例
通过创建签名URL的方式,与其他人共享 bucket 中 S3text.txt 对象,过期时间设置为 900秒。以GET请求为例:
text
GET
https://fgws3-ocloud.ihep.ac.cn/20001-cbq/S3test.txt
?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=PIM9Z4LAahZtba1BeLW2%2F20231125%2Fus-east-1%2Fs3%2Faws4_request
&X-Amz-Date=20231125T073515Z
&X-Amz-Expires=900
&X-Amz-SignedHeaders=host
&X-Amz-Signature=<signature-value>
以下步骤首先说明如何计算签名和构建预签名URL。示例中使用的访问密钥如下:
参数名称 | 描述 |
---|---|
AccessKeyId | PIM9Z4LAahZtba1BeLW2 |
SecretAccessKey | LADiAZZeHF0bLHamidpy |
生成待签名字符串
a. 创建规范请求(以GET请求为例)
text
GET
/S3test.txt
X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=PIM9Z4LAahZtba1BeLW2%2F20231125%2Fus-east-1%2Fs3%2Faws4_request&
X-Amz-Date=20231125T072218Z&X-Amz-Expires=60&X-Amz-SignedHeaders=host
host:osca.OSS.FZ.com
host
UNSIGNED-PAYLOAD
b. 待签名字符串
text
AWS4-HMAC-SHA256
20231125T073515Z
20231125/us-east-1/s3/aws4_request
a042adef5d0424f5b32c628cf17c19521c68ec567083bc4c8a465cb3898547da
生成签名密钥
text
signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<YourSecretAccessKey>","202311225"),"us-east-1"),"s3"),"amz4_request")
计算后的签名
text
38a1c76f9460052188f14be5603d4325f4164ebc674c87c62704cd9c7a95cc39
预签名URL
text
https://fgws3-ocloud.ihep.ac.cn/20001-cbq/S3test.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=PIM9Z4LAahZtba1BeLW2%2F20231125%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20231125T073515Z&X-Amz-Expires=600&X-Amz-SignedHeaders=host&X-Amz-Signature=38a1c76f9460052188f14be5603d4325f4164ebc674c87c62704cd9c7a95cc39