使用 Ruby 3.0 計算 AWS S3 Authorization 簽署值

Published by gleetsai on

最近在工作上需要使用 AWS S3 下載檔案,對方給了我關於該 AWS S3 的 Bucket name、Access Key 與 Secret Key,需要按照 AWS S3 的文件前去下載該檔案。

從 AWS 的文件中可以看出來,為了要計算簽署值,需要先準備簽署的本體,本體裡面有一段 CanonicalizedResource,他的格式如下

[ "/" + Bucket ] + <HTTP-Request-URI, from the protocol name up to the query string> + [ subresource, if present. For example "?acl", "?location", or "?logging"];

上面的格式裡的第一個字 “/” 千萬不要漏掉,我在這邊卡了好久,就是因為漏了這個字。

翻譯白話的意思就是說,假設我要去下載 https://glee-bucket.s3.amazonaws.com/files/abc.jpg,那麼這個網址的 Bucket name 就叫做 glee-bucket,URI 就是 /files/abc.jpg,最終做出的 CanonicalizedResource 就是:

/glee-bucket/files/abc.jpg

最後再把這個請求的資料

GET /glee-bucket/files/abc.jpg
Content-MD5 = 沒有(因為不是上傳)
Content-Type = 沒有
CanonicalizedAmzHeaders = 沒有用到

依據整個本體的格式

StringToSign = HTTP-Verb + "\n" + Content-MD5 + "\n" + Content-Type + "\n" + Date + "\n" + CanonicalizedAmzHeaders + CanonicalizedResource;

做成

GET\n\n\nFri, 29 Jul 2022 09:00:00 GMT\n/glee-bucket/files/abc.jpg

然後就可以用 Ruby 中的 HMAC-SHA1-Digest 來計算了:

require 'OpenSSL'
require 'base64'
key = "在這裡放入 Secret Key"
data = "GET\n\n\nFri, 29 Jul 2022 09:00:00 GMT\n/glee-bucket/files/abc.jpg"
hmac = OpenSSL::HMAC.digest("sha1",key,data)
Base64.encode64(hmac) #簽署值在這裡

用 Shell Script 測試簽署值是否可以下載檔案

curl "https://glee-bucket.s3.amazonaws.com/files/abc.jpg" \-H 'Authorization: AWS AccessKey:簽署值' \-H 'Date: Fri, 29 Jul 2022 09:00:00 GMT' #這邊要放入剛才簽署時所代入的時間字串

Categories: Coding