カールを使ってs3のオブジェクトを制御したいです。
パスワード:
s3key=xxxxx... (s3 key)
s3skey=xxxxxx...(secret key)
bucket=xxx
file=/xx.txt
date=$(date +"%a, %d %b %Y %T %z")
string="HEAD\n\n\n$date\n/$bucket$file"
signature=$(/bin/echo -en $string | openssl sha1 -hmac $s3skey -binary | base64)
curl -H "Host: $bucket.s3.amazonaws.com" \
-H "Date: $date" \
-H "Authorization: AWS $s3key:$signature" \
https://$bucket.s3-ap-northeast-1.amazonaws.com$file
私たちが計算したリクエスト署名があなたが提供した署名と一致しないというメッセージが常に表示されます。なぜか分からないの?
HEADからGETに変更すると動作し、オブジェクトを取得します。署名のどの部分が間違っているのか理解できません。
ありがとう
答え1
ご存知のように、署名にはリクエストが使用するhttpメソッド(例GET
:HEAD
- 要求された内容に基づいて提供された署名が一致しないことだけがわかります。
ここでの問題は、要求に対する署名を生成していますが、HEAD
カールがまだあることです。作る要求GET
。で直接確認できますcurl -v
。
解決策はカールに実際に要求をするように指示することですHEAD
。これはを通じて行われますcurl -I
。