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。

現代 AWS SDK 會檢測時鐘偏移錯誤並用一個修正過的偏移量重試;如果你只在手寫的簽名器裡見到它,先升級 SDK 或在主機上啟用 NTP,再去怪 DynamoDB 本身。DynoTable 只走 SDK 這條路——沒有任何自訂的 SigV4 組裝。時鐘和設定檔案對齊之後,查詢構建器可以確認讀取確實成功。

相關錯誤

來源

不必透過主控台就能操作 DynamoDB

一款快速的 DynamoDB 桌面用戶端,可執行 DynamoDB 無法執行的真正 SQL — JOINs、GROUP BY、聚合 — 並支援視覺化編輯與使用你自己的 Bedrock 金鑰的 AI 代理。

30 天免費試用,無需信用卡 — 之後為無時間限制的免費方案。