首页 > 解决方案 > AWS S3 无法使用预签名 URL 检索文档:无效日期(应该是自纪元以来的秒数)

问题描述

我们将文档上传到 AWS S3 并使用 boto3 生成了一个预签名的 URL,其有效期为 100 年。

我们检索到的预签名 URL 是http://my_document.s3.amazonaws.com/my_document.htm?Signature=AWS_GENERATED_SIGNATURE&Expires=4732867559&AWSAccessKeyId=MY_ACCESS_KEY

但是,当我们使用 URL 访问文档时,会收到以下错误:

<Error> <Code>AccessDenied</Code> <Message> Invalid date (should be seconds since epoch): 4732867559 </Message> <RequestId>D7F5624326124615</RequestId> <HostId> AWS_HOST_ID </HostId> </Error>

为什么 AWS S3 由于到期时间值而拒绝打开文档,它本身允许我们使用它来生成预签名 URL?

在使用 boto3 与 AWS S3 集成时,这里有没有人遇到过类似的问题?

标签: amazon-web-servicesamazon-s3boto3pre-signed-url

解决方案


为什么 AWS S3 由于到期时间值而拒绝打开文档,它本身允许我们使用它来生成预签名 URL?

S3 不允许这样做。签名的 URL 是在本地生成的,在您实际尝试使用它们之前,S3 不会看到它们或了解它们(或验证它们的真实性或获取指定对象的授权)。

这可能最好的特征是 boto3 中的一个错误...签名版本 2 到期与 Unix 纪元相关,该纪元结束于 2038-01-19T03:14:08Z(“Y2.038K 错误”)。由于Signature V2 已弃用,因此目前不太可能修复。

从理论上讲,您可以对一个直到 2038 年 1 月中旬才过期的 URL 进行 V2 签名,但这也不可行,因为签名的 URL 在每次使用时都会(重新)验证。最佳实践是定期轮换您的密钥,因此您今天使用的 AWS 访问密钥 ID 不应该在 100 年内有效,甚至在从现在到 2038 年的 18 年内有效。一旦您停用这些特定凭证,他们签署的任何 URL将不再可用。


推荐阅读