AWS XMLレスポンスエラー署名の不一致

AWS XMLレスポンスエラー署名の不一致

AWS EC2リージョンへのXML応答を返す必要があるbashスクリプトがあり、次のXMLエラー応答が表示されます。

「SignatureDoesNotMatch」計算された要求署名があなたが提供した署名と一致しません。 AWSセキュリティアクセスキーと署名方法を確認してください。詳細については、サービスマニュアルを参照してください。

EC2 Webクエリの署名方法は正しいですか?コードは次のとおりです。

#!/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 "

PS:セキュリティ上の理由から、AWSアクセスキーとAWSシークレットキーを削除しましたが、正常に動作します。

ベストアンサー1

投稿に実際のコードが含まれている場合、--data-urlencode DATAカール要求に問題がある可能性があります。これは要求を追加しますが、&DATAこれはもちろん望むものではありません。署名をURLでエンコードする必要があると思います(「生成された署名は最初にbase-64でエンコードされ、次にURIでエンコードされる必要があります」)。次のようにできます。

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"

-vデバッグにはコマンドラインオプションを使用することをお勧めしますcurl。これにより、実際のリクエスト行が表示され、予想される形式と比較できます。

また、定義に末尾のスペースがないことを確認してくださいq

-e追加の質問でフラグをecho。シーケンスを実際の文字(この場合は16進数)に変更する-eために使用されます。したがって、再エンコードする必要はありません。はい\\n0A\$q-eいいえパラメーターの実際の改行文字をエコーする必要があります。

おすすめ記事