You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

私有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 05:59:59