AWS API Gateway SigV4签名Python调用返回签名不匹配错误如何解决
错误原因
共4个问题导致签名校验失败:
- 规范URI配置错误:AWS返回的正确规范请求中URI为
/experiment-stage,但你的代码中canonical_uri被设置为/,签名计算用的路径和实际请求路径不匹配,是核心错误。 - 规范请求头缺失必签字段:你在
signed_headers中声明了需要对x-amz-content-sha256字段签名,但构建canonical_headers时没有加入该字段的键值对,导致签名计算的头部集合和实际提交的不一致。 - 请求体双重序列化:
json.dumps的入参已经是JSON字符串,会触发二次序列化,生成带转义符的异常请求体,导致载荷哈希计算错误。 - 环境变量拼写错误:读取Secret Key的环境变量名
AWS_SECRTE_ACCESS_KEY_API_INVOKE拼写错误,正确拼写为AWS_SECRET_ACCESS_KEY_API_INVOKE,可能导致读取到空密钥。
修复方案
按以下步骤修改代码即可:
- 调整载荷哈希的计算顺序,放在规范请求头构建之前
- 修正4处错误配置,修改后的核心代码段如下:
# 修正环境变量拼写 access_key = os.getenv('AWS_ACCESS_KEY_API_INVOKE') secret_key = os.getenv('AWS_SECRET_ACCESS_KEY_API_INVOKE') # 修正规范URI为实际请求的阶段路径 canonical_uri = "/experiment-stage" # 修正请求体序列化,直接传入字典避免二次转义 request_parameters = json.dumps({"even" : [1,2,3,4], "odd" : [1,2,3,4]}) canonical_querystring = "" # 提前计算载荷哈希,供规范请求头使用 payload_hash = hashlib.sha256(request_parameters.encode('utf-8')).hexdigest() # 修正规范请求头,添加x-amz-content-sha256字段 canonical_headers = f"content-type:{content_type}\nhost:{host}\nx-amz-content-sha256:{payload_hash}\nx-amz-date:{amz_date}\n" signed_headers = "host;x-amz-content-sha256;x-amz-date"
修改完成后重新运行即可正常通过签名校验。
内容的提问来源于stack exchange,提问作者Naveen Reddy Marthala
相关产品推荐
相关产品推荐

