是X-Amz-Expires
必需的标头/参数吗?
X-Amz-Expires
仅与查询字符串身份验证一起使用,而不与Authorization:
标头一起使用。
查询字符串身份验证没有默认值。它是必需参数,如果X-Amz-Algorithm=AWS4-HMAC-SHA256
查询字符串中存在但X-Amz-Expires=...
不存在,服务将拒绝请求。
<Error>
<Code>AuthorizationQueryParametersError</Code>
...
现在我们在这里谈论什么时间戳?
这是指X-Amz-Date:
与Authorization:
标题一起使用时。因为X-Amz-Date:
是签名算法输入的一部分,所以日期或时间的更改也会更改签名。早于或晚 1 秒签名的其他相同请求具有完全不同的签名。AWS 本质上允许您的服务器时钟最多出错 15 分钟,而不会破坏您对请求进行身份验证的能力。它不是后备或默认设置。这是一个固定的窗口。
AWS将X-Amz-Date:
基于Authorization:
标头的请求与其系统时间进行比较,系统时间当然与 UTC 同步,如果在请求到达时该值与 UTC 偏差超过 15 分钟,则请求将被拒绝。在时间检查之前不会发生与身份验证相关的其他验证。
Query String 身份验证过期的验证涉及不同的逻辑:
X-Amz-Expires
不得为大于 604800 或小于 0 的值;否则,请求将立即被拒绝,无需进一步处理,包括类似于上述消息的消息。
X-Amz-Date
根据 AWS 系统时钟,未来不得超过 15 分钟。错误是Request is not yet valid
。
X-Amz-Date
相对于 AWS 系统时钟,不得超过X-Amz-Expires
过去的秒数,并且不适用 15 分钟的容差。错误是Request has expired
。
如果出现任何这些情况,则不会对签名进行进一步验证,因此这些消息不会根据签名的有效性而改变。这是首先检查的。
此外,您最左边的 8 个字符必须与标题组件的X-Amz-Date:
日期部分匹配。日期本身对凭证的差异零容忍(因此,在签名时,不要两次读取系统时间,否则您可能会在 UTC 午夜前后偶尔生成无效签名)。Credential
Authorization:
最后,请求在处理过程中不会过期。如果您使用任一签名方法发送请求,该请求在到达时被视为有效,但此后很快就会过期,则始终允许它运行到完成——例如,大型 S3 下载或 EBS 快照创建请求将不会启动,然后无法继续,因为在 AWS 端已经开始请求时到期计时器已触发。如果该操作在请求时被授权,则它会继续并正常成功。