开发者社区 问答 正文

自己做CSDK,在上传操作时会发生签名不匹配问题

本人想往名为tingshuo2012的bucket里面上传一个名为1.txt的文件,文件内容就只有4个字符“Thaa”。
发送报文:
PUT /tingshuo2012/1.txt HTTP/1.1
Host: storage.aliyun.com
Cache-control: no-cache
Content-Encoding: utf-8
Date: Sat, 08 Sep 2012 08:47:22 GMT
Content-Type: text/plain
Content-Length: 4
Authorization: OSS ACSB62Mi3KGB9qMU:7xOua IVfNBz6TKY5u tmFPaT8c=
Thaa
其中未用hmac和base64加密前的字段为:
PUT
F74FE9B1783C5A8547266A0C35EF1189
text/plain
Sat, 08 Sep 2012 08:47:22 GMT
/tingshuo2012/1.txt
接收回来的报文为:
HTTP/1.1 403 Forbidden
Date: Sat, 08 Sep 2012 08:47:06 GMT
Content-Type: application/xml
Connection: close
Content-Length: 772
Server: AliyunOSS
x-oss-request-id: 504B060A709EB3AB0C47465B
<?xml version="1.0" encoding="UTF-8"?>
<Error>
  <Code>SignatureDoesNotMatch</Code>
  <Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
  <StringToSignBytes>50 55 54 0A 0A 74 65 78 74 2F 70 6C 61 69 6E 0A 53 61 74 2C 20 30 38 20 53 65 70 20 32 30 31 32 20 30 38 3A 34 37 3A 32 32 20 47 4D 54 0A 2F 74 69 6E 67 73 68 75 6F 32 30 31 32 2F 31 2E 74 78 74 </StringToSignBytes>
  <SignatureProvided>7xOua IVfNBz6TKY5u tmFPaT8c=</SignatureProvided>
  <StringToSign>PUT
text/plain
Sat, 08 Sep 2012 08:47:22 GMT
/tingshuo2012/1.txt</StringToSign>
  <OSSAccessKeyId>ACSB62Mi3KGB9qMU</OSSAccessKeyId>
  <RequestId>504B060A709EB3AB0C47465B</RequestId>
  <HostId>storage.aliyun.com</HostId>
</Error>
请问签名格式有什么问题吗?Content-MD5的值是正确的,和下载相同文件所得的值是一样的,求大虾指导

展开
收起
wangweiyan2007 2012-09-08 17:10:16 8733 分享 版权
阿里云 AI 助理回答

从您提供的信息来看,问题出在签名不匹配(SignatureDoesNotMatch),这意味着您计算的签名与阿里云OSS期望的签名不符。这通常涉及到几个可能的问题点:

  1. AccessKey和SecretKey是否正确:请确保您使用的ACS和密钥对是正确的,并且有权限访问指定的Bucket。

  2. 签名方法:根据错误提示,检查您的签名生成算法是否符合阿里云OSS的要求。阿里云OSS使用的是HMAC-SHA1算法来生成签名。请确认您的实现细节,包括:

    • 正确地构造了待签名字符串(包括HTTP Method、Content-MD5、Content-Type、Date以及Canonicalized OSS Headers和Canonicalized Resource)。
    • 使用正确的SecretKey进行HMAC-SHA1计算。
    • 计算后得到的原始签名值需要经过Base64编码才能放入Authorization头中。
  3. 时间同步:服务器的时间与阿里云服务器的时间差异不能太大,建议检查系统时间是否同步,以避免因时间戳不同步导致的签名失效。

  4. Content-Type和Content-Length:虽然这个错误不一定直接关联到这两个头部,但确保它们的值是准确的也很重要。在您的例子中,Content-Type为"text/plain",Content-Length为4,看起来是正确的,但如果文件内容或类型有误,也可能间接影响签名验证过程。

  5. Header顺序和格式:确保所有头部字段的名称小写,按照字母顺序排序(除了Authorization头),并且没有额外的空格或换行。

  6. 字符编码:确保在构建签名字符串时,所有字符都是UTF-8编码的,包括您的AccessKeyId和SecretAccessKey。

  7. MD5校验:虽然您提到Content-MD5的值是正确的,但如果是上传操作,实际上在PUT请求中并不强制要求提供Content-MD5,除非您希望OSS服务端验证上传数据的完整性。如果提供了,务必确保其正确无误。

针对您提供的具体报文,特别注意检查“SignatureDoesNotMatch”下方展示的对比信息,确保每个部分(如HTTP Method、Headers等)都完全一致且处理方式正确。

如果以上检查均未发现问题,建议参考阿里云官方文档中的签名机制再次核对签名步骤,或者尝试使用阿里云提供的SDK来简化签名过程,这样可以减少手动处理签名时的错误。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答