的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的客戶可能會有用。但這只是一個猜測。
謝謝,我當然看到了。但是,與直接的S3 URL不同,這需要使用我的私有RSA對密鑰進行簽名。這是唯一的方法嗎?爲什麼S3和Cloudfront之間存在差異?對我來說沒有意義,也許你可以解釋差異。 –
我不知道爲什麼,但我添加了關於差異的文字。 –
但是當通過簽名url訪問文件上傳時,boto3得到了'403'。 – jiamo