如何创建有效的S3预签名POST请求?签名不匹配问题排查
问题原因及解决办法
你的表单字段与预签名POST返回的fields不匹配,这是导致签名验证失败的核心问题:
错误的字段处理
- 你手动添加了
AWSAccessKeyId字段,但预签名POST返回的是X-Amz-Credential,无需单独提供AccessKeyId - 你使用了小写的
policy和signature,但返回的是大写开头的Policy和X-Amz-Signature,S3对字段名大小写敏感 - 遗漏了
X-Amz-Algorithm、X-Amz-Date这两个必填字段
- 你手动添加了
正确的表单写法
需完全复用预签名POST返回的所有fields字段,不要自行修改或增减。正确代码如下:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <form action="https://my-bucket.s3.us-east-1.amazonaws.com/" method="post" enctype="multipart/form-data"> <!-- 完全复制返回的fields里的所有键值对 --> <input type="hidden" name="bucket" value="my-bucket" /> <input type="hidden" name="X-Amz-Algorithm" value="AWS4-HMAC-SHA256" /> <input type="hidden" name="X-Amz-Credential" value="AKIA4V7ALGPKSB2AEP4E/20230515/us-east-1/s3/aws4_request" /> <input type="hidden" name="X-Amz-Date" value="20230515T032603Z" /> <input type="hidden" name="key" value="my-key" /> <input type="hidden" name="Policy" value="eyJleHBpcmF0aW9uIjoiMjAyMy0wNS0xNVQwNDoyNjowM1oiLCJjb25kaXRpb25zIjpbeyJidWNrZXQiOiJteS1idWNrZXQifSx7IlgtQW16LUFsZ29yaXRobSI6IkFXUzQtSE1BQy1TSEEyNTYifSx7IlgtQW16LUNyZWRlbnRpYWwiOiJBS0lBNFY3QUxHUEtTQjJBRVA0RS8yMDIzMDUxNS91cy1lYXN0LTEvczMvYXdzNF9yZXF1ZXN0In0seyJYLUFtei1EYXRlIjoiMjAyMzA1MTVUMDMyNjAzWiJ9LHsia2V5IjoibXkta2V5In1dfQ==" /> <input type="hidden" name="X-Amz-Signature" value="594df7cd680b04c99dcf48a105e15c6d1f8109d1c6b61be98420b03d20979a40" /> <input type="file" name="file" /> <br /> <input type="submit" name="submit" value="Upload to Amazon S3" /> </form> </body> </html>
- 额外注意
- 确保所有字段的名称、大小写和值都与返回的
fields完全一致,任何修改都会导致签名验证失败 - 检查预签名POST的有效期(可解码
Policy查看过期时间),过期后需重新生成预签名参数
- 确保所有字段的名称、大小写和值都与返回的
内容的提问来源于stack exchange,提问作者Bill Barrington
相关产品推荐
相关产品推荐

