【问题标题】:boto3: generate wildcard CloudFront presigned URLboto3:生成通配符 CloudFront 预签名 URL
【发布时间】:2021-02-03 08:42:01
【问题描述】:

我正在使用 CloudFront 提供一些私有 HLS 内容,这些内容存储在 S3 存储桶中。所有 HLS 内容都存储在我存储桶根目录的 /hls/ 目录中。

我正在使用此代码生成 /hls/*(注意 * 通配符)预签名 URL 以访问(否则无法访问)内容:

import datetime

from botocore.signers import CloudFrontSigner
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import padding

from my_django_project.settings import (
    AWS_CLOUDFRONT_DOMAIN_NAME,
    AWS_CLOUDFRONT_KEY_ID,
    AWS_CLOUDFRONT_KEY_PATH,
)


def rsa_signer(message):
    with open(AWS_CLOUDFRONT_KEY_PATH, "rb") as key_file:
        private_key = serialization.load_pem_private_key(
            key_file.read(), password=None, backend=default_backend()
        )
    return private_key.sign(message, padding.PKCS1v15(), hashes.SHA1())


def get_signed_url():
    key_id = AWS_CLOUDFRONT_KEY_ID
    url = f"https://{AWS_CLOUDFRONT_DOMAIN_NAME}/hls/*"
    expire_datetime = datetime.datetime.now() + datetime.timedelta(minutes=5)
    cloudfront_signer = CloudFrontSigner(key_id, rsa_signer)
    signed_url = cloudfront_signer.generate_presigned_url(
        url,
        date_less_than=expire_datetime,
    )
    return signed_url

此代码有效地生成了一个 URL,但当我尝试访问 https://{AWS_CLOUDFRONT_DOMAIN_NAME}/hls/index.m3u8 URL(这是存储在 /hls/ 目录中的文件之一)时,CloudFront 响应 403 Access Denied 错误。

我已检查我是否遵循配置 CloudFront 和 S3 以使用预签名 URL 提供私有内容的所有指南。我开始怀疑这个通配符是问题所在。

我不确定我能做些什么来解决这个问题。有什么想法吗?

【问题讨论】:

标签: amazon-web-services amazon-cloudfront http-live-streaming pre-signed-url


【解决方案1】:

您需要在 UTC 时区工作。将datetime.datetime.now() 替换为datetime.datetime.utcnow(),它应该可以正常工作。

【讨论】:

    【解决方案2】:

    如果使用 HLS,则不能使用 presignedUrl,必须使用 preSigned cookie:

    https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-choosing-signed-urls-cookies.html

    Use signed cookies in the following cases:
    
    You want to provide access to multiple restricted files, for example, all of the files for a video in HLS format or all of the files in the subscribers' area of website.
    
    You don't want to change your current URLs.
    

    PreSignedUrl 仅用于访问特定文件,因此不适用于 HLS。 您必须指定包含您定义的 url 的自定义策略:

    https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-setting-signed-cookie-canned-policy.html

    【讨论】:

      【解决方案3】:

      这是我在 Stack Overflow 其他地方找到的一些示例代码,这些代码都使用 Python 完成(因为来自 CF 的示例代码没有显示这种详细程度): Creating Signed URLs for Amazon CloudFront 虽然我最终做了一个混合;我使用来自 Amazon 的罐装策略示例中的 rsa_signer 函数的密钥/签名处理代替了我链接的示例中的 sign_string 函数。

      但是,如果您想使用通配符,请务必通过在过期和签名之间的签名 url 中包含 base64 编码的策略语句作为 Policy=$policy 来使其成为自定义策略,如 Marc 发布的链接中所指定.我最初没有足够仔细地阅读文档并且非常沮丧,直到我回去更仔细地阅读并将其包含在内。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-29
        • 2018-12-06
        • 1970-01-01
        相关资源
        最近更新 更多