InvalidSignatureException: Signature expired
TL;DR — 一个签名的 AWS 请求必须在其签名中烘焙的时间戳的约 5 分钟内到达服务。这个错误意味着你机器的时钟离 AWS 服务器时间太远(时钟偏移),因此签名"过期"了或"尚未生效"。修正客户端时钟——启用 NTP 时间同步。
含义
InvalidSignatureException: Signature expired: 20260712T101500Z is now earlier
than 20260712T101700Z (20260712T102200Z - 5 min.)Signature Version 4 把每个请求连同一个时间戳一起签名。AWS 会根据它自己的时钟验证那个时间戳,并拒绝任何在约五分钟窗口之外的东西——要么是 Signature expired(客户端时钟落后)要么是 Signature not yet current(客户端时钟超前)。它是一个 HTTP 400,属于客户端错误;在时钟被修正之前,盲目重试会再次失败。
为什么会发生
- 客户端时钟漂移——运行你应用的主机时钟不准(VM 暂停/恢复、没有时间同步的容器、IoT/边缘设备、CI 运行器)。
- NTP 未运行——没有东西约束操作系统时钟,因此它慢慢漂移超过了 5 分钟的容差。
- 手工签名器中的时区/UTC 处理错误,误算了请求时间戳。
- 长时间挂起的进程——一台笔记本或 Lambda 式环境在长时间暂停后带着陈旧的时间感恢复。
如何修复
- 在主机上启用 NTP 时间同步(
chrony/systemd-timesyncd/w32time),并确认时钟在真实 UTC 的一秒以内。 - 对比时钟: 对照一个可信来源检查客户端的 UTC 时间——如果它偏差数分钟,那就是原因。
- 在 VM 恢复或容器启动后重启时间同步服务(或手动重新同步)。
- 升级 AWS SDK——现代 SDK 会检测时钟偏移错误并用一个修正过的偏移量自动重试;旧的 SDK 可能不会。
优先使用官方 AWS SDK 而非手写的 SigV4 签名器,这样时间戳和偏移重试处理都为你完成了。
在 DynoTable 中
DynoTable 用 AWS SDK 签名,现代构建包含时钟偏差校正(连接 AWS 账户)。若错误只出现在自定义脚本而 DynoTable 连接正常,问题就隔离在该客户端的时钟或签名器上——与 设置 → 配置文件 里该配置文件的 测试连接 对比。休眠的 CI 或虚拟机请在跑应用/测试前启用 NTP。时钟和配置文件对齐之后,查询构建器可以确认读取确实成功了。
相关错误
- The security token expired——临时凭证过期了(另一种"过期")。
- The request signature we calculated does not match——由密钥错误而非时钟导致的签名不匹配。
- Credential should be scoped to a valid region——一个区域作用域的 SigV4 失败。
来源
- AWS Signature Version 4 for API requests — IAM User Guide(2026-07-13 验证 - 五分钟重播窗口)
- Troubleshoot Signature Version 4 signing for AWS API requests — IAM User Guide(2026-07-13 验证)
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide(2026-07-13 验证)
- Clock-skew correction — AWS Developer Tools Blog(2026-07-13 验证)