文档中心 > 对象存储 OSS

自签名计算失败

更新时间: 访问次数:1938

问题描述

通过 Header或者 URL自签名计算 Signature时,经常会遇到签名计算失败,报错类似如下。
1
The request signature we calculated does not match the signature you provided.

问题原因

自签名使用有误。

解决方案

此处介绍如何使用PutObjectAPI签名并上传Object资源,请参考并尝试重新自签名。
 

PutObjectAPI使用说明

执行如下命令,查看PutObject.py工具的使用帮助。
1
python PutObject.py -h
系统显示类似如下。
1
Usage: PutObject.py [options]<br>Options:<br>  -h, --help  展示帮助文档 <br>  -i AK       客户控制台上云账号或者RAM子账号的Accesskey,必选项<br>  -k SK       客户控制台上云账号或者RAM子账号的AccessKeySecrety,必选项<br>  -e ED       OSS Endpoint地址,OSS控制台概述上可以看到,必选项<br>  -b BK       OSS Bucket名称,必选项<br>  -o OBJECTS  上传到OSS的Object名称,必选项<br>  -f FI       读取本地文件的路经,必选项
参考如下命令,通过PutObject.py工具上传资源文件。
1
python PutObject.py -i Access_Key_XXX -k Access_Key_Secret_XXX -e oss-cn-shanghai.aliyuncs.com -b yourBucket -f localfile.txt -o aliyun.txt

 

请求头

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

 

响应头

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

 

注意事项

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

 

更多信息

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

适用于

  • 对象存储 OSS

如果您的问题仍未解决,您可以在阿里云社区 提交工单联系阿里云技术支持。

FAQ

关于此文档暂时还没有FAQ
返回
顶部