Cloudfront URL永不过期

时间:2019-03-18 10:12:05

标签: python amazon-web-services boto3 amazon-cloudfront pre-signed-url

场景: 我正在尝试为s3中的对象生成Cloudfront签名的URL。

STEPS:
 1.在s3存储桶中创建了一个对象,并将其公开。
 2.创建指向该s3存储桶的Cloudfront发行版。
 3.使用下面的代码生成签名的URL

以下是从其docs生成Cloudfront签名的URL的代码。

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 = 'https://d2949o5mkkp72v.cloudfront.net/hello.txt'
expire_date = datetime.datetime(2017, 1, 1)

cloudfront_signer = CloudFrontSigner(key_id, rsa_signer)

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

输出:

https://d2949o5mkkp72v.cloudfront.net/hello.txt?Expires=1483228800&Signature=some_signature&Key-Pair-Id=AKIAIOSFODNN7EXAMPLE

上面的url指向了一个时光倒流的日期,但是我仍然可以通过该URL访问该对象。另外,我可以通过截断Signature和Key-Pair-Id查询参数来访问对象。

这里可能出了什么问题?

1 个答案:

答案 0 :(得分:2)

我找到了解决问题的办法。该错误实际上不在代码中,而是在Cloudfront发行版的配置中。

缺少以下配置: cloudfront signed url config option

希望它会有所帮助:)