Cloudfront 使用 python boto3 签名 URL 被拒绝访问

问题描述 投票:0回答:2

我已完成以下步骤:

  1. 创建了公共访问被阻止的 S3 存储桶。
  2. 创建了指向 S3 的 Cloudfront 发行版。
  3. 指定使用 OAI 并验证存储桶策略已更新为允许 OAI。
  4. 限制查看者访问 = 是
  5. 可信授权类型=信任签名者,信任签名者=自我
  6. 转到 root 用户的安全凭证并创建一个 Cloudfront 密钥。
  7. 将公钥下载到本地系统并添加到Python代码中。
  8. 从凭据中获取访问密钥 ID 并添加到 python 代码中。

Python 代码:(与 https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cloudfront.html 相同)

import datetime

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


def rsa_signer(message):
    with open('path/to/key.pem', '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())

key_id = 'AKIAIOSFODNN7EXAMPLE'
url = 'http://d2949o5mkkp72v.cloudfront.net/hello.txt'
expire_date = datetime.datetime(2022, 10, 11)

cloudfront_signer = CloudFrontSigner(key_id, rsa_signer)

# Create a signed url that will be valid until the specific expiry date
# provided using a canned policy.
signed_url = cloudfront_signer.generate_presigned_url(
    url, date_less_than=expire_date)
print(signed_url)

我尝试对签名部分进行 Base64 解码,但它给出了类似输入流中无效字符的错误。 我的另一个问题是,我可以为同一个对象创建多个签名网址吗? 当我们没有限制查看者访问 = 是时,签名的 URL 可以正常工作。我知道没关系,cos 签名的 url 应该在限制访问的情况下工作。

我还尝试使用 Perl 创建签名 URL,并使用 AWS 提供的代码,但即使这样也不起作用。相同的访问被拒绝。

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/CreateURLPerl.html

python amazon-web-services boto3 amazon-cloudfront
2个回答
0
投票

就像生活中的许多事情一样,这是一个小错误。

我错过了在 URL 中添加尾随 / 的问题。


0
投票

我已经使用了与您建议的相同的逻辑,但它仅适用于某些键,并且不适用于具有空格的键。你对此有什么解决办法吗?我已经在 Stack Overflow 上询问过这个问题。这是问题的链接:[]

© www.soinside.com 2019 - 2024. All rights reserved.