署名付き AWS API リクエストを作成する - AWS 全般のリファレンス

署名付き AWS API リクエストを作成する

以下は、署名付きリクエストを作成するプロセスの概要です。詳細については、「AWS SDK のサンプルコード」を参照してください。

手順 1: 正規リクエストを作成する

次の文字列を改行文字で区切って連結し、正規リクエストを作成します。これにより、計算する署名と AWS が計算する署名が一致することが保証されます。

HTTPMethod CanonicalUri CanonicalQueryString CanonicalHeaders SignedHeaders HashedPayload
  • HTTPMethod – HTTP メソッド。

  • CanonicalUri — 絶対パスコンポーネント URL の URI エンコード版 (ホストと疑問符 (?) の間のすべて) クエリ文字列パラメータが開始されます)。絶対パスが空値の場合は、フォワードスラッシュ文字 (/) を使用します。

  • CanonicalQueryString — URL でエンコードされたクエリ文字列パラメーターで、アンパサンド (&) で区切られています。スペース文字を含むパーセントエンコードされた予約文字。名前と値を別々にエンコードします。エンコード後、パラメータをキー名のアルファベット順にソートします。クエリ文字列がない場合は、空の文字列 ("") を使用します。

  • CanonicalHeaders — 改行文字で区切られたリクエストヘッダーとその値。ヘッダー名は小文字を使用し、アルファベット順に表示する必要があります。後にはコロン (:) を指定する必要があります。値については、先頭または末尾のスペースをすべて削除し、連続するスペースを 1 つのスペースに変換し、複数値ヘッダーの値をカンマで区切ります。host ヘッダー (HTTP/1.1) :authority またはヘッダー (HTTP/2)、およびすべての x-amz-* ヘッダーをリクエストに含める必要があります。リクエストには、content-type のような他の標準ヘッダーを指定する必要があります。

  • SignedHeadersCanonicalHeaders に含めたヘッダーのリスト。セミコロン (;) で区切られています。これは、どのヘッダーが署名プロセスの一部であるかを示します。ヘッダー名には小文字を使用し、アルファベット順に表示する必要があります。

  • HashedPayload — HTTP リクエスト本文のペイロードをハッシュ関数への入力として使用して作成された文字列。この文字列には小文字の 16 進数文字を使用します。ペイロードが空の場合、ハッシュ関数への入力として空の文字列を使用します。

以下は、Amazon EC2 DescribeInstances API アクションを呼び出す正規リクエストの例です。

GET / Action=DescribeInstances&Version=2016-11-15 content-type:application/x-www-form-urlencoded; charset=utf-8 host:ec2.amazonaws.com x-amz-date:20220830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

手順 2: 正規リクエストのハッシュを作成する

ペイロードのハッシュを作成する際に使用したのと同じアルゴリズムを使用して、正規リクエストのハッシュ (ダイジェスト) を作成します。正規リクエストのハッシュは、小文字の 16 進数文字の文字列として表す必要があります。

ハッシュ化された正規リクエストの例を次に示します。

f536975d06c0309214f805bb90ccff089219ecd68b2577efef23edd43b7e1a59

手順 3: 署名文字列を作成する

次の文字列を改行文字で区切って連結して、文字列を作成します。この文字列は改行文字で終わらせないようにしてください。

Algorithm RequestDateTime CredentialScope HashedCanonicalRequest
  • Algorithm — 正規リクエストのハッシュを作成するために使用されるアルゴリズム。SHA-256 では、アルゴリズムは AWS4-HMAC-SHA256 です。

  • RequestDateTime — 認証情報のスコープで使用される日付と時刻。

  • CredentialScope — 認証情報のスコープ。これにより、生成される署名は指定されたリージョンとサービスに制限されます。文字列の形式は YYYYMMDD/region/service/aws4_request です。

  • HashedCanonicalRequest — 正規リクエストのハッシュ。

以下は署名する文字列の例です。

AWS4-HMAC-SHA256 20220830T123600Z 20220830/us-east-1/ec2/aws4_request f536975d06c0309214f805bb90ccff089219ecd68b2577efef23edd43b7e1a59

手順 4: 署名を計算する

署名する文字列を作成すると、リクエストに追加する認証情報の署名を計算する準備が整います。各ステップで、必要なキーとデータを使用してハッシュ関数を呼び出します。

hash(key, data)

ハッシュ関数を呼び出すたびに、その結果はハッシュ関数への次の呼び出しの入力になります。

入力必須
  • シークレットアクセスキーを含む文字列 Key

  • 認証情報の範囲で使用される日付を含んだ YYYYYMMDD 形式の文字列 Date

  • リージョンコードを含む文字列 Region (例: us-east-1)

  • サービスコードを含む文字列 Service (例: ec2)

  • 上記の手順で作成したトピックを選択します。

署名を計算するには
  1. 「AWS4」とシークレットアクセスキーを連結します。データとしてのキーおよび日付文字列として、連結した文字列を備えたハッシュ関数を呼び出します。

    kDate = hash("AWS4" + Key, Date)
  2. データとしてのキーおよびリージョン文字列として、前回の結果を備えたハッシュ関数を呼び出します。

    kRegion = hash(kDate, Region)
  3. データとしてのキーおよびサービス文字列として、前回の結果を備えたハッシュ関数を呼び出します。

    kService = hash(kRegion, Service)
  4. データとしてのキーおよび「aws4_request」として、前回の結果を備えたハッシュ関数を呼び出します

    kSigning = hash(kService, "aws4_request")
  5. データとしての署名用キーおよび文字列として、前回の結果を備えたハッシュ関数を呼び出します。その結果、署名はバイナリ値になります。

    signature = hash(kSigning, string-to-sign)
  6. 署名を 2 進数から 16 進数表現に、小文字に変換します。以下は、計算された署名の例です。

    5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b5924a6f2b5d7

手順 5: リクエストヘッダーに署名を追加します。

HTTP Authorization ヘッダーまたはクエリ文字列パラメーターを使用して、リクエストに認証情報を追加できます。Authorization ヘッダーパラメータとクエリ文字列パラメータの両方を使用して、認証情報を追加することはできません。

例: 認証ヘッダー

以下の例は、DescribeInstances アクションに対する Authorization ヘッダーを示しています。読みやすいように、この例では改行でフォーマットされています。コードでは、これは連続した文字列である必要があります。アルゴリズムと Credential の間にカンマはありません。ただし、他の要素はカンマで区切られている必要があります。

Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20220830/us-east-1/ec2/aws4_request, SignedHeaders=host;x-amz-date, Signature=calculated-signature
例: クエリ文字列に認証パラメータを含むリクエスト

次の例は、認証情報を含む DescribeInstances アクションのクエリを示しています。読みやすいように、この例は改行でフォーマットされており、URL はエンコードされていません。コードでは、クエリ文字列は URL エンコードされた連続した文字列である必要があります。

https://ec2.amazonaws.com/? Action=DescribeInstances& Version=2016-11-15& X-Amz-Algorithm=AWS4-HMAC-SHA256& X-Amz-Credential=AKIAIOSFODNN7EXAMPLE/20220830/us-east-1/ec2/aws4_request& X-Amz-Date=20220830T123600Z& X-Amz-SignedHeaders=host;x-amz-date& X-Amz-Signature=calculated-signature

一時的な認証情報

リクエストに署名するために長期的に認証情報を使用する代わりに、AWS Security Token Service (AWS STS) から提供された一時的なセキュリティ認証情報を使用できます。

一時的なセキュリティ認証情報を使用する場合は、認証ヘッダーまたはクエリ文字列にセッショントークンを保持するように X-Amz-Security-Token を追加する必要があります。一部のサービスでは、正規リクエストに X-Amz-Security-Token を追加する必要があります。その他のサービスでは、署名の計算後に、X-Amz-Security-Token を末尾に追加するだけです。詳細については、それぞれ AWS のサービス のドキュメントを確認してください。

AWS SDK のコード例

AWS SDK には、AWS API リクエストに署名する方法を示す GitHub のソースコードが含まれています。