更新时间:2026-05-28 GMT+08:00
分享

SignatureDoesNotMatch

The request signature we calculated does not match the signature you provided. Check your key and signing method.

报错描述

请求签名在服务端的计算结果与您提供的结果不匹配。

报错原因

服务端计算的请求签名与您提供的签名不匹配。基于签名计算原理,签名不匹配通常为以下原因:

1. 服务端构造的StringToSign与客户端构造的不同。

2. 服务端使用的访问密钥AK/SK与客户端使用的不同。

处理建议

  1. 比较服务端返回的StringToSign与客户端的StringToSign,确认是否存在差异。

    • 获取服务端StringToSign:以下为签名校验失败时的响应消息示例,其中返回的StringToSign字段为服务端的算签StringToSign
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <Error>
        <Code>SignatureDoesNotMatch</Code>
        <Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
        <RequestId>0000019D84FF590E53066166B2E432FD</RequestId>
        <HostId>Z9v+cC1sRnaWw6x0vi8pxxYA0YVnKxbYHUPAFpnxkX8sLV44u5b02Z+ailn2wCnR</HostId>
        <AccessKeyId>HPUAOE5BNDL3VBPXXXXX</AWSAccessKeyId>
        <SignatureProvided>mNANUaYHwfGRo9DSYPLhLdrCitAAAA</SignatureProvided>
        <StringToSign>PUT
      
      
        Mon, 13 Apr 2026 04:00:10 +0000
        /bucket01</StringToSign>
        <StringToSignBytes>50 55 54 0a 0a 0a 4d 6f 6e 2c 20 31 33 20 41 70 72 20 32 30 32 36 20 30 34 3a 30 30 3a 31 30 20 2b 30 30 30 30 0a 2f 62 75 63 6b 65 74 30 31</StringToSignBytes>
      </Error>
      
    • 获取客户端StringToSign:
      以下为打印客户端StringToSign的Java示例代码片段,完整示例代码参见创建桶签名计算
      /** 根据请求计算签名**/
      String contentMD5 = "";
      String canonicalizedHeaders = "";
      String canonicalizedResource = "/bucket001/";
      // Content-MD5 、Content-Type 没有直接换行, data格式为RFC 1123,和请求中的时间一致
      String canonicalString = "PUT" + "\n" + contentMD5 + "\n" + contentType + "\n" + requesttime + "\n" + canonicalizedHeaders + canonicalizedResource;
      System.out.println("StringToSign:[" + canonicalString + "]");

  2. 如果存在差异,则调整StringToSign使其与服务端一致。
  3. 检查客户端算签使用的访问密钥AK/SK,与服务端算签使用的AK/SK是否保持一致。

    • 获取服务端算签AK/SK:查看响应消息中的AccessKeyId字段。
    • 获取客户端算签AK/SK:查看客户端代码中,计算签名使用的AK/SK。

  4. 如果存在差异,则调整访问密钥AK/SK,使服务端与客户端一致。
  5. 确保StringToSign和访问密钥AK/SK都一致后,重新计算签名

示例:StringToSign缺失部分元素导致算签不匹配

假设请求通过头域携带签名,服务端StringToSign为:

1
2
3
4
5
6
PUT


Mon, 13 Apr 2026 04:00:10 +0000
x-obs-acl:public-read-write
/bucket01

客户端StringToSign为:

1
2
3
4
5
PUT


Mon, 13 Apr 2026 04:00:10 +0000
/bucket01

通过对比可以发现客户端的StringToSign缺少了第5行的内容:x-obs-acl:public-read-write

因此可以确定算签失败的原因是客户端算签时缺少了CanonicalizedHeaders元素。请参考Header中携带签名中CanonicalizedHeaders的说明对所有相关头域进行处理。

示例:请求包含query参数时算签不匹配

假设请求通过头域携带签名,服务端StringToSign为:

1
2
3
4
5
PUT


Mon, 13 Apr 2026 04:00:10 +0000
/bucket01?acl

客户端StringToSign为:

1
2
3
4
5
PUT


Mon, 13 Apr 2026 04:00:10 +0000
/bucket01

通过对比可以发现客户端StringToSign的第5行内容缺少了"?acl"。

因此可以确定算签失败的原因是客户端算签时忽略了query参数(URI参数),导致最终构建的CanonicalizedResource错误。请参考Header中携带签名中CanonicalizedResource的说明进行处理。

示例:工具识别访问域名失败导致算签不匹配

假设请求通过头域携带签名,当服务端StringToSign为:

1
2
3
4
5
PUT


Mon, 13 Apr 2026 04:00:10 +0000
/bucket01/obj1

客户端StringToSign为:

1
2
3
4
5
PUT


Mon, 13 Apr 2026 04:00:10 +0000
/bucket01.obs.cn-north-4.myhuaweicloud.com/obj1

通过对比可以发现客户端StringToSign的第5行内容中桶名不同,客户端的内容中还包含了访问域名(Endpoint):obs.cn-north-4.myhuaweicloud.com。

算签失败的原因是客户端算签时将整个访问域名作为桶名一部分进行算签,此类错误一般是因为客户端代码无法识别OBS域名obs.RegionID.myhuaweicloud.com,因此无法分解出正确桶名进行算签。正确的CanonicalizedResource不应该包含访问域名。请参考Header中携带签名中CanonicalizedResource的说明进行处理。

示例:用URL的方式携带签名时算签不匹配

假设请求通过URL携带签名,服务端StringToSign为:

1
2
3
4
5
PUT


1532779451
/bucket01

客户端StringToSign为:

1
2
3
4
5
PUT


Mon, 13 Apr 2026 04:00:10 +0000
/bucket01

通过对比可以发现客户端StringToSign的第4行内容与服务端的不同。这是因为通过URL和Header携带签名时StringToSign的构造方式略有差异:通过URL携带签名时应使用Expires字段进行算签。具体请参考URL中携带签名中Expires参数的说明进行处理。

示例:使用自定义域名访问时算签不匹配

假设请求通过头域携带签名,当服务端StringToSign为:

1
2
3
4
5
PUT


Mon, 13 Apr 2026 04:00:10 +0000
/custom_domain_name.com/obj1

客户端StringToSign为:

1
2
3
4
5
PUT


Mon, 13 Apr 2026 04:00:10 +0000
/bucket01/obj1

通过对比发现,问题原因是客户端StringToSign使用了真实的桶名进行算签,而实际应该使用自定义域名进行算签。请参考Header中携带签名中CanonicalizedResource的说明进行处理。

示例:使用自定义域名访问时,由于代理转发错误,导致算签不匹配

假设请求通过头域携带签名,当服务端StringToSign为:

1
2
3
4
5
PUT


Mon, 13 Apr 2026 04:00:10 +0000
/obj1

客户端StringToSign为:

1
2
3
4
5
PUT


Mon, 13 Apr 2026 04:00:10 +0000
/custom_domain_name.com/obj1

报错原因:

通过对比发现,服务端构建的CanonicalizedResource中没有包含自定义域名。可能的原因如下:

  • 原因1:DNS解析配置错误。如下图所示,DNS解析自定义域名时返回了错误的IP地址,导致请求发送到了错误的OBS服务器上。服务器无法识别请求中的自定义域名,导致签名计算错误,验签失败。

  • 原因2:代理配置错误。如下图所示,代理将请求转发到了错误的OBS服务器。服务器无法识别请求中的自定义域名,导致签名计算错误,验签失败。

  • 原因3:自定义域名尚未与桶进行绑定,导致服务端无法识别该自定义域名。

处理建议:

  • 针对原因1:检查自定义域名的DNS解析配置是否正确。您可以:
  • 针对原因2:检查客户端请求是否通过代理进行转发,并且代理服务器配置是否正确。需确保转发到准确的桶IP地址,如配置不正确请修正。
  • 针对原因3:请为桶绑定自定义域名,详情参考通过自定义域名访问桶

相关操作:

获取桶IP地址:

  1. 打开cmd运行窗口。
  2. 输入命令:

    ping 桶的默认域名

    桶的默认域名格式为“BucketName.obs.RegionID.myhuaweicloud.com”,其中BucketName为桶名,RegionID为桶所在的区域ID

  3. 获取窗口中回显的桶IP地址。

The chunk signature we calculated does not match the signature you provided.

报错描述

使用V4签名的多chunk请求时,在服务端计算的chunk-signature与您提供的不匹配。

报错原因

可能的原因有以下几种:

  1. 客户端计算chunk-signature的方式错误。
  2. 传输过程中数据被篡改。

处理建议

  1. 重新检查客户端计算chunk-signature的方式是否正确。
  2. 检查请求链路是否安全。

相关文档