最近更新时间:2022-10-21
用户可以在HTTP请求中增加 Authorization 的Header来包含签名(Signature)信息,表明这个消息已被授权。
Authorization = "AWS " + AccessKeyId + ":" + Signature Signature = base64(hmac-sha1(AccessKeySecret, VERB + "\n" + Content-MD5 + "\n" + Content-Type + "\n" + Date + "\n" + CanonicalizedHeaders + CanonicalizedResource)) |
AccessKeySecret:表示签名所需的密钥。
VERB:表示HTTP 请求的Method,主要有PUT、GET、POST、HEAD、DELETE等。
\n:表示换行符。
Content-MD5:表示请求内容数据的MD5值,对消息内容(不包括头部)计算MD5值获得128比特位数字,对该数字进行base64编码而得到。该请求头可用于消息合法性的检查(消息内容是否与发送时一致),如”eB5eJF1ptWaXm4bijSPyxw==”,也可以为空。详情请参见RFC2616 Content-MD5。
Content-Type:表示请求内容的类型,如”application/octet-stream”,也可以为空。
Date:表示此次操作的时间,且必须为GMT格式,如”Sun, 22 Nov 2015 08:16:38 GMT”。
CanonicalizedHeaders:表示以 x-amz- 为前缀的HTTP Header的字典序排列。需要注意的是Header的格式需保持大小写一致,否则会影响签名的校验。
CanonicalizedResource表示用户想要访问的OSS资源。
所有以x-amz-为前缀的HTTP Header被称为CanonicalizedHeaders。它的构建方法如下:
将所有以x-amz-为前缀的HTTP请求头的名字转换成小写 。如X-AMZ-Meta-Name: Hello转换成x-amz-meta-name: Hello。
如果请求是以STS获得的AccessKeyId和AccessKeySecret发送时,还需要将获得的security-token值以x-amz-security-token:security-token的形式加入到签名字符串中。
将上一步得到的所有HTTP请求头按照名字的字典序进行升序排列。
删除请求头和内容之间分隔符两端出现的任何空格。如x-amz-meta-name: Hello转换成:x-amz-meta-name: Hello。
将每一个头和内容用 \n 分隔符分隔拼成最后的CanonicalizedHeaders。
用户发送请求中想访问的OSS目标资源被称为CanonicalizedResource。它的构建方法如下:
将CanonicalizedResource置成空字符串 ""。
放入要访问的OSS资源 /BucketName/ObjectName(如果没有ObjectName则CanonicalizedResource为”/BucketName/“,如果同时也没有BucketName则为“/”)。
如果请求的资源包括子资源(SubResource) ,那么将所有的子资源按照字典序,从小到大排列并以 & 为分隔符生成子资源字符串。在CanonicalizedResource字符串尾添加 ?和子资源字符串。此时的CanonicalizedResource如:/BucketName/ObjectName?acl&uploadId=UploadId。
签名的字符串必须为 UTF-8 格式。含有中文字符的签名字符串必须先进行 UTF-8 编码,再与 AccessKeySecret计算最终签名。
签名的方法用RFC 2104中定义的HMAC-SHA1方法,其中Key为 AccessKeySecret。 Content-Type 和 Content-MD5 在请求中不是必须的,但是如果请求需要签名验证,空值的话以换行符 \n 代替。
在所有非HTTP标准定义的header中,只有以 x-amz- 开头的header,需要加入签名字符串;其他非HTTP标准header将被OSS忽略(如下方签名示例中的x-amz-magic是需要加入签名字符串的)。
以 x-amz- 开头的header在签名验证前需要符合以下规范:
header的名字需要变成小写。
header按字典序自小到大排序。
分割header name和value的冒号前后不能有空格。
每个Header之后都有一个换行符“\n”,如果没有Header,CanonicalizedHeaders就设置为空。
请求 | 签名字符串计算公式 | 签名字符串 |
PUT /nelson HTTP/1.0 Content-MD5: eB5eJF1ptWaXm4bijSPyxw== Content-Type: text/html Date: Thu, 17 Nov 2005 18:49:58 GMT Host: oss-cn-north-1.unicloudsrv.com X-AMZ-Meta-Author: foo@unicloud.com X-AMZ-Magic: abracadabra | Signature = base64(hmac-sha1(AccessKeySecret,VERB + “\n” + Content-MD5 + “\n”+ Content-Type + “\n” + Date + “\n” + CanonicalizedHeaders+ CanonicalizedResource)) | “PUT\n eB5eJF1ptWaXm4bijSPyxw==\n text/html\n Thu, 17 Nov 2005 18:49:58 GMT\n x-amz-magic:abracadabra\nx-amz-meta-author:foo@unicloud.com\n/amz-example/nels |