1

Amazon EC2 API と対話するアプリを作成していますが、これまでに行ったことがないので、DescribeRegions のような簡単なものから始めることにしました。

私は C でこれを行っているので、これには使いやすいライブラリがないため、libcurl および libcrypto と一緒にハックする必要があります。完全な開示、プログラムで AWS/EC2 API と対話するのはこれが初めてなので、これはばかげた初心者の間違いかもしれません。

私はstackoverflowを読みました。これは、人が bash からリクエストを送信しようとしていて、文字列を引用していなかったという質問と同じではありません。からリクエストを送信していますcurl_easy_perform()

見つけたすべてのドキュメントを読んだ後 (この例では、AWS アクセス キーを AAAAAAAAA に、シークレット キーを BBBBBBB に置き換えてみましょう。

ここで説明されているように、署名要求のパラメーター部分を作成します。

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; です。ウィキペディアの記事で参照され、ここからダウンロードできるhmac_sha256 ライブラリも試しました。

署名アルゴリズムが正しいことを確認したので、署名している文字列が正しくないと仮定するだけで済みます。

残念ながら、ドキュメント (AWS ドキュメント) は、この点に関して十分ではありません。

たとえば、次のようになります

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

彼らは正確に何を私にここに分類するように求めているのですか?

どんな助けでも大歓迎です。ここに完全なソース コードを投稿すると役に立ちますか?

4

2 に答える 2

0

マイケルと私が今見ることができない別の答えのおかげで、謎は解決されました.

完全な解像度はこれです...

  1. Michael が言うように、さまざまなキーと値のペアはアルファベット順に並べ替える必要があり、AWSAccessKeyId は Action の前に配置されます (これは私がエラーを起こしていた部分です)。
  2. 署名要求の作成で、= と & を URI エンコードしました。
  3. HMAC_Final は要求どおりに署名を作成しますが、null で終了する文字列は提供しません。SHA256 の長さが 32 バイトであることを認識し、ヌル ターミネータを適切な場所に配置するのはあなた次第です。

正解はマイケルに贈ります!

于 2013-09-23T00:07:22.220 に答える