アマゾン ウェブ サービス
全般的なリファレンス (Version 1.0)

署名バージョン 4 を使用して AWS リクエストに署名する

このセクションでは、署名を作成し、AWS への HTTP リクエストに追加する方法について説明します。


        署名バージョン 4 の署名プロセス

署名手順の概要

署名付きリクエストを作成するには、次の操作を完了します。

  • タスク 1: 署名バージョン 4 の正規リクエストを作成する

    リクエストのコンテンツ (ホスト、アクション、ヘッダーなど) を標準的な形式、つまり正規形式に変換します。正規リクエストは、署名する文字列を作成するのに使用される入力の 1 つです。

  • タスク 2: 署名バージョン 4 の署名文字列を作成する

    正規リクエストに加えてアルゴリズム、リクエスト日、認証情報スコープ、正規リクエストのダイジェスト (ハッシュ) などの追加情報を使用して、署名する文字列を作成します。

  • タスク 3: AWS 署名バージョン 4 の署名を計算する

    署名キーを取得するには、最初のハッシュ操作のキーとして AWS のシークレットアクセスキーを使用し、リクエスト日、リージョン、サービスに対して一連のキー付きハッシュ操作 (HMAC 操作) を実行します。署名キーを取得したら、署名文字列にキー付きハッシュ操作を実行することで、署名を計算します。取得した署名キーを、この操作のハッシュキーとして使用します。

  • タスク 4: HTTP リクエストに署名を追加する

    署名を計算したら、それをリクエストの HTTP ヘッダーまたはクエリ文字列に追加します。

注記

AWS SDK が署名の計算プロセスを処理するため、署名プロセスを手動で実行する必要はありません。詳細については、「アマゾン ウェブ サービスのツール」を参照してください。

その他の署名リソース

以下のその他のリソースでは、署名プロセスの特徴を示します。

  • 署名バージョン 4 の署名キーを取得する方法の例.このページでは、Java、C#、Python、Ruby、および JavaScript を使用して署名キーを取得する方法を説明します。

  • 完全なバージョン 4 署名プロセスの例 (Python) .Python の以下のプログラムでは、署名プロセスの詳細な例を示します。この例は POST リクエスト、リクエストヘッダーに署名情報がある GET リクエスト、およびクエリ文字列に署名情報がある GET リクエストを含む署名を示します。

  • 署名バージョン 4 テストスイート.このダウンロード可能なパッケージは、署名プロセスのさまざまなステップについて、署名情報を含む例を集めたものです。これらの例を使用し、署名コードがプロセスの各ステップで正しい結果を生成することを確認できます。

リクエスト内の署名の例

次の例は、署名情報なしでクライアントから AWS に送信される場合の HTTPS リクエストを示しています。

GET https://iam.amazonaws.com/?Action=ListUsers&Version=2010-05-08 HTTP/1.1 Content-Type: application/x-www-form-urlencoded; charset=utf-8 Host: iam.amazonaws.com X-Amz-Date: 20150830T123600Z

署名タスクを完了したら、認証情報をリクエストに追加します。次の 2 つの方法で認証情報を追加できます。

Authorization ヘッダー

Authorization ヘッダーを含むリクエストに認証情報を追加できます。HTTP ヘッダーは Authorization という名前ですが、実際には、署名情報がリクエスト元の認証に使用されます。

Authorization ヘッダーには、次に示す情報が含まれます。

  • 署名に使用したアルゴリズム (AWS4-HMAC-SHA256)

  • 認証情報スコープ (アクセスキー ID を含む)

  • 署名付きヘッダーの一覧

  • 計算された署名。この署名はリクエスト情報に基づいており、AWS シークレットアクセスキーを使用して署名を生成します。署名により、AWS の ID が確認されます。

次の例は、作成した署名情報を、前のリクエストの Authorization ヘッダーに追加した後のリクエストを示しています。

GET https://iam.amazonaws.com/?Action=ListUsers&Version=2010-05-08 HTTP/1.1 Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/iam/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b5924a6f2b5d7 content-type: application/x-www-form-urlencoded; charset=utf-8 host: iam.amazonaws.com x-amz-date: 20150830T123600Z

クエリ文字列

認証情報を HTTP リクエストヘッダーに追加する代わりに、クエリ文字列に認証情報を含めることができます。クエリ文字列には、アクションの名前およびパラメーター、日付、認証情報など、リクエストの一部になるものがすべて含まれます。

次の例は、クエリ文字列に含まれるアクションおよび認証情報を使用して GET リクエストを作成する方法を示しています。

GET https://iam.amazonaws.com?Action=ListUsers&Version=2010-05-08&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fiam%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=60&X-Amz-SignedHeaders=content-type%3Bhost&X-Amz-Signature=37ac2f4fde00b0ac9bd9eadeb459b1bbee224158d66e7ae5fcadb70b2d181d02 HTTP/1.1 content-type: application/x-www-form-urlencoded; charset=utf-8 host: iam.amazonaws.com

クエリ API の GET および POST リクエスト

多くの AWS サービスがサポートするクエリ API を使用すると、HTTP の GET または POST でリクエストを送信できます。(クエリ API では、状態を変更するリクエストを送信する場合でも GET を使用できます。つまり、クエリ API は本質的に RESTful ではありません。) GET リクエストは、クエリ文字列でパラメータを渡すので、URL の最大の長さに制限されています。リクエストに大きなペイロードが含まれている場合 (DynamoDB リクエストで大きな IAM ポリシーをアップロードしたり、多数のパラメーターを JSON 形式で送信したりする場合など) は、通常、POST リクエストを使用します。

署名プロセスはどちらのタイプのリクエストでも同じです。