如何使用boto3为sse kms加密文件生成Cloudfront签名网址?我使用自定义域名,以便可以使用https。
<Error>
<Code>InvalidArgument</Code>
<Message>
Requests specifying Server Side Encryption with AWS KMS managed keys require AWS Signature Version 4.
</Message>
<ArgumentName>Authorization</ArgumentName>
<ArgumentValue>null</ArgumentValue>
<RequestId>063D9D2F5214E53A</RequestId>
<HostId>
jVazJY0g4jSDZSKB1iYHzFz7CWGlulU3eBEmg1E2OilYURzrdKGQI0xDVCWalQWtdNYSGz/5+DM=
</HostId>
</Error>
以下代码是我在使用sse kms之前创建签名网址所使用的代码,但现在生成的签名网址会出现此错误:
def rsa_signer(message):
private_key = open('./pk-APKAJPF6OMQQZWEXQPUA.pem', 'r').read()
return rsa.sign(
message,
rsa.PrivateKey.load_pkcs1(private_key.encode('utf8')),
'SHA-1') # CloudFront requires SHA-1 hash
key_id = 'APKAJPF6OMQQZWEXQPUA'
cf_signer = CloudFrontSigner(key_id, rsa_signer)
expires = datetime.datetime.now() + datetime.timedelta(minutes=15)
signed_url = cf_signer.generate_presigned_url(
url,
date_less_than=expires)
# ExpiresIn=100
return signed_url
答案 0 :(得分:2)
我不知道这是否可以通过CloudFront预签名网址实现,至少本机化。 CloudFront原始访问标识在幕后创建第二个签名URL(或等效的内容)......
CloudFront在请求Amazon S3存储桶中的对象时,通常会使用签名版本2进行身份验证。
我必须进行测试才能确定,但我怀疑可能没有本机解决方案。
使用Lambda @ Edge Origin Request触发器在运行中修改请求以生成V4签名并注入它可能是一种可行的解决方法,实际上可能只是 解决方法。
如果对象位于仅支持签名版本4的区域中的存储桶中,CloudFront也可以自动执行正确的操作,因为它可以在这些区域中与S3一起正常工作。