更新时间:2024-03-04 GMT+08:00

签名不匹配(SignatureDoesNotMatch)如何处理

问题现象

调用OBS API报如下错误:

状态码:403 Forbidden

错误码:SignatureDoesNotMatch

错误信息:The request signature we calculated does not match the signature you provided. Check your key and signing method.

问题原因

请求中携带的签名与系统计算得到的签名不一致。

解决方法

  1. 检查endpoint

    使用OBS SDK时需要检查此项。

    需要确保填写的endpoint正确,当用户将endpoint错误地填写为桶访问域名,即在endpoint前多加了桶名,也会报签名不匹配错误。

  2. 检查AK、SK

    请确保AK、SK输入正确,成对匹配,且与请求所用AK、SK保持一致。

  3. 检查HTTP-Verb

    签名所用HTTP-Verb与请求所用HTTP-Verb保持一致。

  4. 检查Date/Expires

    • Header中携带签名:检查签名所用Date与请求头域所带Date是否一致。
    • URL中携带签名:检查签名所用Expires与请求URL中的Expires参数是否一致。

  5. 检查头域

    检查Content-MD5、Content-Type、Canonicalized Headers,如果计算签名时有包含在内,发送请求时也必须带上对应的头域。

    如果直接在浏览器中使用携带签名的URL访问OBS资源,因为这种方式不能携带头域参数,故在计算签名时也不能携带此类头域。

  6. 检查Canonicalized Resource

    Canonicalized Resource表示请求访问的obs资源,请严格按照API文档中Canonicalized Resource参数的规范设置。

  7. 检查StringToSign

    StringToSign的构造规则为:

    • Header中携带签名:
      HTTP-Verb + "\n" + Content-MD5 + "\n" + Content-Type + "\n" + Date + "\n" + CanonicalizedHeaders + CanonicalizedResource
    • URL中携带签名:
      HTTP-Verb + "\n" + Content-MD5 + "\n" + Content-Type + "\n" + Expires + "\n" + CanonicalizedHeaders + CanonicalizedResource

    值为空的参数处直接换行。

  8. 检查签名算法

    签名的计算方法:

    1. 构造请求字符串(StringToSign);
    2. 对第一步的结果进行UTF-8编码;
    3. 使用SK对第二步的结果进行HMAC-SHA1签名计算;
    4. 对第三步的结果进行Base64编码,header中携带的签名到此得到最终的签名;
    5. URL中携带的签名还需要对第4步的结果进行URL编码才能得到最终的签名。