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