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

What is the correct way of passing S3 headers inside Django?

我在我的 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,
}

但是一旦我添加这些 headers 我就开始收到以下错误。

[Error 104] Connection Reset by Peer

文件上传在没有 headers 的情况下工作正常。

我不明白为什么会这样?

如果需要更多详细信息,请告诉我。

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

长答案: 这里是S3BotoStorage. Now here come the puzzle of how boto2 saving file的来源。你在哪里找到 header?所以我看到他们建议这样

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

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

而令人困惑的部分是,在 boto2 中,S3 object 名称是调用密钥(在 boto3 中,他们对其进行了改进并显式调用它 key_name)。这与加密密钥无关。