在Django中传递S3标头的正确方法是什么?

时间:2016-05-16 06:31:08

标签: python django encryption amazon-s3 boto3

我在我的django应用中使用S3BotoStorage作为我的DEFAULT_FILE_STORAGE。因此,我上传到我的应用程序的所有文件都上传到S3存储桶。 我想使用SSE-C加密我的文件,因此我遵循AWS提供的文档here。我在settings.py

添加了以下几行
# settings.py
AWS_S3_ENCRYPTION = True
key = ...
key_md5 = ...
AWS_HEADERS = {
    'x-amz-server-side-encryption-customer-algorithm': 'AES256',
    'x-amz-server-side-encryption-customer-key': key,
    'x-amz-server-side-encryption-customer-key-MD5': key_md5,
}

但是只要我添加这些标题,我就会收到以下错误。

[Error 104] Connection Reset by Peer

文件上传工作正常,没有标题。

我不知道为什么会这样?

如果需要更多细节,请告诉我。

1 个答案:

答案 0 :(得分:1)

简短回答:由于过时的boto2实现,您使用的包装器不支持自定义加密密钥。

答案很长: 这是S3BotoStorage的来源。现在来到how boto2 saving file的难题。你在哪里找到标题?所以我看到他们建议这样的事情

AWS_HEADERS = {
    'Expires': 'Thu, 15 Apr 2010 20:00:00 GMT',
    'Cache-Control': 'max-age=86400',
}

没有传递给boto的加密标头的示例。您给出的标头是REST API,而不是S3BotoStorage包装器。因此,您可能只能使用此功能而忘记为加密算法设置AWS_HEADERS,并提供自定义加密密钥。

令人困惑的部分是,在boto2中,S3对象名称是调用键(在boto3中,它们改进了它并明确地将其命名为key_name)。这与加密密钥无关。