You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS V4签名请求出现SignatureDoesNotMatch错误(GET正常POST/PUT异常)

AWS S3 POST/PUT 预签名URL签名不匹配问题解决方案

问题场景:按照AWS官方文档给出的算法生成了GET请求的预签名URL,功能运行正常,但使用相同逻辑生成POST/PUT请求的预签名URL上传数据时,会出现SignatureDoesNotMatch签名不匹配错误。请求示例如下:

curl --location --request POST 'https://<bucket_name>.s3.ap-south-1.amazonaws.com/testFolder/testing1.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=<access_key_id>%2F20211006%2Fap-south-1%2Fs3%2Faws4_request&X-Amz-Date=20211006T113405Z&X-Amz-Expires=3000&X-Amz-SignedHeaders=content-type%3Bhost%3Bx-amz-content-sha256%3Bx-amz-date&X-Amz-Signature=' \
--header 'x-amz-content-sha256: UNSIGNED-PAYLOAD' \
--header 'x-amz-date: 20211006T113405Z' \
--header 'Content-Type: text/plain'
  • HTTP方法不匹配:AWS签名计算时会将请求方法纳入签名字符串,生成预签名时如果沿用了GET请求的方法参数,实际发POST/PUT请求就会直接签名不匹配,这是最常见的问题。生成对应请求的预签名时必须严格使用和实际请求一致的HTTP方法。
  • 签名头与实际请求头不一致:你当前签名配置的SignedHeaders包含content-type、host、x-amz-content-sha256、x-amz-date四个头,生成签名时这四个头的取值必须和实际请求传递的值完全一致:
    • 头名称不区分大小写,但计算签名时需要统一转为小写后按字典序排序
    • content-type不能多空格、不能漏写字符,示例中用的text/plain要和生成签名时传入的值完全一致
    • host头的值要和请求域名完全匹配,不能额外加端口、路径等内容
  • Payload哈希配置不匹配:你请求中指定了x-amz-content-sha256: UNSIGNED-PAYLOAD,那生成签名时签名字符串对应的payload哈希字段也必须填写UNSIGNED-PAYLOAD,不能替换为实际上传内容的SHA256值。如果生成签名时用了实际内容的哈希,请求时要么删除UNSIGNED-PAYLOAD配置、传递对应哈希值,要么生成时就指定用UNSIGNED-PAYLOAD。
  • 查询参数排序/编码错误:生成签名时所有X-Amz-开头的查询参数必须按字典序排序后再纳入签名字符串,参数值也要严格按照AWS要求做URL编码,比如Credential中的/必须编码为%2F,编码错误或排序错误都会导致签名不匹配。
  • 额外注意:如果是使用表单形式的POST上传,和直接在URL携带签名的POST预签名生成逻辑不同,不要混用两种场景的生成算法。

内容的提问来源于stack exchange,提问作者tarunSharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 07:36:04