3

認証を使用して SQS からメッセージを投稿および読み取ることができるプログラムを作成します。ここからドキュメントを読みました。リンク:クエリ リクエスト認証

指定されたキューにメッセージを投稿し、続いてドキュメントを送信するプロセスを正常に作成しました。しかし、キューからメッセージを受信しようとすると、常に 403 エラーが発生します。また、POST メソッドと GET メソッドでは署名文字列の規則が異なることがわかりました。

署名文字列は次のとおりです。

GET\n
sqs.us-east-1.amazonaws.com\n
/<My Account Id>/<Queue Name>\n
AWSAccessKeyId=<My Access Key>
&Action=ReceiveMessage
&MaxNumberOfMessages=10
&VisibilityTimeout=600
&AttributeName=All
&Expires=2012-04-01T11%3A29%3A24Z
&SignatureMethod=HmacSHA1
&SignatureVersion=2
&Version=2011-10-01

URLは

https://sqs.us-east-1.amazonaws.com/<My Account Id>/<Queue Name>?
Action=ReceiveMessage
&MaxNumberOfMessages=10
&VisibilityTimeout=600&AttributeName=All
&Version=2011-10-01
&Expires=2012-04-01T11%3A29%3A24Z
&Signature=<BASE64 encoded HmacSHA1 digist with signature string and my security key>
&SignatureVersion=2
&SignatureMethod=HmacSHA1
&AWSAccessKeyId=<My Access Key>

そして、常に 403 禁止エラーが発生します。

<ErrorResponse xmlns="http://queue.amazonaws.com/doc/2011-10-01/">
  <Error>
    <Type>Sender</Type> 
    <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>
    <Detail/>
  </Error>
  <RequestId>16f6e910-62e6-4259-8c09-0358b84cbe60</RequestId>
</ErrorResponse>

どうすれば対処できるか教えてくれる人はいますか?どうもありがとう

4

2 に答える 2

2

エラー メッセージは、署名が間違って計算されていることを示しています。これをデバッグするのは本当に大変です。初めて試したときは何時間も費やしました。http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/MakingRequests_MakingQueryRequestsArticle.htmlに署名付き SQS リクエストの例があります。これらのパラメーターをプログラムに入れ、署名を計算し、プログラムのバグを見つけて同じ署名を作成する必要があります。

私が抱えていた特定の問題と、それらの修正には次のものが含まれていました。

  • クエリ パラメータを正しく並べ替える。署名する文字列を作成するときは、昇順である必要があります。URL の例では、それらが順番に表示されていません。署名する文字列を作成するときに、それらを別の方法で並べ替えましたか?
  • URI エンコーディングが適切である。すべてのパラメーターは、署名する文字列で URI エンコードする必要があります。サンプル URL には URI エンコードが含まれているため、これはおそらく問題ではありません。ただし、二重エンコードしていないことを確認してください。
  • base64 署名のパディング。少なくとも一部の AWS サービスでは、署名の長さを 4 文字の倍数にする必要があります。3 分の 2 の確率で、base64 エンコーディングは短すぎるため、1 つまたは 2 つの等号を追加する必要があります。ほとんどの base64 エンコーディング ライブラリがそれを行いますが、すべてではありません。

もちろん、他の人のライブラリを使ってリクエストを行うのが最も簡単な方法ですが、それで何が楽しいのでしょうか? これをデバッグして頑張ってください。

于 2012-12-20T15:35:39.433 に答える
1

おそらくパラメーターの順序です。署名バージョン 2 文字列を組み立てるとき、最後のステップで Amazon のドキュメントで次のように指定されています。

クエリ文字列コンポーネント (最初の疑問符 (?) を除く名前と値のペア) を、RFC 3986 に従って URL エンコードされた UTF-8 文字 (16 進文字は大文字にする必要があります) として追加し、辞書式バイト順序を使用して並べ替えます。大文字と小文字が区別されます。

HMAC、BASE64、および URL エンコーディング手順を確認して、この同じ「SignatureDoesNotMatch」の問題をデバッグするのに 2 日間を費やしましたが、これは単なるパラメーターの順序の問題でした。

ドキュメントでは、この問題をより強調する必要があります。順序付けられていないパラメータ文字列 (たとえば、ドキュメントの例にあるようなリクエスト URL と同じ文字列) を使用すると、サーバーからこの非直感的なエラーが発生します。

于 2013-10-08T11:14:38.653 に答える