A assinatura de erro de resposta XML do AWS não corresponde

2

Eu tenho um script bash que deve retornar a resposta XML para regiões do AWS EC2 mas estou recebendo uma resposta de erro XML como:

"SignatureDoesNotMatch" The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.

O método para gerar a assinatura da consulta da Web do EC2 está correto? Aqui está o código:

#!/bin/bash

dt=$(date +%FT%TZ | sed 's/:/%3A/g')
echo "$dt"

q="GET
ec2.amazonaws.com
/
Action=DescribeRegions&AWSAccessKeyId=<aws access key>&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=$dt&Version=2013-02-01"

sig=$(echo -en "$q" | openssl dgst -sha256 -hmac "<aws secret key>" -binary | openssl enc -base64)
echo "the signature is $sig"

curl --get --data-urlencode DATA "https://ec2.amazonaws.com/?Action=DescribeRegions&AWSAccessKeyId=<aws access key>&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=$dt&Version=2013-02-01&Signature=$sig"
echo -e "\n\n finished "

P.S: a chave de acesso da AWS e a chave secreta da AWS são removidas por motivos de segurança. Elas funcionam muito bem.

    
por smast267 11.06.2013 / 09:50

1 resposta

1

Se a postagem contiver o código real, o problema provavelmente é o --data-urlencode DATA na solicitação de curl. Isso fará com que &DATA seja anexado à solicitação, o que certamente não é o que você deseja. Acredito que você precise url codificar a assinatura ("A assinatura resultante deve ser codificado em base 64 e, em seguida, URI codificado.") Que você pode fazer com:

curl --get --data-urlencode "Signature=$sig" "https://ec2.amazonaws.com/?Action=DescribeRegions&AWSAccessKeyId=<aws access key>&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=$dt&Version=2013-02-01"

Sugiro usar a opção de linha de comando -v para curl para fins de depuração; Ele permitirá que você veja a linha de solicitação real, que você pode comparar com o formato esperado.

Além disso, verifique se não há espaços à direita na definição de q .

Como um problema secundário, não há motivos para especificar o -e flag para echo . -e é usado para fazer com que \ -sequências como \n sejam alteradas para os caracteres reais (hex 0A neste caso); você não tem \ em $q , portanto, não há necessidade de recodificação. -e é não necessário para fazer com que novas linhas reais no argumento sejam ecoadas.

    
por 24.06.2013 / 17:30