【问题标题】:What is the correct way of passing S3 headers inside Django?在 Django 中传递 S3 标头的正确方法是什么?
【发布时间】:2016-09-11 21:24:40
【问题描述】:

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

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

我不明白为什么会这样?

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

【问题讨论】:

  • 由于您使用第三方调用 API,您应该检查并使用 codebase 参数,因为它会覆盖并忽略它不理解的内容。并在源代码中搜索“加密”:github.com/jschneier/django-storages/blob/master/storages/…,看来您只需要启用一个参数。
  • @mootmoot 感谢您指出这一点,但我已经启用了您正在谈论的那个参数。我已经更新了问题描述。
  • 请说明您是要使用自己的 OWN 加密密钥还是使用 S3 加密?
  • 我想通过客户提供的加密密钥 (SSE-C) 机制使用 S3 的服务器端加密。这是文档的链接。 docs.aws.amazon.com/AmazonS3/latest/dev/…
  • 快速浏览一下 boto2 S3 API(S3BotoStorage 正在使用),它不支持自定义加密。您可能需要修补 S3BotoStorage 或编写自己的代码以使用支持它的 boto3。

标签: python django encryption amazon-s3 boto3


【解决方案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)。这与加密密钥无关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 2016-12-16
    相关资源
    最近更新 更多