AWS S3 无法使用 PreSigned URL 检索文档:无效日期(应该是纪元以来的秒数)

AWS S3 Failure to Retrieve Document Using PreSigned URL : Invalid date (should be seconds since epoch)

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

Why is AWS S3 refusing to open a document because of an expiry time value, which it itself allowed us to use to generate the pre-signed URL?

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

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

,目前不太可能修复

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