私有S3桶的CloudFront签名URL出现403访问拒绝问题排查
CloudFront签名URL访问私有S3桶报403拒绝的排查方案
核心冲突点
你的OAC配置使用了signing_protocol = "sigv4"并设置signing_behavior = "always",但你生成的是CloudFront RSA自定义签名URL,这两种认证逻辑存在冲突:
- OAC的SigV4配置是让CloudFront自身用SigV4凭证访问S3;
- 而自定义签名URL是让客户端向CloudFront提供签名,CloudFront验证后再通过OAC权限访问S3。此时强制SigV4签名会导致权限验证失败。
具体排查修复步骤
1. 调整OAC配置
将OAC的signing_behavior修改为"never",避免强制CloudFront使用SigV4访问S3:
resource "aws_cloudfront_origin_access_control" "cloudfront_backend_bucket" { name = "${var.environment}-cloudfront_backend_bucket" description = "OAC for S3 bucket access" signing_behavior = "never" # 修改此处 signing_protocol = "sigv4" origin_access_control_origin_type = "s3" }
修改后重新部署CloudFront分发,确保配置生效。
2. 验证S3桶策略的正确性
确认桶策略中的aws:SourceArn是当前CloudFront分发的完整ARN,格式为arn:aws:cloudfront::<AWS账户ID>:distribution::<分发ID>,避免账户ID或分发ID填写错误。
3. 修复签名生成代码
KMS返回的Signature是二进制数据,CloudFront要求签名必须是Base64编码的字符串,你的代码缺少编码步骤,需修改:
import base64 def get_rsa_signer(cls, message): kms_client = boto3.client("kms") response = kms_client.sign( KeyId=secrets_manager.get_env("CLOUDFRONT_KMS_PRIVATE_KEY_ID"), Message=message, MessageType="RAW", SigningAlgorithm="RSASSA_PKCS1_V1_5_SHA_256", ) # 将二进制签名转换为Base64编码字符串 return base64.b64encode(response["Signature"]).decode("utf-8")
4. 检查CloudFront分发的关联配置
- 确认分发的原点已绑定正确的OAC,且原点域名为S3桶的官方域名(如
<bucket-name>.s3.amazonaws.com); - 确认对应缓存行为的
Restrict Viewer Access已设为Yes,并关联了包含你的公钥的密钥组; - 确保缓存行为允许
GET请求方法(对应S3的GetObject操作)。
内容的提问来源于stack exchange,提问作者matt
相关产品推荐
相关产品推荐

