You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何排查AWS CloudFront签名URL访问被拒绝的问题?

排查AWS CloudFront签名URL访问被拒绝的问题

我来帮你一步步排查CloudFront签名URL返回403的问题,结合你贴的代码片段,咱们从几个核心方向入手:

1. 检查签名生成的核心参数是否准确

  • 资源路径(resourceKey):你代码里用了$object->s3_video作为资源路径,要确保这个值和S3桶里的对象路径完全一致(比如videos/intro.mp4),而且CloudFront分发的源就是这个S3桶,路径没有前缀/后缀的匹配问题。
  • 过期时间(expires):你设置的是time() + 300(5分钟后过期),这里要注意服务器的系统时间必须和UTC时间同步——如果服务器时间偏差过大(比如超过5分钟),CloudFront会判定签名已过期直接拒绝。可以手动打印$expires的值,和在线UTC时间对比验证。
  • CloudFront客户端初始化:虽然CloudFront是全局服务,但客户端的regionversion配置要确保正确,不过核心还是后面的密钥参数。

2. 确认签名所需的CloudFront密钥对配置

这是最容易踩坑的点!你用的是预定义策略(Canned Policy),生成签名时必须指定有效的CloudFront密钥对:

  • 你贴的代码里getSignedUrl调用截断了,完整的参数应该包含私钥和密钥对ID,比如:
    $signedUrlCannedPolicy = $cloudFrontClient->getSignedUrl([
        'url' => $streamHostUrl . '/' . $resourceKey,
        'expires' => $expires,
        'private_key' => file_get_contents('/path/to/your-cloudfront-private-key.pem'),
        'key_pair_id' => 'APKAXXXXXXXXXXXXXX' // 替换成你的密钥对ID
    ]);
    
  • 要确保:
    • 私钥文件是你在AWS控制台生成的CloudFront私钥(不是IAM密钥),PHP进程有读取该文件的权限。
    • 对应的公钥已经添加到CloudFront的密钥组中,并且你的CloudFront分发已经关联了这个密钥组。

3. 验证CloudFront分发的关键配置

  • 限制访问设置:必须在分发的“限制访问”选项中开启“使用签名URL或签名Cookie”,并关联正确的密钥组。如果没开启这个,CloudFront会拒绝带签名的请求(因为它不需要签名就能访问)。
  • 缓存行为配置:对应的缓存行为(比如默认行为)要允许使用签名URL,且“查看器协议策略”和你生成的URL协议一致(你用的是HTTPS,所以要确保分发支持HTTPS)。
  • 源访问身份(OAI)权限:如果你的CloudFront分发用了OAI来访问S3桶,一定要给OAI配置S3桶的读取权限——否则即使签名URL正确,CloudFront也无法从S3获取内容,返回403。

4. 实用的测试与调试技巧

  • 对比测试URL:用AWS CLI或者官方的CloudFront签名工具生成一个已知正确的签名URL,和你代码生成的对比,看看ExpiresSignatureKey-Pair-Id这些参数是否有差异。
  • 查看CloudFront访问日志:开启分发的访问日志,查看被拒绝请求的sc-substatus字段,它会告诉你具体的拒绝原因:
    • 403.2:签名已过期
    • 403.3:签名无效
    • 403.4:需要使用HTTPS访问
    • 403.5:请求IP不在允许范围内
  • 验证S3对象可用性:暂时给S3对象开放公开权限,直接访问对象URL确认内容存在,排除S3本身的问题。

内容的提问来源于stack exchange,提问作者funerr

火山引擎 最新活动