S3 head object mas a assinatura não corresponde

0

Eu quero usar o curl para encabeçar objetos em s3.

código:

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

mostra sempre que a assinatura do pedido que calculamos não corresponde à assinatura que você forneceu. Eu não sei porque?

Se eu mudar para GET de HEAD, ele funcionará e eu receberei os objetos. Eu não entendo qual parte da assinatura está errada

thx

    
por yayaya 08.12.2016 / 09:19

1 resposta

2

A assinatura, como você percebe, inclui o método http (por exemplo, GET , HEAD ) que a solicitação estará usando ... mas o processo de assinatura é um processo unidirecional (usando um resumo HMAC), assim, o destinatário da assinatura (S3) não tem como saber quais parâmetros você usou ao assinar a solicitação - só sabe que, com base na solicitação que você está fazendo, a assinatura que você forneceu não corresponde a ela.

O problema aqui é que você está criando uma assinatura para uma solicitação HEAD , mas a curva ainda está fazendo uma solicitação GET . Você mesmo pode ver isso usando curl -v .

A solução é informar ao curl para realmente fazer uma solicitação HEAD , e isso é feito com curl -I .

    
por 08.12.2016 / 12:56