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 進文字は大文字にする必要があります) として追加し、辞書式バイト順を使用して並べ替えます。大文字と小文字が区別されます。
彼らは正確に何を私にここに分類するように求めているのですか?
どんな助けでも大歓迎です。ここに完全なソース コードを投稿すると役に立ちますか?