【问题标题】:Access denied on Cloudfront distribution using signed URL's使用签名 URL 拒绝访问 Cloudfront 分发
【发布时间】:2015-02-13 16:49:04
【问题描述】:

我正在尝试使用 Cloudfront 私有分发来提供内容,并将 S3 存储桶作为我的来源。

我的存储桶中有一个图像文件用于测试目的,它的权限设置为私有。我已经设置了我的存储桶策略,因此 Cloudfront Origin Access Identity 获得了权限

{
"Version": "2008-10-17",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [
    {
        "Sid": "1",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity **************"
        },
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::studeersnel.{{my-bucket}}/*"
    }
]
}

当我将我的 Cloudfront 分发设置为公开(不使用签名 URL)时,它可以正常工作。无法使用直接 S3 链接访问该对象,但可以使用 Cloudfront url 访问它。

现在,当我在“默认缓存行为设置”下将“限制查看者访问(使用签名 URL)”设置为“是”时,它不再起作用。我收到 403 错误。如果我遵循签名的网址,我会收到以下消息:

<Error>
  <Code>AccessDenied</Code>
  <Message>Access denied</Message>
</Error>

我正在使用 php-sdk 使用以下代码创建我的签名网址:

require '../vendor/autoload.php';

use Aws\CloudFront\CloudFrontClient;

$cloudFront = CloudFrontClient::factory(array(
    'key' => '********************',
    'secret' => '****************************************',
    'private_key' => '../pk-********************.pem',
    'key_pair_id' => '********************',
));

$hostUrl = 'http://**************.cloudfront.net';
$resourceKey = 'desert.jpg';
$expires = time() + 300;

$signedUrl = $cloudFront->getSignedUrl(array(
    'url'     => $hostUrl . '/' . $resourceKey,
    'expires' => $expires,
));

echo $signedUrl.'<br><br>';
echo '<img src="' . $signedUrl . '">';

任何想法我做错了什么?

【问题讨论】:

  • 桶拥有者是对象的拥有者吗?我问的原因是存储桶策略仅适用于存储桶所有者是对象的所有者。
  • 在存储桶和对象上都显示“所有者:我”。我使用同一个 IAM 帐户来创建两者,而不是根帐户。我还尝试为对象授予 CloudFront Origin Access Identity ************** 明确的打开/下载权限,但这也无济于事。
  • 您没有提到您在 CloudFront 设置中添加了受信任的签名者(请看这里:docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/…)。您需要这样做才能让 CloudFront 知道要信任哪些签名
  • 我将“受信任的签名者”设置保留在“自我”上。我使用根账户制作 CloudFront 密钥对。无论如何,我尝试将帐号添加到受信任的签名者,但它似乎识别出这个号码是我自己的帐户,并且设置只是恢复为 Self。

标签: amazon-web-services amazon-s3 amazon-cloudfront aws-php-sdk


【解决方案1】:

今天解决了这个问题,所以如果有人遇到同样的问题,我想我会在这里发布解决方案。

我认为这一定是 url 本身的生成问题,所以再次检查了凭据。检查完所有内容后,我决定尝试创建一个新的 Cloudfront 密钥对。由于某种原因,这已经解决了问题。

【讨论】:

    猜你喜欢
    • 2018-01-16
    • 2019-08-30
    • 2015-05-21
    • 2013-01-03
    • 1970-01-01
    • 2017-10-03
    • 2021-09-07
    • 2019-11-03
    • 2019-01-24
    相关资源
    最近更新 更多