X-Amz-Expires 是对 AWS 请求的必需 header/parameter 吗?

Is X-Amz-Expires a required header/parameter for requests to AWS?

  1. X-Amz-Expires 是必需的 header/parameter 吗?官方文档不一致,在some examples, while not in others中使用。

  2. 如果不需要,签名请求的默认过期值是多少?它是否等于 X-Amz-Expires 参数的最大可能值,即 604800 (seven days)?

  3. 文档(见上面的链接)仅在查询字符串中传递签名参数的上下文中讨论 X-Amz-Expires 参数。如果需要 X-Amz-Expires 参数,是否只需要在查询字符串中传递签名参数(而不是通过授权 header 传递它们)?


更新:

Introduction to AWS Security Processes 论文,第 17 页说

A request must reach AWS within 15 minutes of the time stamp in the request. Otherwise, AWS denies the request.

现在我们在这里谈论什么时间戳?我的猜测是 X-Amz-Date。如果我是正确的,那么会出现另一个问题:

  1. X-Amz-DateX-Amz-Expires 参数如何相互关联?对我来说,如果 X-Amz-Expire 不存在,请求过期算法会从 X-Amz-Date 时间戳回落到 15 分钟。

Is X-Amz-Expires a required header/parameter?

X-Amz-Expires 仅与查询字符串身份验证一起使用,而不与 Authorization: header.

一起使用

查询字符串身份验证没有默认值。它是必需参数,如果 X-Amz-Algorithm=AWS4-HMAC-SHA256 出现在查询字符串中但 X-Amz-Expires=... 不出现,服务将拒绝请求。

<Error>
  <Code>AuthorizationQueryParametersError</Code>
...

Now what time stamp are we talking about here?

当与 Authorization: header 一起使用时,它指的是 X-Amz-Date:。因为 X-Amz-Date: 是签名算法输入的一部分,所以日期或时间的更改也会更改签名。提前或延迟 1 秒签名的 otherwise-identical 请求具有完全不同的签名。 AWS 基本上允许您的服务器时钟最多出现 15 分钟的错误,而不会破坏您对请求进行身份验证的能力。它不是后备或默认设置。是固定的window.

Authorization: header-based 请求的 X-Amz-Date: 由 AWS 与它们的系统时间进行比较,这当然是与 UTC 同步的,如果这样,请求将被拒绝请求到达时,该值与 UTC 偏差超过 15 分钟。在时间检查之前不会发生与身份验证相关的其他验证。

查询字符串身份验证到期的验证涉及不同的逻辑:

  • X-Amz-Expires 不能是大于 604800 或小于 0 的值;否则,请求将立即被拒绝,无需进一步处理,包括一条与上述类似的消息。
  • 根据 AWS 系统时钟,
  • X-Amz-Date 不得超过未来 15 分钟。错误是 Request is not yet valid.
  • X-Amz-Date 不得超过 X-Amz-Expires 过去的秒数,相对于 AWS 系统时钟,并且不适用 15 分钟容差。错误是 Request has expired.

如果出现这些情况中的任何一个,则不会对签名进行进一步验证,因此这些消息不会根据签名的有效性而改变。这个先检查一下。

此外,X-Amz-Date: 最左边的 8 个字符必须与 Authorization: header 的 Credential 组件的日期部分匹配。日期本身对与凭据的差异零容忍(因此,在签名时,不要两次读取您的系统时间,否则您可能会在午夜 UTC 左右生成偶尔无效的签名)。

最后,请求在处理过程中不会过期。如果您使用任一签名方法发送请求,该请求在到达时被视为有效但很快就会过期,则始终允许 运行 完成——例如,大型 S3 下载或 EBS 快照创建请求将不会启动,然后无法继续,因为在 AWS 端请求已经启动时到期计时器被触发。如果操作在请求时获得授权,则它会继续并照常成功。