【问题标题】:AWS S3 Failure to Retrieve Document Using PreSigned URL : Invalid date (should be seconds since epoch)AWS S3 无法使用预签名 URL 检索文档:无效日期(应该是自纪元以来的秒数)
【发布时间】:2020-01-18 06:20:04
【问题描述】:

我们将文档上传到 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 集成时遇到过类似的问题吗?

【问题讨论】:

  • 预签名 URL 最长 7 天过期。
  • @ArunK 注意到 Jarmod 在该答案中的评论。这仅适用于 Signature V4。上面的示例是 Sig V2,因为它使用 AWSAccessKeyId 而不是 X-Amz-Credential,如 V4 中所示。 V2 使用 Unix 纪元,结束于 2038-01-19T03:14:08Z。

标签: amazon-web-services amazon-s3 boto3 pre-signed-url


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-06
    • 2020-10-09
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 2019-05-08
    • 2019-12-04
    相关资源
    最近更新 更多