pre-signed-url · L3

六個 X-Amz-* 參數

六個 X-Amz-* 參數,逐個講白

一句話:pre-signed URL 尾巴那串 X-Amz-*,就是 SigV4 認證所需的六樣資訊——宣告演算法、誰簽的、何時簽、有效多久、簽了哪些 header、以及那段簽章。

一條真的 URL 拆給你看

https://examplebucket.s3.amazonaws.com/test.txt
  ?X-Amz-Algorithm=AWS4-HMAC-SHA256
  &X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request
  &X-Amz-Date=20130524T000000Z
  &X-Amz-Expires=86400
  &X-Amz-SignedHeaders=host
  &X-Amz-Signature=aeeed9bb...d404

逐個意義

參數意義
X-Amz-Algorithm固定 AWS4-HMAC-SHA256——宣告「這是 SigV4、用 HMAC-SHA256 算的」。
X-Amz-CredentialaccessKeyID/日期/region/s3/aws4_request——第一段是公開的 access key ID,後面是 credential scope(限定日期/region/service)。
X-Amz-Date簽章時間,ISO 8601(yyyyMMddTHHmmssZ,UTC)。過期判斷的起點。
X-Amz-Expires有效秒數。最小 1、最大 604800(7 天)——因為 Signing Key 本身最多有效 7 天。
X-Amz-SignedHeaders哪些 header 被簽進去,分號連接。presigned 通常只有 host
X-Amz-SignatureSigV4 算出的那段簽章(小寫 hex)。

若用臨時憑證(STS),還會多一個 X-Amz-Security-Token

一個關鍵細節:X-Amz-Signature 不簽自己

算簽章時,canonical request 的 query 字串要含除了 X-Amz-Signature 以外的所有參數——因為簽章是「算完才有」的結果,不可能在算之前就把它塞進「要簽的內容」(雞生蛋)。其他五個 X-Amz-* 全都一起被簽,唯獨簽章自己排除。

參考來源