2013-09-22 7 views
1

Amazon EC2 API와 상호 작용할 수있는 앱을 작성 중이며 이전에는 한번도 해 본 적이 없으므로 DescribeRegions와 같은 간단한 것으로 시작하기로했습니다.오류 : DescribeRegions API 호출의 InvalidAction (Amazon AWS/EC2 API)

나는 이것을 C 라이브러리에서 사용하기 때문에 libcurl과 libcrypto를 함께 해킹해야한다. 전체 공개, AWS/EC2 API와 프로그래밍 방식으로 상호 작용하는 것은 이번이 처음이므로 이것은 초보자 실수 일 수 있습니다.

나는 stackoverflow를 통해 읽었습니다. 이 사람이 bash에서 요청을 보내려고 시도하고 문자열을 인용하지 않은 question과 동일하지 않습니다. 내가 찾을 수있는 모든 문서를 읽은 후 curl_easy_perform()

을 통해 요청을 보내고있다 (이 예를 들어, 내 비밀 키를 내 AWS 액세스 키와 BBBBBBB에 대한 AAAAAAAAA을 대체 할 수 있습니다.

내가 매개 변수를 구성을 판독 here 바와 같이 서명 요청의 일부 :

Action=DescribeRegions&AWSAccessKeyId=AAAAAAAA&SignatureMethod=HmacSHA256&"SignatureVersion=2&Timestamp=2013-09-22T02:12:27Z&Version=2013-08-15 

을 진행하고 그 벗어나

GET\n 
ec2.amazonaws.com\n 
/\n 
Action%3DDescribeRegions%26AWSAccessKeyId%AAAAAAAAAAAA%26SignatureMethod%3DHmacSHA256%26SignatureVersion%3D2%26Timestamp%3D2013-09-22T02%3A12%3A27Z&Version=2013-08-15 
의 서명 요청을 생성 그때에 서명을 구성하기 위해 진행

와 읽기 요청을 마련 (의이 CCCCCCCC를 부르 자) :

https://ec2.amazonaws.com/?Action%3DDescribeRegions%26AWSAccessKeyId%3DAAAAAAAAAAAAA%26SignatureMethod%3DHmacSHA256%26SignatureVersion%3D2%26Timestamp%3D2013-09-22T02%3A12%3A27Z&Version=2013-08-15&Signature=CCCCCCCCCCC 

내가 함께이를 보낼 때, 나는 다음과 같은 오류가 발생합니다.

<?xml version="1.0" encoding="UTF-8"?> 
<Response><Errors><Error><Code>SignatureDoesNotMatch</Code><Message>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.</Message></Error></Errors><RequestID>585f8932-d27b-42b3-b20e-453d8c7ee1ef</RequestID></Response> 

사용하는 서명 메커니즘은 간단한 hmac_sha256입니다. 또한 wikipedia article에서 참조 된 hmac_sha256 라이브러리를 시도했으며 download here을 사용할 수있었습니다.

서명 알고리즘이 올바른지 확인 했으므로 서명 할 문자열이 잘못되었다고 가정해야합니다.

문서 (AWS 문서)는 불행히도이 점에서 적절하지 않습니다. 예를 들어

, 그것은 reads :

정확히 여기에 정렬 나 한테 물어 무엇

Add the query string components (the name-value pairs, not including the initial question mark (?) as UTF-8 characters which are URL encoded per RFC 3986 (hexadecimal characters must be uppercased) and sorted using lexicographic byte ordering. Lexicographic byte ordering is case sensitive.

?

모든 도움을 주시면 감사하겠습니다. 여기에 완전한 소스 코드를 게시하면 도움이 될까요? 키의 세트

답변

2

What exactly are they asking me to sort here?

키는/값 쌍은 어떠한 정의 된 정렬 순서가 없지만, 오직 서명 알고리즘의 일 개 정확한 출력이있을 수 있기 때문에, 정의에 의해 하나의 정확한 입력이있을 수있다 .. 그리고 올바른 입력은 정렬 된 키가있는 키/값 쌍을 추가하여 구성된 문자열입니다.

서명 할 문자열을 작성할 때 쿼리 문자열의 키 (이름)를 정렬합니다. 예를 들어, "AWSAccessKeyId"는 "Timestamp"이전에 오는 "SignatureMethod"앞에옵니다. 정렬 된 키로 문자열을 작성합니다.

는하지만 난 당신이 가지고있는 다른 문제는이 생각 :

proceed to escape that and generate a signing request of

... 
Action%3DDescribeRegions%26AWSAccessKeyId%AAAAAAAAAAAA ... 

기다립니다. 이 문자열을 작성할 때 구분 기호가 아닌 키와 값만 urlencode (이스케이프)합니다. 그것은이 비슷한 제품을 더 보일 것입니다 : 예에서

Action=DescribeRegions&AWSAccessKeyId= ... 

공지 사항, 유일한 당신이 볼 탈출하지 않는 :%3A이되는 타임 스탬프에서 발견하지만, 쿼리 문자열에서 =&처럼 탈출. 문자열이 아닌 키와 값을 이스케이프해야합니다.

0

Michael 덕분에 지금 당장 볼 수없는 또 다른 대답은 신비가 해결되었습니다.

완전한 해결 방법이 ...

  1. 마이클이 말한대로, 다양한 키/값 쌍은 알파벳 순으로 을 정렬해야 AWSAccessKeyId이되기 전에 행동이다 (나는에 오류를 만들고 있었다 일)입니다 .
  2. 서명 요청을 구성하는 데 = 및 &을 인코딩하는 URI입니다.
  3. HMAC_Final은 요청한대로 서명을 구성하지만 null을 제공하지 않습니다. 종료 된 문자열; SHA256이 32 바이트 길이이고 올바른 위치에 널 종결자를 넣는 것은 당신에게 달려 있습니다.

정답은 Michael입니다!