我正在尝试为私人内容分发设置CloudFront,但是当我按照生成的URL时,我不断收到“拒绝访问”错误 . 为了清楚起见,我已经创建了CloudFront发行版,将其标记为私有,创建了一个Origin Access ID,该ID已被授予对所有相关文件的读取权限 .
我编写了一个简单的Python脚本,使用亚马逊网页上提供的示例生成URL,用于签名URL,包括以下文本:
import os, time
def GetCloudFrontURL(file, expires=86400):
resource = "http://mydistribution.cloudfront.net/" + file
exptime = int(time.time()) + expires
epochtime = str(exptime)
policy = '{"Statement":[{"Resource":"' + resource + '","Condition":{"DateLessThan":{"AWS:EpochTime":' + epochtime + '}}}]}'
pk = "MY-PK-GOES-HERE"
signature = os.popen("echo '" + policy + "' | openssl sha1 -sign /path/to/file/pk-" + pk + ".pem | openssl base64 | tr '+=/' '-_~'").read()
signature = signature.replace('\n','')
url = resource + "&Expires=" + epochtime + "&Signature=" + signature + "&Key-Pair-Id=" + pk
return url
任何人都可以看到我正在做的事情明显错误吗?我已经验证当我使用私钥对摘要进行签名时,我可以使用公钥对其进行验证(前提是我在通过base64和转换步骤进行验证之前进行了验证) .
谢谢 .
3 回答
运行你的方法我在第一个关键字Expires之前得到一个&符号 .
不知道它是否解决了你的整个问题,但我怀疑你在URL中需要问号以使params正确解析 . 尝试这样的事情:
除此之外,urllib.urlencode方法会将params字典转换为URL . http://docs.python.org/library/urllib.html#urllib.urlencode
基于此,我能够通过一些调整来实现它 .
另外,请参阅boto的set_all_permissions函数,该函数将自动为您设置S3 ACL .
以下是如何生成签名URL而无需os.popen到openssl . 这使用了优秀的M2Crypto python库
此代码基于Amazon在CloudFront文档中提供的PHP示例代码 .
确保使用设置为持有密钥对的帐户的TrustedSigners参数设置您的分配(如果是您自己的帐户,则设置为“Self”)
有关设置此内容以使用Python进行流式传输的完整工作示例,请参阅Getting started with secure AWS CloudFront streaming with Python