全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
对象存储 OSS
h1在Header中包含签 /h1

更新时间:2017-08-09 14:46:19

a class="ribbon-btn weibo-btn" target="_blank" href="http://service.weibo.com/share/share.php?title=推荐一篇阿里云 i class="ribbon-btn-icon dbl-icon-base-sina"> /a> a class="ribbon-btn weixin-btn" href="javascript:void(0);" data-tooltip-content="#tooltip_content"> i class="ribbon-btn-icon dbl-icon-base-weixin"> /a> a class="ribbon-btn favorite-btn " title="收藏本 i class="ribbon-btn-icon dbl-icon-base-wujiaoxing"> /a> a class="ribbon-btn download-btn " target="_blank" href="http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/pdf/oss-api-cn-zh-2017-11-20.pdf" title="下载API 参考 i class="ribbon-btn-icon dbl-icon-base-xiazai"> /a>

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

  1. Authorization span= span span" " span span+ span spanAccessKeyId span span+ span span":" span span+ span spanSignature span
  2. Signature span span= span base64 span( spanhmac span- spansha1 span( spanAccessKeySecret span, span
  3. VERB span+ span span"\n" span
  4. span+ span spanContent span- spanMD5 span+ span span"\n" span span
  5. span+ span spanContent span- spanType span span+ span span"\n" span span
  6. span+ span spanDate span span+ span span"\n" span span
  7. span+ span spanCanonicalizedHeaders span
  8. span+ span spanCanonicalizedResource span)) span
  • AccessKeySecret code> 表示签 所需的密钥
  • VERB表示HTTP 请求的Method,主要有PUT,GET,POST,HEAD,DELETE等
  • \n 表示换行符
  • Content-MD5 表示请求内容数据的MD5值,对消息内容(不包括头部)计算MD5值 得128比特位数字,对该数字进行base64编码而得到。该请求头可 于消息合法性的检 (消息内容是否与发送时一致),如”eB5eJF1ptWaXm4bijSPyxw==”,也可以为空。详情参看RFC2616 Content-MD5
  • Content-Type code> 表示请求内容的类型,如”application/octet-stream”,也可以为空
  • Date code> 表示此次操t的时间,且必须为GMT格式,如”Sun, 22 Nov 2015 08:16:38 GMT”
  • CanonicalizedHeaders code> 表示以 x-oss- strong> 为前缀的http header的字典序排列
  • CanonicalizedResource code> 表示 户想要访问的资源

其中,Date CanonicalizedResource不能为空;如果请求中的Date时间 服务器的时间 15分钟以上,服务器将拒绝该服务,并返回HTTP 403错误。

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

  1. 将所有以 x-oss- strong> 为前缀的HTTP请求头的 字转换成 小写 strong> 。如X--Meta-Name: TaoBao转换成x-oss-meta-name: TaoBao
  2. 如果请求是以ST 得的AccessKeyId AccessKeySecret发送时,还需要将 得的security-token值,以 x-oss-security-token:security-token 的形式加入到签 字符串中。
  3. 将上一步得到的所有HTTP请求头按照 字的字典序进行升序排列。
  4. 删除请求头 内容之间分隔符两端出现的任何空格。如x-oss-meta-name: TaoBao转换成:x-oss-meta-name:TaoBao
  5. 将每一个头 内容 \n 分隔符分隔拼成最后的CanonicalizedHeaders。

注意 strong>:

  • CanonicalizedHeaders可以为空,无需添加最后的 \n
  • 如果只有一个,则如 x-oss-meta-a\n,注意最后的\n
  • 如果有个,则如 x-oss-meta-a:a\nx-oss-meta-b:b\nx-oss-meta-c:c\n, 注意最后的”\n”。

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

  1. 将CanonicalizedResource置成空字符串 "" code>;
  2. 放入要访问的资源 /BucketName/ObjectName code>(无ObjectName strong>则CanonicalizedResource为”/BucketName/“,如果同时也没有BucketName strong>则为“/”)
  3. 如果请求的资源包括子资源(SubResource) ,那么将所有的子资源按照字典序 strong>,从小到大排列并以 & 为分隔符生成子资源字符串。在CanonicalizedResource字符串尾添加 子资源字符串。此时的CanonicalizedResource如:/BucketName/ObjectName?acl&uploadId=UploadId
  4. 如果 户请求在指定了 询字符串(QueryString,也叫Http Request Parameters),那么将这些 询字符串及其请求值按照 字典序 strong>,从小到大排列,以 & 为分隔符,按参数添加到CanonicalizedResource中。此时的CanonicalizedResource如:/BucketName/ObjectName?acl&response-content-type=ContentType&uploadId=UploadId

提示:

  • 目前支持的子资源(sub-resource)包括:acl,uploads,location,cors,logging,website,referer,lifecycle,delete,append,tagging,objectMeta,uploadId,partNumber,security-token,position,img,style,styleName,replication,replicationProgress,replicationLocation,cname,bucketInfo,comp,qos,live,status,vod,startTime,endTime,symlink,x-oss-process,response-content-type,response-content-language,response-expires,response-cache-control,response-content-disposition,response-content-encoding等
  • 子资源(sub-resource)有三种类型:
    • 资源标识,如子资源中的acl,append,uploadId,symlink等,详见关于Object的操t
    • 指定返回Header字段,如 response-***,详见 a href="https://help.aliyun.com/document_detail/3198 >GetObject的 Request Parameters
    • x-oss-process, 于文 的处理方式,如 a href="https://help.aliyun.com/document_detail/4468

  1. 签 的字符串必须为 UTF-8 格式。含有中文字符的签 字符串必须先进行 UTF-8 编码,再与 AccessKeySecret计算最终签 。
  2. 签 的方法 a href="http://www.ietf.org/rfc/rfc210 txt">RFC 210 中定义的HMAC-SHA1方法,其中Key为 AccessKeySecret` 。
  3. Content-Type code> Content-MD5 在请求中不是必须的,但是如果请求需要签 验证, 值的话以换行符 \n 代替。
  4. 在所有非HTTP标准定义的header中,只有以 x-oss- 开头的header,需要加入签 字符串;其他非HTTP标准header将 忽略(如上例中的x-oss-magic是需要加入签 字符串的)。
  5. x-oss- 开头的header在签 验证前需要符合以下规范:
    • header的 字需要变成小写。
    • header按字典序 小到大排序。
    • 分割header name value的冒号前后不能有空格。
    • 每个Header之后都有一个换行符“\n”,如果没有Header,CanonicalizedHeaders就设置为空。

假如AccessKeyId是”44CF9590006BF252F707”,AccessKeySecret是”OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV”

请求 签 字符串计算公式 签 字符串
PUT /nelson HTTP/1.0
Content-MD5: eB5eJF1ptWaXm4bijSPyxw==
Content-Type: text/html
Date: Thu, 17 Nov 2005 18:49:58 GMT
Host: oss-example.oss-cn-hangzhou.aliyuncs.com
X--Meta-Author: foo@bar.com
X--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-oss-magic:abracadabra\nx-oss-meta-author:foo@bar.com\n
/oss-example/nelson”

可 以下方法计算签 (Signature):

python示例代码:

  1. import span base64 span
  2. import span hmac span
  3. import span sha span
  4. h span= span hmac span. spannew span( span"txrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV" span, span
  5. span"PUT\nODBGOERFMDMzQTczRUY3NUE3NzA5QzdFNUYzMDQxNEM=\ntext/html\nThu, 17 Nov 2005 18:49:58 GMT\nx-oss-magic:abracadabra\nx-oss-meta-author:foo@bar.com\n/oss-example/nelson" span, span sha span) span
  6. Signature span span= span base64 span. spanb64encode span( spanh span. spandigest span()) span
  7. print span( span"Signature: %s" span span% span spanSignature span) span

签 (Signature)计算结果应该为 26NBxoKdsyly4EDv6inkoDft/yA=,因为Authorization = “ “ + AccessKeyId + “:” + Signature所以最后Authorization为 “ 44CF9590006BF252F707:26NBxoKdsyly4EDv6inkoDft/yA=”然后加上Authorization头来组成最后需要发送的消息:

  1. PUT span/ spannelson HTTP span/ span1.0 span
  2. Authorization span: 44CF9590006BF252F707:26NBxoKdsyly4EDv6inkoDft/ spanyA= span
  3. Content- spanMd5: eB5eJF1ptWaXm4bijSPyxw== span
  4. Content- spanType: text/ spanhtml
  5. Date: Thu, span span17 spanNov span200 span18:49:58 GMT
  6. Host: oss- spanexample. spanoss- spancn- spanhangzhou. spanaliyuncs. spancom
  7. X- span- spanMeta- spanAuthor: foo@bar. spancom
  8. X- span- spanMagic: abracadabra

  1. 如果传入的AccessKeyId不存在或inactive,返回403 Forbidden。错误码:InvalidAccessKeyId。
  2. 若 户请求头中Authorization值的格式不对,返回400 Bad Request。错误码:InvalidArgument。
  3. 所有的请求都必须使 HTTP 1.1协 规定的GMT时间格式。其中,日期的格式为:date1 = 2DIGIT SP month SP 4DIGIT; day month year (e.g., 02 Jun 19 2) code>上述日期格式中,“天”所占位数都是“2 DIGIT”。因此,“Jun 2”、“2 Jun 19 2” “2-Jun-82”都是非法日期格式。
  4. 如果签 验证的时候,头中没有传入Date或者格式不正确,返回403 Forbidden错误。错误码:AccessDenied。
  5. 传入请求的时间必须在服务器当前时间之后的15分钟以内,否则返回403 Forbidden。错误码:RequestTimeTooSkewed。
  6. 如果AccessKeyId是active的,但判断 户的请求发生签 错误,则返回403 Forbidden,并在返回给 户的response中告诉 户正确的 于验证加密的 字符串。 户可以根据的response来检 己的 字符串是否正确。返回示例:
    1. <?xml version= span"1.0" span span?>
    2. <Error>
    3. <Code>
    4. SignatureDoesNotMatch
    5. </Code>
    6. <Message>
    7. The request signature we calculated does not match the signature you provided. Check your key and signing method. span
    8. </Message>
    9. <StringToSignBytes>
    10. 47 45 54 0a 0a 0a 57 65 64 2c 20 31 31 20 4d 61 79 20 32 30 31 31 20 30 37 3a 35 39 3a 32 35 20 47 4d 54 0a 2f 75 73 72 65 61 6c 74 65 73 74 3f 61 63 6c
    11. </StringToSignBytes>
    12. <RequestId>
    13. 1E446 60FF9B10C2
    14. </RequestId>
    15. <HostId>
    16. oss-cn-hangzhou.aliyuncs.com
    17. </HostId>
    18. <SignatureProvided>
    19. y5H7yzPsA/tP4+0tH1HHvPEwUv8= span
    20. </SignatureProvided>
    21. <StringToSign>
    22. GET
    23. Wed, 11 May 2011 07:59:25 GMT
    24. /oss-example?acl
    25. </StringToSign>
    26. <AccessKeyId>
    27. AKIAIVAKMSMOY7VOMRWQ
    28. </AccessKeyId>
    29. </Error>

提示:

  • SDK已经实现签 , 户使 SDK不需要关注签 问题。如果您想了解具体语言的 实现,请参考 SDK的代码。 SDK签 实现的文 如下表:
SDK 签 实现
Java SDK RequestSigner.java
Python SDK ssRequestSigner.cs
PHP SDK ssClient.php
C SDK oss_auth.c
JavaScript SDK client.js
Go SDK util.rb
iO SDK Model.m
Android SDK Utils.java
  • 当您 己实现签 ,访问报 SignatureDoesNotMatch 错误时,请使 a href="https://bbs.aliyun.com/read/23385 >可视化 工具 确认 并排除错误。

  1. Content- spanMD5的计算
  2. 以消息内容为"123456789" span来 ,计算这个字符串的Content- spanMD5
  3. 正确的计算方式:
  4. 标准中定义的算法简单点 就是:
  5. 1. span 先计算MD5加密的二进 数组(128位)。
  6. 2. span 再对这个二进 进行base64 span编码(而不是对32位字符串编码)。 span
  7. Python为例子:
  8. 正确计算的代码为:
  9. >>> spanimport span base64 span, spanhashlib
  10. >>> hash = span hashlib. spanmd5() span
  11. >>> hash. spanupdate( span"0123456789" span) span
  12. >>> base64 span. spanb64encode span( spanhash. spandigest span()) span
  13. 'eB5eJF1ptWaXm4bijSPyxw=='
  14. 需要注意 span
  15. 正确的是:hash. spandigest span(),计算出进 数组(128位)
  16. >>> hash. spandigest span()
  17. 'x\x1e^$]i\xb5f\x97\x9b\x86\xe2\x8d#\xf2\xc7'
  18. 常见错误是直接对计算出的32位字符串编码进行base64 span编码。
  19. 例如,错误的是:hash. spanhexdigest span(),计算得到可见的32位字符串编码
  20. >>> hash. spanhexdigest span()
  21. '78 e5e245d69b566979b86e28d23f2c7'
  22. 错误的MD5值进行base64 span编码后的结果:
  23. >>> base64 span. spanb64encode span( spanhash. spanhexdigest span()) span
  24. 'NzgxZTVlMjQ1ZDY5YjU2Njk3OWI4NmUyOGQyM2YyYzc='
div>
a class="ribbon-btn weibo-btn" target="_blank" href="http://service.weibo.com/share/share.php?title=推荐一篇阿里云 i class="ribbon-btn-icon dbl-icon-base-sina"> /a> a class="ribbon-btn weixin-btn" href="javascript:void(0);" data-tooltip-content="#tooltip_content"> i class="ribbon-btn-icon dbl-icon-base-weixin"> /a> a class="ribbon-btn favorite-btn " title="收藏本 i class="ribbon-btn-icon dbl-icon-base-wujiaoxing"> /a> a class="ribbon-btn download-btn " target="_blank" href="http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/pdf/oss-api-cn-zh-2017-11-20.pdf" title="下载API 参考 i class="ribbon-btn-icon dbl-icon-base-xiazai"> /a>
div class="help-category-expand-right">