一句話:SigV4 用 X-Amz-Date 判斷時間,而 S3 會拒絕「時間戳跟 server 現在時間差太多」的請求(約 ±15 分鐘)——差太多就回 RequestTimeTooSkewed。
pre-signed URL 的有效性靠 X-Amz-Date(簽的時間)+ X-Amz-Expires(有效多久)算出來。如果產 URL 的機器時鐘不準,簽出來的 X-Amz-Date 就偏了,可能:
此外,AWS S3 為了防重放攻擊,會拒絕「時間戳跟 server 時間相差太多」的請求——常見說法是約 ±15 分鐘(這個容忍值各服務略有不同),超過就回 RequestTimeTooSkewed。
Docker 容器沒有硬體時鐘、又常沒跑 NTP,時間最容易漂。跑在裡面的服務簽出的 URL 就會莫名 RequestTimeTooSkewed——而你 code 一個字沒錯。
DateTime.UtcNow),別用本地時間。RequestTimeTooSkewed——幾乎 100% 是時鐘問題,先查對時,不要浪費時間查 code 或簽章。