amazon-web-services - 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 集成时,这里有没有人遇到过类似的问题?
解决方案
为什么 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将不再可用。
推荐阅读
- javascript - 将值传递给存储在 Android 资产文件夹中的 HTML 文件
- android - 使用 okhttp 进行身份验证时,此处不允许返回
- python - 如何使用 Python 同时执行多个任务?
- reactjs - 如何将反应草稿文件转换为任何其他格式,例如 pdf
- java - 拆分分隔符java
- html - 用于在 html 文件中设置 css 样式的 vs 代码扩展名?
- javascript - 如何使用获取用户媒体通过麦克风异步记录用户响应,然后将其附加到我的烧瓶应用程序?
- python - 如何将 .docx style_map 导出到巨蟒并嵌入?
- c++ - 我如何在 CMAKE 中链接 GLFW 和 Dear ImGUI
- reactjs - Ag-Grid 在行悬停时显示左侧的按钮