CloudFront签名URL生成后访问被拒绝问题排查求助
CloudFront签名URL返回AccessDenied排查方案
一、签名生成参数核对
- 确认签名用的密钥对已加入CloudFront可信密钥组,且密钥状态为
Active(控制台路径:CloudFront → 密钥管理 → 密钥组)。 - 检查签名URL的资源路径是否完全匹配CloudFront行为规则:比如行为规则是
/user-files/*,但签名路径是/files/*,会匹配到未配置签名验证的默认行为。 - 验证IP限制格式:单个IP需用
x.x.x.x/32,网段用CIDR格式(如192.168.1.0/24),确保请求IP在指定范围内。 - 确认过期时间为秒级Unix时间戳,且当前时间未超过过期时间。
二、CloudFront行为与源配置检查
- 每个行为的源请求策略必须包含
CloudFront-Viewer-Address头(IP限制依赖该头):可选择AWS托管策略Managed-CachingOptimizedWithIP,或自定义策略时勾选该头。 - 确认行为的
Restrict viewer access已选择Trusted Signers (Recommended),且关联的密钥组正确。 - 检查S3源的OAC配置:确认OAC已关联当前CloudFront分配,且
Sign requests设置为Yes。
三、S3桶权限验证
- 核对桶策略:确保服务主体为
cloudfront.amazonaws.com,资源路径包含/*(如arn:aws:s3:::bucket-user-files/*),且AWS:SourceArn指向正确的CloudFront分配ARN(格式:arn:aws:cloudfront::ACCOUNT_ID:distribution/DIST_ID),示例策略:{ "Version": "2008-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": "AllowCloudFrontAccess", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::bucket-user-files/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::123456789012:distribution/ABCDEFG123456" } } } ] } - 确认S3的
Block public access已全量禁用(四个选项均关闭),否则会覆盖桶策略导致CloudFront无法访问。
四、日志排查
- 启用CloudFront实时日志:查看
x-edge-error-details字段,可获取具体拒绝原因(如签名无效、IP不匹配、密钥不存在等)。 - 开启S3访问日志:若请求到达S3,日志会记录拒绝原因(如桶策略不匹配、对象不存在等)。
五、PHP代码关键点检查
CloudFrontClient初始化区域填us-east-1(CloudFront为全局服务)。createSignedUrl参数验证:url需为CloudFront分配域名+对象路径(如https://d123.cloudfront.net/user-files/test.jpg),不能用S3域名。ipAddress参数格式正确(如'192.168.1.1/32')。privateKey加载完整的.pem密钥内容,保留开头-----BEGIN RSA PRIVATE KEY-----和结尾-----END RSA PRIVATE KEY-----。
内容的提问来源于stack exchange,提问作者quetzalfir
相关产品推荐
相关产品推荐

