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