1

尝试设置完全签名和保护的云端URL。 例如我想要一个应用程序代码来访问资源。Cloudfront vs S3签名URL和Boto3

随着S3直接分配我可以做到这一点简单地用:

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

但我似乎无法弄清楚如何请求CloudFront的URL时创建等效的标识的URL。

回答

4

的boto3文档具有显示Generate a signed URL for Amazon CloudFront一个部分:

下面的示例示出了如何生成亚马逊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) 

的Cloudfront VS S3

你会发现,上面的代码使用公钥/私钥对创建CloudFront的签署URL。这意味着只要知道密钥对,任何应用程序都可以生成签名的URL。

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

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

+0

谢谢,我当然看到了。但是,与直接的S3 URL不同,这需要使用我的私有RSA对密钥进行签名。这是唯一的方法吗?为什么S3和Cloudfront之间存在差异?对我来说没有意义,也许你可以解释差异。 –

+0

我不知道为什么,但我添加了关于差异的文字。 –

+0

但是当通过签名url访问文件上传时,boto3得到了'403'。 – jiamo