天翼云对象存储(经典版)I型API参考-用户签名验证(V4)使用Authorization请求头验证 | ||||||||||||||||||||||||||||||||
产品推荐: 1、安全稳定的云服务器租用,2核/2G/5M仅37元,点击抢购>>>; 2、高防物理服务器20核/16G/50M/500G防御仅350元,点击抢购>>> 3、百度智能建站(五合一网站)仅880元/年,点击抢购>>> 模板建站(PC+手机站)仅480元/年,点击抢购>>> 4、阿里云服务器2核2G3M仅99元/年、2核4G5M仅199元/年,新老同享,点击抢购>>> 5、腾讯云服务器2核2G4M仅99元/年、新老同享,点击抢购>>> 点击这里注册天翼云特邀VIP帐号,立即体验天翼云对象存储>>> 天翼云对象存储(经典版)I型API参考-用户签名验证(V4)使用Authorization请求头验证 概述Authorization请求头包含以下信息(增加换行是为了方便阅读,实际为空字符串): Authorization: AWS4-HMAC-SHA256 Credential=2a948fd3f00ba0925806/20180501/region/s3/aws4_request, SignedHeaders=host;range;x-amz-date, Signature=fe5f80f77d5fa3beca038a248ff027d0445342fe2855ddc963176630326f1024 组成字段说明如下:
有两种签名计算方式:
上述两种方式,都必须携带x-amz-content-sha256请求头,如果选择签名负载方式,请将x-amz-content-sha256请求头的值设置为负载的checksum值,否则将值设置为文本字符串UNSIGNED-PAYLOAD。 签名过程签名过程如下图所示: 下表描述了图中显示的功能。用户需要为这些函数实现代码。
1.创建规范请求 将请求的内容(包括主机、操作、请求头等)组织为标准规范格式。规范请求是用于创建待签字符串的输入之一。伪代码如下:
http://oos-cn.ctyunapi.cn/examplebucket?prefix=somePrefix&marker=someMarker&max-keys=20 CanonicalQueryString的构造方式如下(为了便于阅读,添加了换行符): UriEncode("marker")+"="+UriEncode("someMarker")+"&"+ UriEncode("max-keys")+"="+UriEncode("20") + "&" + UriEncode("prefix")+"="+UriEncode("somePrefix") 当请求的目标是子资源时,相应的查询参数的值设置为空字符串(“”)。例如,下面的请求用于设置Bucket的ACL权限: http://oos-cn.ctyunapi.cn/examplebucket?acl 在这种情况下,CanonicalQueryString为: http://oos-cn.ctyunapi.cn/examplebucket?acl 如果URI中不包含“?”,则请求中不存在查询字符串,此时将CanonicalQueryString设置为空字符串(“”),但仍需要包含“\ n”。
Lowercase(<HeaderName1>)+":"+Trim(<value>)+"\n" Lowercase(<HeaderName2>)+":"+Trim(<value>)+"\n" ... Lowercase(<HeaderNameN>)+":"+Trim(<value>)+"\n" CanonicalHeaders列表必须包括以下内容:
以下是CanonicalHeaders的示例,请求头名称为小写并已排序。 host:oos-cn.ctyunapi.cn x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 x-amz-date:20130708T220855Z
host;x-amz-content-sha256;x-amz-date
如果请求中没有负载,则计算空字符串的哈希值,如下所示: Hex(SHA256Hash("")) 哈希返回以下值: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 例如:当用户使用PUT请求上传对象时,用户可以在请求体中提供对象数据。使用GET请求检索对象时,没有请求体,所以计算空字符串的哈希。 2.创建待签名字符串 待签名的字符串格式如下:
常量字符串AWS4-HMAC-SHA256指定用户使用的哈希算法HMAC-SHA256。 timeStamp是ISO 8601格式的当前UTC时间(例如20180501T000000Z)。 Scope是将生成的签名绑定到指定日期,OOS区域和服务。 date.Format(<YYYYMMDD>) + "/" + <region> + "/" + <service> + "/aws4_request" 3.计算签名 使用SecretAccessKey作为初始哈希操作的密钥,对请求日期、区域和服务执行一系列加密哈希操作(HMAC 操作),从而派生签名密钥。伪代码如下: DateKey = HMAC-SHA256("AWS4"+"<SecretAccessKey>", "<YYYYMMDD>") DateRegionKey = HMAC-SHA256(<DateKey>, "< region>") DateRegionServiceKey = HMAC-SHA256(<DateRegionKey>, "<service>") SigningKey = HMAC-SHA256(<DateRegionServiceKey>, "aws4_request") 最终签名是使用签名密钥作为密钥,对待签名字符串计算得到HMAC-SHA256哈希值。伪代码如下: HMAC-SHA256(SigningKey, StringToSign) 4.将签名信息添加到请求头 在计算签名后,将其添加到请求的HTTP请求头或查询字符串中。 将签名信息添加到Authorization标头的伪代码如下: Authorization:<algorithm> Credential=<ak>/<credential_scope>,SignedHeaders=<SignedHeaders>,Signature=<signature> 示例以下是使用V4签名的示例。示例中使用的访问密钥如下:
Bucket名称:examplebucket。 访问的域名是oos-cn.ctyunapi.cn, region是cn。
GET /test.txt HTTP/1.1 x-amz-content-sha256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 Authorization: SignatureToBeCalculated x-amz-date: 20190220T060724Z Range: bytes=0-9 Host: examplebucket.oos-cn.ctyunapi.cn 由于此GET请求不提供任何请求体内容,因此该x-amz-content-sha256请求头的值是空请求体的哈希值。以下步骤显示Authorization请求头的计算的方法。 1) StringToSign a. 创建规范请求 GET /test.txt host:examplebucket.oos-cn.ctyunapi.cn range:bytes=0-9 x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 x-amz-date:20190220T060724Z host;range;x-amz-content-sha256;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 其中,最后一行是空请求体的hash值。第三行是空,因为此请求不包含请求参数。 b. 待签名字符串 AWS4-HMAC-SHA256 20190220T060724Z 20190220/cn/s3/aws4_request bca722269a76aadb00dfe5a50fefdbd5712065267e1692cc596cefd2681f5d14 2) 生成签名密钥 signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<YourSecretAccessKey>","20190220"),"cn"),"s3"),"aws4_request") 3) 计算后的签名 be3f55b78165716c51ce37f588048f858fc27f7449d8fe74f887d999e5fc9193 4)Authorization请求头 Authorization: AWS4-HMAC-SHA256 Credential=2a948fd3f00ba0925806/20190220/cn/s3/aws4_request, SignedHeaders=host;range;x-amz-content-sha256;x-amz-date, Signature=be3f55b78165716c51ce37f588048f858fc27f7449d8fe74f887d999e5fc9193
PUT /examplebucket/test.txt HTTP/1.1 x-amz-content-sha256: 7509e5bda0c762d2bac7f90d758b5b2263fa01ccbc542ab5e3df163be08e6ca9 Authorization:SignatureToBeCalculated x-amz-date: 20190220T070722Z x-amz-storage-class: STANDARD Host: oos-cn.ctyunapi.cn Content-Length: 12 hello world! 以下步骤显示Authorization请求头的计算的方法。 1) StringToSign a. 创建规范请求 PUT /examplebucket/test.txt content-length:12 host:oos-cn.ctyunapi.cn x-amz-content-sha256:7509e5bda0c762d2bac7f90d758b5b2263fa01ccbc542ab5e3df163be08e6ca9 x-amz-date:20190220T070722Z x-amz-storage-class:STANDARD content-length;host;x-amz-content-sha256;x-amz-date;x-amz-storage-class 7509e5bda0c762d2bac7f90d758b5b2263fa01ccbc542ab5e3df163be08e6ca9 其中,第三行是空,因为此请求不包含请求参数。最后一行是请求体的hash值,它必须与x-amz-content-sha256 请求头的值相同。 b. 待签名字符串 AWS4-HMAC-SHA256 20190220T070722Z 20190220/cn/s3/aws4_request 66919f4f7f555dec8599c5894bbd5c104767bbf0180103d751653143f67a8d45 2) 生成签名密钥 signing key =HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4"+"<YourSecretAccessKey>","20190220"),"cn"),"s3"),"aws4_request") 3) 计算后的签名 29407b3d2010ab3f86e313302a4d952d8ac0070364cd91ba3b113258a4d36b9b 4) Authorization请求头 Authorization: AWS4-HMAC-SHA256 Credential=2a948fd3f00ba0925806/20190220/cn/s3/aws4_request, SignedHeaders=content-length;host;x-amz-content-sha256;x-amz-date;x-amz-storage-class, Signature=29407b3d2010ab3f86e313302a4d952d8ac0070364cd91ba3b113258a4d36b9b
GET /?max-keys=2&prefix=t HTTP/1.1 x-amz-content-sha256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 Authorization: SignatureToBeCalculated x-amz-date: 20190220T085955Z Host: examplebucket.oos-cn.ctyunapi.cn 以下步骤显示Authorization请求头的计算的方法。 1)StringToSign a. 创建规范请求 GET / max-keys=2&prefix=t host:examplebucket.oos-cn.ctyunapi.cn x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 x-amz-date:20190220T085955Z host;x-amz-content-sha256;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 其中,最后一行是空请求体的hash值。 b. 待签名字符串 AWS4-HMAC-SHA256 20190220T085955Z 20190220/cn/s3/aws4_request bc2b6af0cbbe17679b2697f7239b02dc21d4b62fc30e197441cf900d35d3b103 2) 生成签名密钥 signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<YourSecretAccessKey>","20190220"),"cn"),"s3"),"aws4_request") 3) 计算后的签名 ce5ef3764d4a34b4e3c81d37b9a310432e5c4bf8bb4722c14877adba882fc559 4) Authorization请求头 Authorization: AWS4-HMAC-SHA256 Credential=2a948fd3f00ba0925806/20190220/cn/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=ce5ef3764d4a34b4e3c81d37b9a310432e5c4bf8bb4722c14877adba882fc559 |