如何使用boto3为sse kms加密文件生成Cloudfront签名URL?

时间:2017-10-17 06:57:07

标签: python-3.x amazon-cloudfront boto3

如何使用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

1 个答案:

答案 0 :(得分:2)

我不知道这是否可以通过CloudFront预签名网址实现,至少本机化。 CloudFront原始访问标识在幕后创建第二个签名URL(或等效的内容)......

  

CloudFront在请求Amazon S3存储桶中的对象时,通常会使用签名版本2进行身份验证。

     

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html#private-content-origin-access-identity-signature-version-4

我必须进行测试才能确定,但​​我怀疑可能没有本机解决方案。

使用Lambda @ Edge Origin Request触发器在运行中修改请求以生成V4签名并注入它可能是一种可行的解决方法,实际上可能只是 解决方法。

如果对象位于仅支持签名版本4的区域中的存储桶中,CloudFront也可以自动执行正确的操作,因为它可以在这些区域中与S3一起正常工作。