Cloudfront vs S3签名URL和Boto3

JAR*_*ans 2 python amazon-s3 amazon-web-services amazon-cloudfront boto3

尝试设置完全签名和保护的云端URL.例如,我想要访问资源需要应用程序代码.

使用S3直接分发,我可以简单地使用:

s3 = boto3.client('s3')    
s3.generate_presigned_url('get_object', Params={'Bucket': bucket, 'Key': unique_key}, ExpiresIn=186400)
Run Code Online (Sandbox Code Playgroud)

但在申请云端URL时,我似乎无法弄清楚如何创建等效的签名URL.

Joh*_*ein 6

boto3文档有一节显示为Amazon CloudFront生成签名URL:

以下示例显示如何为Amazon 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()
        )
    signer = private_key.signer(padding.PKCS1v15(), hashes.SHA1())
    signer.update(message)
    return signer.finalize()

key_id = 'AKIAIOSFODNN7EXAMPLE'
url = 'http://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)
Run Code Online (Sandbox Code Playgroud)

Cloudfront vs S3

您会注意到上述代码使用公共/私有密钥对来创建CloudFront签名URL.这意味着只要知道密钥对,任何应用程序都可以生成签名URL.

这与在Amazon S3中创建签名URL不同,后者使用属于生成请求的用户的密钥来验证请求.

他们为什么不同?我不知道,但是keypair选项允许使用CloudFront而不需要任何IAM用户,这对仅使用CloudFront的客户可能很有用.但这只是猜测.