我目前正在尝试构建一个Web服务来生成到Amazon S3的临时URL(这样我就不需要在其他地方保留凭据)。如果我没有在generate_url方法的标题中包含'Content-MD5'键,它可以正常工作,但是一旦包含,我总是得到同样的错误:
“我们计算的请求签名与您提供的签名不符。请检查您的密钥和签名方法。”
生成md5并按以下方式包含:
md5checksum = key.compute_md5(open(filepath, "rb"))[0]
r = cli.session.post(serviceAddress + webService , data=json.dumps({"key": key, "size": os.path.getsize(filepath), "md5" : md5checksum}))
我也尝试用
生成md5md5checksum = hashlib.md5(open(filepath).read()).hexdigest()
在网络服务方面,临时URL通过
生成headers={'Content-Length': length, 'Content-MD5': md5}
return self.conn.generate_url(expire, 'PUT', self.name, key, headers=headers, force_http=True)
我已经检查过md5在生成URL和文件上传之间没有变化。如果我只删除'Content-MD5':md5,它确实可以正常工作。
答案 0 :(得分:1)
根据AWS文档,Content-MD5需要采用Base64编码:
Content-MD5:消息的base64编码的128位MD5摘要 (根据RFC 1864
,没有标题)
来源:http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html