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
데 사용됩니다 . 따라서 다시 인코딩할 필요가 없습니다 . 예\
\n
0A
\
$q
-e
아니요매개변수의 실제 개행 문자가 에코되도록 해야 합니다.