亚马逊云前缀签名URL和亚马逊S3签名URL工作方式不同。 CloudFront使用基于单独的CloudFront密钥对的RSA签名,您必须在Amazon帐户凭据页中设置它。这是一些Python代码,可使用
M2Crypto 库实际生成有时限的URL:
为CloudFront创建密钥对
我认为唯一的方法是通过亚马逊的网站完成此操作。 进入AWS的“账户”页面,然后单击“安全凭据”链接。 点击“密钥对”选项卡,然后单击“创建新密钥对”。 这将为您生成一个新的密钥对,并自动下载私钥文件(pk-xxxxxxxxx.pem)。 将密钥文件保密并妥善保管。 还要记下来自亚马逊的“密钥对ID”,因为我们将在下一步中需要它。
在Python中生成一些URL
截至boto版本2.0,似乎没有支持生成已签名CloudFront URL的功能。 Python未在标准库中包含RSA加密例程,因此我们必须使用其他库。 我在此示例中使用了M2Crypto。
对于非流媒体分发,您必须将完整的cloudfront URL用作资源,但是对于流媒体,我们仅使用视频文件的对象名称。 有关生成仅持续5分钟的URL的完整示例,请参见下面的代码。
此代码松散基于亚马逊在CloudFront文档中提供的PHP示例代码。
from M2Crypto import EVP
import base64
import time
def aws_url_base64_encode(msg):
msg_base64 = base64.b64encode(msg)
msg_base64 = msg_base64.replace('+', '-')
msg_base64 = msg_base64.replace('=', '_')
msg_base64 = msg_base64.replace('/', '~')
return msg_base64
def sign_string(message, priv_key_string):
key = EVP.load_key_string(priv_key_string)
key.reset_context(md='sha1')
key.sign_init()
key.sign_update(message)
signature = key.sign_final()
return signature
def create_url(url, encoded_signature, key_pair_id, expires):
signed_url = "%(url)s?Expires=%(expires)s&Signature=%(encoded_signature)s&Key-Pair-Id=%(key_pair_id)s" % {
'url':url,
'expires':expires,
'encoded_signature':encoded_signature,
'key_pair_id':key_pair_id,
}
return signed_url
def get_canned_policy_url(url, priv_key_string, key_pair_id, expires):
canned_policy = '{"Statement":[{"Resource":"%(url)s","Condition":{"DateLessThan":{"AWS:EpochTime":%(expires)s}}}]}' % {'url':url, 'expires':expires}
signature = sign_string(canned_policy, priv_key_string)
encoded_signature = aws_url_base64_encode(signature)
signed_url = create_url(url, encoded_signature, key_pair_id, expires);
return signed_url
def encode_query_param(resource):
enc = resource
enc = enc.replace('?', '%3F')
enc = enc.replace('=', '%3D')
enc = enc.replace('&', '%26')
return enc
key_pair_id = "APKAIAZVIO4BQ"
priv_key_file = "cloudfront-pk.pem"
resource = "http://34254534.cloudfront.net/video.mp4"
expires = int(time.time()) + 300
priv_key_string = open(priv_key_file).read()
signed_url = get_canned_policy_url(resource, priv_key_string, key_pair_id, expires)
print(signed_url)
确保在分发设置中使用TrustedSigners参数,并将其设置为持有密钥对的账户(如果是您自己的账户,则设置为“Self”)
请参阅《使用Python开始安全的AWS CloudFront流媒体》,了解如何在Python中进行全面的设置示例。