컬을 사용하여 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
)가 포함되어 있지만 서명 프로세스는 단방향 프로세스(HMAC 다이제스트 사용)이므로 서명 수신자(S3)는 요청에 서명할 때 무엇을 사용했는지 알 수 있는 방법 어떤 매개변수 - 요청한 내용을 기반으로 제공한 서명이 일치하지 않는다는 것만 알 수 있습니다.
여기서 문제는 요청에 대한 서명을 생성 중이지만 HEAD
컬이 여전히 있다는 것입니다.만들다요청 GET
. 를 이용하여 직접 확인하실 수 있습니다 curl -v
.
해결책은 컬에게 실제로 요청을 하도록 지시하는 것입니다 HEAD
. 이는 를 통해 수행됩니다 curl -I
.