文档中心 > V2认证
V2认证

最近更新时间:2022-10-21

在Header中包含签名

用户可以在HTTP请求中增加 Authorization 的Header来包含签名(Signature)信息,表明这个消息已被授权。


Authorization字段计算的方法

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资源。


构建CanonicalizedHeaders的方法

所有以x-amz-为前缀的HTTP Header被称为CanonicalizedHeaders。它的构建方法如下:

  1. 将所有以x-amz-为前缀的HTTP请求头的名字转换成小写 。如X-AMZ-Meta-Name: Hello转换成x-amz-meta-name: Hello。

  2. 如果请求是以STS获得的AccessKeyId和AccessKeySecret发送时,还需要将获得的security-token值以x-amz-security-token:security-token的形式加入到签名字符串中。

  3. 将上一步得到的所有HTTP请求头按照名字的字典序进行升序排列。

  4. 删除请求头和内容之间分隔符两端出现的任何空格。如x-amz-meta-name: Hello转换成:x-amz-meta-name: Hello。

  5. 将每一个头和内容用 \n 分隔符分隔拼成最后的CanonicalizedHeaders。


构建CanonicalizedResource的方法

用户发送请求中想访问的OSS目标资源被称为CanonicalizedResource。它的构建方法如下:

  1. 将CanonicalizedResource置成空字符串 ""。

  2. 放入要访问的OSS资源 /BucketName/ObjectName(如果没有ObjectName则CanonicalizedResource为”/BucketName/“,如果同时也没有BucketName则为“/”)。

  3. 如果请求的资源包括子资源(SubResource) ,那么将所有的子资源按照字典序,从小到大排列并以 & 为分隔符生成子资源字符串。在CanonicalizedResource字符串尾添加 ?和子资源字符串。此时的CanonicalizedResource如:/BucketName/ObjectName?acl&uploadId=UploadId。


计算签名头规则

  1. 签名的字符串必须为 UTF-8 格式。含有中文字符的签名字符串必须先进行 UTF-8 编码,再与 AccessKeySecret计算最终签名。

  2. 签名的方法用RFC 2104中定义的HMAC-SHA1方法,其中Key为 AccessKeySecret。 Content-Type 和 Content-MD5 在请求中不是必须的,但是如果请求需要签名验证,空值的话以换行符 \n 代替。

  3. 在所有非HTTP标准定义的header中,只有以 x-amz- 开头的header,需要加入签名字符串;其他非HTTP标准header将被OSS忽略(如下方签名示例中的x-amz-magic是需要加入签名字符串的)。

  4. 以 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