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 式环境在长时间暂停后带着陈旧的时间感恢复。

如何修复

  1. 在主机上启用 NTP 时间同步chrony/systemd-timesyncd/w32time),并确认时钟在真实 UTC 的一秒以内。
  2. 对比时钟: 对照一个可信来源检查客户端的 UTC 时间——如果它偏差数分钟,那就是原因。
  3. 在 VM 恢复或容器启动后重启时间同步服务(或手动重新同步)。
  4. 升级 AWS SDK——现代 SDK 会检测时钟偏移错误并用一个修正过的偏移量自动重试;旧的 SDK 可能不会。

优先使用官方 AWS SDK 而非手写的 SigV4 签名器,这样时间戳和偏移重试处理都为你完成了。

在 DynoTable 中

DynoTable 用 AWS SDK 签名,现代构建包含时钟偏差校正(连接 AWS 账户)。若错误只出现在自定义脚本而 DynoTable 连接正常,问题就隔离在该客户端的时钟或签名器上——与 设置 → 配置文件 里该配置文件的 测试连接 对比。休眠的 CI 或虚拟机请在跑应用/测试前启用 NTP。时钟和配置文件对齐之后,查询构建器可以确认读取确实成功了。

相关错误

来源

无需控制台即可使用 DynamoDB

一款快速的 DynamoDB 桌面客户端,可运行 DynamoDB 无法执行的真正 SQL——JOINs、GROUP BY、聚合——并支持可视化编辑和运行在你自己的 Bedrock 密钥上的 AI agent。

30 天免费试用,无需信用卡 — 之后为无时间限制的免费版。