pre-signed-url · L4

用 curl 驗證

用 curl 驗證 pre-signed URL

一句話:產完 URL 別只是相信它——用 curl 打一次最快。GET 用 -o 存檔、PUT 用 -T 上傳;若簽了 content-type,PUT 一定要用 -H 帶對。

驗 GET(下載)

直接 GET 那條 URL,存成檔案。整條 URL 記得用引號包住(裡面有 &):

curl -o out.jpg "https://my-bucket.s3.amazonaws.com/photo.jpg?X-Amz-Algorithm=...&X-Amz-Signature=..."

成功就會把物件存進 out.jpg。想看回應碼加 -i-v

驗 PUT(上傳)

-T(等同 --upload-file)發 PUT,把本機檔案送上去:

curl -T ./local.jpg "https://my-bucket.s3.amazonaws.com/uploads/photo.jpg?X-Amz-Algorithm=...&X-Amz-Signature=..."

坑:簽了 content-type,就得帶對

如果產 URL 時填了 content-type,它就被簽進 SignedHeaders,上傳時送的 Content-Type 必須一字不差
curl -T ./local.jpg -H "Content-Type: image/jpeg" "https://.../uploads/photo.jpg?..."
漏了、或寫成 image/pngSignatureDoesNotMatch。反之,沒簽 content-type 就別硬加——加了反而多一個沒被簽的 header,可能出錯。

這正是 Level 3 那句「被簽的東西改一字元、簽章就對不上」的實戰演示。

常見錯誤怎麼讀

回應多半是
SignatureDoesNotMatchcontent-type 對不上、region 填錯、path-style 沒設對、URL 被改到
AccessDenied + Request has expired過期(Expires 到了,或時鐘偏移——Level 5)
連 MinIO 回怪錯ForcePathStyle 沒設 true

參考來源