S3头对象但签名不匹配

S3头对象但签名不匹配

我想使用curl来控制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 方法(例如GETHEAD)...但签名过程是单向过程(使用 HMAC 摘要),因此签名的接收者 (S3)无法知道您在签署请求时使用了哪些参数 - 它只知道根据您发出的请求,您提供的签名与其不匹配。

这里的问题是您正在为请求创建签名HEAD,但curl仍然是制作一个GET要求。您可以使用 自行查看curl -v

解决方案是告诉curl实际发出请求HEAD,这是通过curl -I.

相关内容