【问题标题】:SignatureDoesNotMatch - Boto3 Django-storagesSignatureDoesNotMatch - Boto3 Django-storages
【发布时间】:2020-05-27 09:46:55
【问题描述】:

我有以下配置:

Django/DRF 博托3 Django 存储

我正在使用带有一组密钥的 IAM 用户凭证。我已从我的帐户中删除了所有其他密钥集,包括根密钥,以消除密钥不匹配。

我创建了一个新存储桶my-prod-bucket。更新了我的 env 文件中的存储桶名称设置。我运行了python3 manage.py collectstatic,它毫无问题地创建了新的存储桶。

我的 .env:

AWS_ACCESS_KEY_ID=something
AWS_SECRET_ACCESS_KEY=something
AWS_STORAGE_BUCKET_NAME=my-prod-bucket

我的 settings.py(使用 python-decouple 从 .env 中获取):

AWS_ACCESS_KEY_ID = config('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = config('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = config('AWS_STORAGE_BUCKET_NAME')

AWS_S3_CUSTOM_DOMAIN = '%s.s3.ca-central-1.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
AWS_S3_REGION_NAME = 'ca-central-1'


AWS_HEADERS = {
    'CacheControl': 'max-age=86400',
}

AWS_STATIC_LOCATION = 'static'
STATIC_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_STATIC_LOCATION)
STATICFILES_STORAGE = 'portal.storage_backends.StaticStorage'

# =======
AWS_DEFAULT_ACL = None

AWS_AUTO_CREATE_BUCKET = True
S3_USE_SIGV4 = True

当我尝试下载我得到的文件时,我可以上传和删除但是

<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>
The request signature we calculated does not match the signature you provided. Check your key and signing method.
</Message>
<AWSAccessKeyId>AKIA6FUWELHP36HW6QOT</AWSAccessKeyId>
<StringToSign>
AWS4-HMAC-SHA256 20200211T215631Z 20200211/ca-central-1/s3/aws4_request 703b799a80d9efd9f9e06a01ab30a8a721f2a9bafe6a3d5c92b045ea769b0d87
</StringToSign>
<SignatureProvided>
46bd882624f966d9cb8914d279f7c8f91a2b3e5e577525c13069e29f8891c1ee
</SignatureProvided>
<StringToSignBytes>
41 57 53 34 2d 48 4d 41 43 2d 53 48 41 32 35 36 0a 32 30 32 30 30 32 31 31 54 32 31 35 36 33 31 5a 0a 32 30 32 30 30 32 31 31 2f 63 61 2d 63 65 6e 74 
</StringToSignBytes>
<CanonicalRequest>
GET /media/private/cities/20/2017/london_2016.csv X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA6FUWELHP36%2F20200211%2Fca-central-1%2Fs3%2Faws4_request&X-Amz-Date=20200211T215631Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host host:my-prod-bucket.s3.ca-central-1.amazonaws.com host UNSIGNED-PAYLOAD
</CanonicalRequest>
<CanonicalRequestBytes>
47 45 54 0a 2f 6d 65 64 69 61 2f 70 72 69 76 61 74 65 2f 63 69 74 69 65 73 2f 32 30 2f 32 30 31 37 2f 45 43 35 2e 31 2f 6c 6f 6e 64 6f 6e 5f 32 30 31 36 2e 63 73 76 0a 58 2d 41 6d 7a 2d 41 6c 67 6f 72 69 74 68 6d 3d 41 57 53 
</CanonicalRequestBytes>
<RequestId>6A85C2780914C0F5</RequestId>
<HostId>
WtPC4cEV60ybq2pEdfghdfg23tg123lVV6l/iHiaSAjL4DS0=
</HostId>
</Error>

我不确定我做错了什么。我搜索了有关此错误的所有帖子,但找不到适合我的情况的最新内容。

任何关于如何排除故障的想法将不胜感激。

【问题讨论】:

    标签: python django amazon-s3 django-rest-framework boto3


    【解决方案1】:

    好的,所以在花了将近 2 天的时间试图弄明白这一点之后,这就是我想出的:

    我的问题是在ca-central-1 区域中创建的存储桶。一旦我将请求更改为us-east-1 中的存储桶,一切都立即正常工作,没有该错误。我这边的一切都设置得很完美。

    现在,第二天我再次尝试连接到同一个 ca-central-1 存储桶,这次成功了。没有签名不匹配错误。

    此时我在想,在某些区域创建存储桶时,AWS S3 上可能存在“时间延迟”,直到它们正常运行。

    为了测试我的理论,我在ca-central-1 中创建了一个新存储桶并尝试连接到它。同样,新存储桶的错误与上述相同。等到第二天,再试一次 - 一切正常。

    如果遇到同样的问题,请记住“时间延迟”(因为缺乏更好的解释)。

    【讨论】:

    • 你的意思是,我必须等待一天才能创建辞职网址?
    【解决方案2】:

    对于区域ca-central-1,您可能需要在settings.py 中添加以下变量:

    AWS_S3_SIGNATURE_VERSION = 's3v4'
    AWS_S3_ADDRESSING_STYLE = 'virtual'
    

    有关详细信息,请参阅以下讨论:

    https://github.com/jschneier/django-storages/issues/782

    【讨论】:

    • 这个讨论链接对我很有帮助!!谢谢!
    猜你喜欢
    • 2020-01-16
    • 1970-01-01
    • 2018-05-25
    • 2019-08-30
    • 2020-03-26
    • 2017-11-19
    • 2014-12-31
    • 2019-03-03
    • 2022-12-04
    相关资源
    最近更新 更多