CloudFront转发至API Gateway报403签名不匹配问题求助
我将CloudFront作为API Gateway的前端,API Gateway是区域端点且已禁用API密钥,直接请求该区域端点必须携带Authorization头,否则会返回预期的"Missing Authentication Token"错误。但通过CloudFront端点发送相同请求时,返回403 Forbidden错误,错误信息如下:
{"message": "The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.\n\nThe Canonical String for this request should have been\n'POST\n\n// sensitive data here..."}
该认证令牌由AWS签名生成,签名来自拥有execute-api:Invoke权限的IAM角色。
测试情况
- Postman携带Authorization头直接访问API Gateway端点,返回200正常响应;
- Postman携带相同请求及头访问CloudFront端点,返回上述403错误。
补充信息
- IAM角色配置:
{"Version": "2012-10-17","Statement": [{"Action": "execute-api:Invoke","Resource": "arn:aws:execute-api:us-west-2:{ACCOUNT}:{ENDPOINT}","Effect": "Allow"}]}
- 签名获取方式:在CloudShell中执行
aws sts assume-role --role-arn arn:aws:iam::{ACCOUNT}:{ROLE} --role-session-name {SESSION_NAME}获取AccessKey、SecretKey、Session Token,在Postman中选择"AWS Signature"类型填入这些密钥; - CloudFront配置:API GW源的分发行为使用CachingOptimized策略,允许所有HTTP方法。
请问为何CloudFront无法使用这些凭证访问API Gateway端点?
出现该问题的核心是AWS签名校验逻辑与请求的目标服务/域名不匹配,具体分以下几个关键场景:
1. Postman签名生成的目标服务错误
当用Postman的"AWS Signature"模式时,它会根据请求域名自动推断服务名称:
- 直接访问API Gateway时,域名是
*.execute-api.us-west-2.amazonaws.com,Postman自动用execute-api作为服务名生成签名,符合API Gateway的校验要求; - 访问CloudFront时,域名是CloudFront分发域名(
*.cloudfront.net),Postman默认用cloudfront作为服务名生成签名,但API Gateway只认可针对execute-api服务的签名,因此校验失败。
解决方法:
在Postman的AWS Signature配置中,手动指定服务名称为execute-api,同时确认"Region"设置为API Gateway所在的us-west-2区域。
2. CloudFront转发时修改了签名校验依赖的请求属性
API Gateway的AWS签名校验依赖请求域名、路径、头部等核心属性,若CloudForward转发时修改了这些属性,会导致签名不匹配:
- 比如CloudFront默认会将
Host头修改为API Gateway的端点域名,但你的签名是基于CloudFront域名生成的,两者不匹配; - 或者CloudFront的缓存策略意外移除了
Authorization这类签名必需的头部。
解决方法:
- 检查CloudFront源配置,将
Host头设置为API Gateway的区域端点域名,不要使用默认的Viewer Host Header; - 为API请求创建自定义缓存策略,排除
Authorization等动态敏感头部,避免被缓存或修改; - 确保CloudFront分发行为的"Origin Request Policy"包含所有必要请求头部,至少要覆盖
Authorization、Host。
3. IAM角色资源ARN范围不匹配
你的IAM角色资源ARN是arn:aws:execute-api:us-west-2:{ACCOUNT}:{ENDPOINT},若{ENDPOINT}未包含API Gateway的完整资源路径(比如阶段、具体资源路径),会导致权限校验失败。
解决方法:
- 调整IAM角色的Resource ARN,要么用通配符覆盖所有路径(如
arn:aws:execute-api:us-west-2:{ACCOUNT}:{API_ID}/*),要么精确匹配目标API的资源路径; - 确认ARN中的
{ENDPOINT}是API Gateway的API ID,而非CloudFront的分发ID。
4. Session Token未正确传递
使用STS AssumeRole获取的临时凭证需要通过X-Amz-Security-Token头传递Session Token,若CloudFront未转发该头部,或Postman未正确配置,会导致API Gateway无法校验临时凭证。
解决方法:
- 在Postman的AWS Signature配置中,确保已填入获取到的Session Token;
- 检查CloudFront的Origin Request Policy,确保
X-Amz-Security-Token头被转发到API Gateway。
内容的提问来源于stack exchange,提问作者Biiiiiird

