背景

出现 signature 一般出现客户端自签名调 API 的操作中, signature 的计算稍微复杂点,建议最好用 SDK 来替代计算的过程和多样性。如果业务强需求,先要读懂如果计算 signature。

签名分类

Header 头中携带签名。

https://help.aliyun.com/document_detail/31951.html?spm=a2c4g.11174283.6.1078.40437da2HGkyMH

URL 中携带签名。

https://help.aliyun.com/document_detail/31952.html?spm=a2c4g.11186623.6.1079.7b61734cNAir2U

签名区别

Header URL
不支持设置 expires 支持设置 expires
常用 method GET、POST、PUT 常用 method GET、PUT
date 时间是 GMT 格式 date 替换成 expires 变成时间戳
signature 不需要 URL encode signature 需要 URL encode

计算签名 demo

当客户通过 header 或者 URL 中自签名计算 signature 时,经常会遇到计算签名失败 “The request signature we calculated does not match the signature you provided” ,可以参考以下 demo 演示了如何调用 API 自签名时上传 Object 到 OSS,注意签名和 header 加入的内容。

#! /us/bin/envy python
#Author: hanli
#Update: 2018-09-29from optparse import OptionParser
import urllib, urllib2
import datetime
import base64
import hmac
import sha
import os
import sys
import timeclass Main():# Initial input parsedef __init__(self,options):self.ak = options.akself.sk = options.skself.ed = options.edself.bk = options.bkself.fi = options.fiself.oj = options.objectsself.left = '\033[1;31;40m'self.right = '\033[0m'self.types = "application/x-www-form-urlencoded"    self.url = 'http://{0}.{1}/{2}'.format(self.bk,self.ed,self.oj)# Check client input parsedef CheckParse(self):if (self.ak and self.sk and self.ed and self.bk and self.oj and self.fi) != None:if str(self.ak and self.sk and self.ed and self.bk and self.oj and self.fi):self.PutObject()else:self.ConsoleLog("error","Input parameters cannot be empty")# GET local GMT timedef GetGMT(self):SRM = datetime.datetime.utcnow()GMT = SRM.strftime('%a, %d %b %Y %H:%M:%S GMT')return GMT# GET Signaturedef GetSignature(self):mac = hmac.new("{0}".format(self.sk),"PUT\n\n{0}\n{1}\n/{2}/{3}".format(self.types,self.GetGMT(),self.bk,self.oj), sha)Signature = base64.b64encode(mac.digest())return Signature# PutObjectdef PutObject(self):try: with open(self.fi) as fd:files = fd.read()except Exception as e:self.ConsoleLog("error",e)try:request = urllib2.Request(self.url, files)request.add_header('Host','{0}.{1}'.format(self.bk,self.ed))request.add_header('Date','{0}'.format(self.GetGMT()))request.add_header('Authorization','OSS {0}:{1}'.format(self.ak,self.GetSignature()))request.get_method = lambda:'PUT'response = urllib2.urlopen(request,timeout=10)fd.close()self.ConsoleLog(response.code,response.headers)except Exception,e:self.ConsoleLog("error",e)# output error logdef ConsoleLog(self,level=None,mess=None):if level == "error":sys.exit('{0}[ERROR:]{1}{2}'.format(self.left,self.right,mess))else:sys.exit('\nHTTP/1.1 {0} OK\n{1}'.format(level,mess))if __name__ == "__main__":parser = OptionParser()parser.add_option("-i",dest="ak",help="Must fill in Accesskey")parser.add_option("-k",dest="sk",help="Must fill in AccessKeySecrety")parser.add_option("-e",dest="ed",help="Must fill in endpoint")parser.add_option("-b",dest="bk",help="Must fill in bucket")parser.add_option("-o",dest="objects",help="File name uploaded to oss")parser.add_option("-f",dest="fi",help="Must fill localfile path")(options, args) = parser.parse_args()handler = Main(options)handler.CheckParse()

请求头:

PUT /yuntest HTTP/1.1
Accept-Encoding: identity
Content-Length: 147
Connection: close
User-Agent: Python-urllib/2.7
Date: Sat, 22 Sep 2018 04:36:52 GMT
Host: yourBucket.oss-cn-shanghai.aliyuncs.com
Content-Type: application/x-www-form-urlencoded
Authorization: OSS B0g3mdt:lNCA4L0P43Ax

响应头:

HTTP/1.1 200 OK
Server: AliyunOSS
Date: Sat, 22 Sep 2018 04:36:52 GMT
Content-Length: 0
Connection: close
x-oss-request-id: 5BA5C6E4059A3C2F
ETag: "D0CAA153941AAA1CBDA38AF"
x-oss-hash-crc64ecma: 8478734191999037841
Content-MD5: 0MqhU5QbIp3Ujqqhy9o4rw==
x-oss-server-time: 15

注意

  • Signature 中所有加入计算的参数都要放在 header 中,保持 header 和 Signature 一致。
  • PUT 上传时,Signature 计算的 Content-Type 必须是 application/x-www-form-urlencoded 。
  • 通过header 方式进行签名认证时无法设置过期时间。目前只有 SDK 、URL 签名支持设置过期时间。

使用问题

案例:通过微信小程序请求 OSS 返回签名失败,通过浏览器正常

分析:

  • 只要通过浏览器访问,鉴权通过就证明 OSS 的签名校验是正常的没有问题,可以先排除掉 OSS 端。
  • 客户端一定要在微信小程序上部署 HTTP 抓包,对后续分析很重要,抓包中可以看到所有的请求头和请求参数。
  • 通过浏览器访问时的 HTTP 抓包。

  • 通过 403 和 200 的抓包反复对比发现,通过小程序发出的 HTTP 请求和浏览器发起的 HTTP 请求的 URL 、signature、expires 都一样,唯一的区别就是微信小程序携带了 Content-type ,而通过 Chrom 的请求是没有携带 Content-type,怀疑矛头指向了这里。
  • 经过代码确认,发现 signature 计算时是没有包含 Content-tpye 头的,而小程序发起的请求携带的 Content-tpye ,OSS 收到后会按照携带了 Content-tpye 去计算 signature ,所以每次计算都不一样。

遇到类似问题,抓包是最能快速看到问题的。同时也必须要了解下 OSS 请求 header 中携带了 Content-tpye ,那么 signature 计算就要加上 Content-tpye ,保持一致。

案例:通过多个语言版本 OSS SDK 测试,在使用 CDN 结合 OSS 用法时,客户端使用 CDN 域名计算 signature,发起 HEAD 请求,OSS 收到后返回 403 ;

分析:

出现这个问题不区分什么 SDK 都会出现,问题原因是由于客户端发起的 HEAD 请求在通过 CDN 回原到 OSS 时,CDN 回原是用的 GET 请求,而 OSS 收到时就用 GET 请求方式去计算签名,得到的结果肯定和客户端计算不一致,可以升级到阿里云 CDN 处理。以上分析只适合上述场景。

问题可以通过 tcpdump 抓包或者 Wireshark 对比一下即可知道。

OSS signature 计算相关推荐

  1. oss上传判断_OSS

    前言 本文档是阿里云存储服务(OSS)的开发帮助指南,描述了OSS中的基本概念.提供的服务以及可用的API. 阿里云存储服务(OpenStorageService,简称OSS),是阿里云对外提供的海量 ...

  2. 函数计算如何帮助语雀构建稳定且安全的业务架构?

    简介:语雀是一个专业的云端知识库,用于团队的文档协作.现在已是阿里员工进行文档编写和知识沉淀的标配,并于 2018 年开始对外提供服务. 客户介绍 语雀是一个专业的云端知识库,用于团队的文档协作.现在 ...

  3. 函数计算助力语雀构建稳定且安全的业务架构

    简介: 语雀是一个专业的云端知识库,用于团队的文档协作.现在已是阿里员工进行文档编写和知识沉淀的标配,并于 2018 年开始对外提供服务. 客户介绍 语雀是一个专业的云端知识库,用于团队的文档协作.现 ...

  4. 阿里云点播 web 播放器

    浅谈 最近遇到很多人使用阿里云点播 web 播放器,通过 STS 令牌的方式去播放 MTS 转码完成后的资源出现问题,"路见不平一声吼,写个过程先献丑",只是做了最基础的功能,看官 ...

  5. 轻松构建基于 Serverless 架构的弹性高可用音视频处理系统

    作者 | 罗松(西流) 阿里巴巴技术专家 本文整理自架构师成长系列 2 月 12 日直播课程. 关注"阿里巴巴云原生"公众号,回复 "212",即可获取对应直播 ...

  6. 10倍性能提升!DLA SQL推出基于Alluxio的数据湖分析加速功能

    简介:在存储计算分离的场景下,通过网络从远端存储读取数据是一个代价较大的操作,往往会带来性能的损耗.以OSS为例,OSS数据读取延时通常较本地磁盘大很多,同时OSS对单个用户使用的带宽上限做了限制,这 ...

  7. AWS s3 V4签名算法

    原创,转载请注明:http://www.jianshu.com/p/a6a02309190f 一.开篇说明: 以下思考方向,是以Android端为出发点(IOS同理) AWS:Amazon Web S ...

  8. 轻松构建基于 Serverless 架构的弹性高可用视频处理系统

    前言 随着计算机技术和 Internet 的日新月异,视频点播技术因其良好的人机交互性和流媒体传输技术倍受教育.娱乐等行业青睐,而在当前, 云计算平台厂商的产品线不断成熟完善, 如果想要搭建视频点播类 ...

  9. 基于阿里云物联网平台,我们这样实现简易出入监控

    本文通过一个简单实例,主要介绍了如何使用树莓派快速接入阿里云iot platform,并实现了一个简易的监控人员出入并拍照上送钉钉群的场景 场景 在公司大门入口处布点树莓派和红外感应,实现出入口人员出 ...

最新文章

  1. 上帝视角:程序员为什么需要理解 CPU?
  2. java读取properties文件,深度集成!
  3. 25 linux ndk 头文件_正点原子Linux第二十五章RTC实时时钟实验
  4. 常见的面向对象的面试题(附答案)
  5. java课程设计进程管理_GitHub - Shadow-Java/OS: 操作系统课程设计,关键词:进程同步与互斥、进程死锁、LRU页面替换算法、时间片轮转算法、时钟等...
  6. python实例[判断操作系统类型]
  7. Kalman filter—直观理解
  8. BAT智能硬件布局 争搭平台卡位各异
  9. 云原生系列三:K8s应用安全加固技术
  10. 超详细的gnuplot使用教程【2】
  11. vue 中provide的用法_vue 中的 provide 和 inject 用法
  12. 中国基金业协会网站资产管理业务综合报送平台-数据爬取
  13. 笔记本计算机排名2015,2015性价比高的笔记本电脑排行榜
  14. 那个全是成人游戏的Steam平台,可能真的要凉了!
  15. 各种进制之间的转换方法
  16. 物联网周刊(第 1 期):电动汽车的未来
  17. iOS 连接外设的几种方式
  18. 【JVM翻译系列】「官方技术翻译」《A FIRST LOOK INTO ZGC》初探JVM-ZGC垃圾回收器
  19. excel 数据的有效性检查
  20. 【TouchYourself】需求文档

热门文章

  1. Android一键拍照功能
  2. python读取图像的方法总结
  3. Java的ClassLoader加载是怎么保证安全的?
  4. 《HelloGitHub》第 85 期
  5. 【牛客】Old Bill(C语言)
  6. MySQL 的 MVCC 原理详解
  7. 数字图像处理:直方图匹配或规定化Histogram Matching (Specification)原理及感悟
  8. 遥感在农业方面的应用_来源价格天地公众号
  9. ios学习--iphone ipa打包文件制作
  10. JS 实现替换字符串中所有指定字符总结