使用RestTemplate发送S3的HTTP GET请求出现SignatureDoesNotMatch错误的原因是什么
S3 SignatureDoesNotMatch 报错常见触发场景
完整报错信息:The request signature we calculated does not match the signature you provided. Check your key and signing method
以下是使用RestTemplate调用S3 GET接口时该报错的常见触发原因:
- 访问密钥配置错误:使用的AK(访问密钥ID)、SK(秘密访问密钥)本身填写错误,比如字符遗漏、多了前后空格;或者所用密钥已经被IAM账号禁用、删除,也会导致签名校验不通过。
- 签名算法版本不匹配:2014年之后上线的AWS区域仅支持V4版本签名,如果代码手动实现签名时用了旧的V2版本算法,或者签名算法配置和S3服务端要求不一致,就会触发报错。
- 请求头不符合签名规范:S3签名要求将指定请求头按字典序排序后参与计算,常见问题包括:
Host头值填写错误、x-amz-*前缀的自定义请求头没有全部加入签名范围、请求头值前后存在未清理的多余空格、特殊字符没有按UTF-8规范编码。 - 对象路径编码规则不一致:如果请求的S3对象Key包含空格、中文、
%、+等特殊字符,RestTemplate自动编码的规则和S3签名要求的编码规则不统一,比如空格被编码为+而不是S3要求的%20、路径分隔符/被二次编码,都会导致两端计算的签名不一致。 - 本地时间与服务端时间差过大:签名计算时使用的本地时间和AWS服务端时间差超过15分钟,会直接触发签名校验失败,常见于本地机器时钟未同步、时区配置错误的场景。
- 请求参数处理错误:GET请求的Query参数(比如
X-Amz-Expires、response-content-type等签名关联参数)没有按ASCII码排序后加入签名计算,或者多传、漏传、写错了签名范围内的参数,也会导致校验不通过。 - RestTemplate后置修改请求内容:如果RestTemplate配置的拦截器、消息转换器在签名计算完成后,自动修改了请求头、请求路径(比如自动追加
Content-Length头、对路径二次编码),会导致实际发出的请求内容和参与签名的内容不一致,触发签名不匹配。
内容的提问来源于stack exchange,提问作者Limor_Sh
相关产品推荐
相关产品推荐

