签名不匹配(SignatureDoesNotMatch)如何处理
问题现象
调用OBS API报如下错误:
状态码:403 Forbidden
错误码:SignatureDoesNotMatch
错误信息:The request signature we calculated does not match the signature you provided. Check your key and signing method.
问题原因
请求中携带的签名与系统计算得到的签名不一致。
解决方法
- 检查endpoint
使用OBS SDK时需要检查此项。
正确的endpoint格式为obs.regionID.myhuaweicloud.com,当用户将endpoint错误地填写为桶访问域名(bucketname.obs.regionID.myhuaweicloud.com),即在endpoint前多加了桶名,也会报签名不匹配错误。
- 检查AK、SK
请确保AK、SK输入正确,成对匹配,且与请求所用AK、SK保持一致。
- 检查HTTP-Verb
签名所用HTTP-Verb与请求所用HTTP-Verb保持一致。
- 检查Date/Expires
- Header中携带签名:检查签名所用Date与请求头域所带Date是否一致。
- URL中携带签名:检查签名所用Expires与请求URL中的Expires参数是否一致。
如果使用URL签名计算工具,工具中Expires参数设置的是一个时间段,以秒为单位,比如一小时为3600。工具最终生成的URL中的Expires值为有效期的最后时间点。
- 检查头域
检查Content-MD5、Content-Type、Canonicalized Headers,如果计算签名时有包含在内,发送请求时也必须带上对应的头域。
如果直接在浏览器中使用携带签名的URL访问OBS资源,因为这种方式不能携带头域参数,故在计算签名时也不能携带此类头域。
- 检查Canonicalized Resource
Canonicalized Resource表示请求访问的obs资源,请严格按照API文档中Canonicalized Resource参数的规范设置。详情请参见Header中携带签名或URL中携带签名。
- 检查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
值为空的参数处直接换行。
- Header中携带签名:
- 检查签名算法
签名的计算方法:
- 构造请求字符串(StringToSign);
- 对第一步的结果进行UTF-8编码;
- 使用SK对第二步的结果进行HMAC-SHA1签名计算;
- 对第三步的结果进行Base64编码,header中携带的签名到此得到最终的签名;
- URL中携带的签名还需要对第4步的结果进行URL编码才能得到最终的签名。
- 签名验证方法请参见用户签名验证。