用例: 我目前正在嘗試創建一個能夠將檔案上傳到 AWS S3 存盤桶的 bash 腳本。不幸的是,這將用于數百個無法安裝 AWS CLI 或 s3cmd 或類似的系統。所以我不得不求助于bash。我已經生成了一個 zsh 腳本,它可以在我的 Mac 系統上按預期作業,但現在要在 linux 上創建。
到目前為止作業: 我的代碼一直有效,直到我需要對規范請求進行哈希處理:
canonical_request_hash=$(echo -n $canonical_request | openssl dgst -sha256)
當我運行我的代碼 AWS 回傳標準
我們計算的請求簽名與您提供的簽名不匹配。檢查您的密鑰和簽名方法。
錯誤。
查看錯誤回應后,我的 CanonicalRequest 與 AWS 生成的相同,但 StringToSign 具有不同的 canonical_request_hash。
這是我生成與 AWS 不同的哈希的代碼片段:
# Initial Canoncial Request String
canonical_request="PUT
/$file_name
host:$aws_s3_host.s3.amazonaws.com
x-amz-content-sha256:$file_sha256
x-amz-date:$now_time
host;x-amz-content-sha256;x-amz-date
$file_sha256"
# THE CANONICAL REQUEST ABOVE IS WHAT AWS PRODUCES.
###
# Generate Canonical Request Hash
canonical_request_hash=$(echo -n $canonical_request | openssl dgst -sha256)
###
# THE CANONICAL REQUEST HASH ABOVE IS DIFFERENT THAN WHAT AWS PRODUCES.
# String that will be used to generate AWS Signature
string_to_sign="AWS4-HMAC-SHA256
$now_time
$now_date/$region/s3/aws4_request
$canonical_request_hash"
我嘗試了不同的哈希命令:
sha256sum openssl dgst -sha256
并嘗試使用和不使用 -n 選項的 echo。
我嘗試將 canonical_request 設定為檔案,然后對檔案進行哈希處理。為什么?不知道,只是嘗試我能想到的一切。哈哈
任何幫助將不勝感激。
uj5u.com熱心網友回復:
當您不參考 $canonical_request 變數時,空格會更改。利用
printf '%s' "$canonical_request" | openssl ...
進一步閱讀:
- 3.5.7 bash手冊中的分詞
- 忘記在 bash/POSIX shell 中參考變數的安全隱患
- 為什么 printf 比 echo 好?
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/526552.html
