AWS API请求签名不匹配问题求助(附CFML代码)
排查AWS API InvalidSignature错误的关键点
1. 请求方法不匹配(最优先级)
你的签名生成参数中args.requestMethod='GET',但实际发送请求用的是<cfhttp method="put">——这会导致签名计算使用的HTTP方法与实际请求完全不符,直接引发签名不匹配。必须确保签名生成时的请求方法和实际请求完全一致(注意AWS签名要求HTTP方法为大写,比如PUT)。
2. 规范字符串(Canonical String)对比
AWS返回的提示中给出了预期的规范字符串,你需要将自己生成的规范字符串与这个值逐一对比,定位差异点:
- 核对HTTP方法是否完全一致
- 检查请求URI是否与实际请求的URI完全匹配(包括路径参数、查询参数的顺序,AWS要求查询参数按字典序排序)
- 确认签名生成时的
args.requestHeaders是否包含了实际发送的所有需签名的请求头(比如X-Amz-Date,若x-amz-access-token属于需签名的头也必须包含) - 检查Payload处理:
args.signedPayload=true时,需确认签名计算用的Payload哈希与实际发送的请求体哈希一致;如果PUT请求实际带有请求体,不能将args.requestBody设为空字符串。
3. 签名核心参数校验
- AWS密钥:确认用于生成签名的AWS Secret Access Key与对应的Access Key ID匹配且有效
- 日期时间:
args.amzDate、args.dateStamp必须与请求头X-Amz-Date完全一致,格式需符合AWS标准(例如YYYYMMDD'T'HHMMSS'Z') - 区域与服务名:
args.regionName='us-east-1'和args.serviceName='execute-api'必须与目标API Gateway的部署区域、服务类型完全匹配 - Host头:
args.hostName需与实际请求的Host头一致,即API Gateway的域名
4. 请求URL与签名URI一致性
检查args.requestURI是否与<cfhttp>的url中的路径部分完全一致:如果URL包含查询参数,需确认这些参数已在args.requestParams中正确声明,且按字典序排序后纳入规范字符串计算。
5. 细节校验
- 避免参数中存在多余空格、大小写错误(HTTP方法必须大写,请求头名称在签名计算时需保持统一,AWS会将头名转为小写处理)
- 若使用临时凭证(如
x-amz-access-token),需确认凭证有效,且签名生成时已正确处理会话令牌(若有要求)
内容的提问来源于stack exchange,提问作者Sajjad
相关产品推荐
相关产品推荐

