AWS XML 응답 오류 서명 불일치

AWS XML 응답 오류 서명 불일치

AWS EC2 지역에 대한 XML 응답을 반환해야 하는 bash 스크립트가 있는데 다음과 같은 XML 오류 응답이 나타납니다.

"SignatureDoesNotMatch" 계산된 요청 서명이 귀하가 제공한 서명과 일치하지 않습니다. AWS 보안 액세스 키와 서명 방법을 확인하세요. 자세한 내용은 서비스 설명서를 참조하세요.

EC2 웹 쿼리에 대한 서명 방법이 정확합니까? 코드는 다음과 같습니다.

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

추신: 보안상의 이유로 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아니요매개변수의 실제 개행 문자가 에코되도록 해야 합니다.

관련 정보