的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