对象存储服务 OBS-签名不匹配(SignatureDoesNotMatch)如何处理:解决方法

时间:2024-05-21 18:02:16

解决方法

  1. 检查endpoint

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

    正确的endpoint格式为obs.regionID.myhuaweicloud.com,当用户将endpoint错误地填写为桶访问域名(bucketname.obs.regionID.myhuaweicloud.com),即在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参数是否一致。

      如果使用URL签名计算工具,工具中Expires参数设置的是一个时间段,以秒为单位,比如一小时为3600。工具最终生成的URL中的Expires值为有效期的最后时间点。

  5. 检查头域

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

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

  6. 检查Canonicalized Resource

    Canonicalized Resource表示请求访问的obs资源,请严格按照API文档中Canonicalized Resource参数的规范设置。详情请参见Header中携带签名URL中携带签名

  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编码才能得到最终的签名。

  9. 签名验证方法请参见用户签名验证
support.huaweicloud.com/obs_faq/obs_faq_0173.html