署名付き AWS API リクエストを作成する
以下は、署名付きリクエストを作成するプロセスの概要です。詳細については、「AWS SDK のサンプルコード」を参照してください。
内容
手順 1: 正規リクエストを作成する
次の文字列を改行文字で区切って連結し、正規リクエストを作成します。これにより、計算する署名と AWS が計算する署名が一致することが保証されます。
HTTPMethod
CanonicalUri
CanonicalQueryString
CanonicalHeaders
SignedHeaders
HashedPayload
-
HTTPMethod
– HTTP メソッド。 -
CanonicalUri
— 絶対パスコンポーネント URL の URI エンコード版 (ホストとクエリ文字列パラメータを開始する疑問符 (?) の間のすべて)。絶対パスが空値の場合は、フォワードスラッシュ文字 (/) を使用します。 -
CanonicalQueryString
— URL でエンコードされたクエリ文字列パラメーターで、アンパサンド (&) で区切られています。空白文字を含むパーセントエンコードされた予約文字。名前と値を別々にエンコードします。空のパラメータがある場合は、エンコードする前にパラメータ名に等号を追加します。エンコード後、パラメータをキー名のアルファベット順にソートします。クエリ文字列がない場合は、空の文字列 ("") を使用します。 -
CanonicalHeader
— 改行文字で区切られたリクエストヘッダー (符号付) とその値。ヘッダー名は小文字を使用し、アルファベット順に表示する必要があります。後にはコロン (:) を指定する必要があります。値については、先頭または末尾のスペースをすべて削除し、連続するスペースを 1 つのスペースに変換し、複数値ヘッダーの値をカンマで区切ります。host
ヘッダー (HTTP/1.1) または:authority
ヘッダー (HTTP/2)、およびすべてのx-amz-*
ヘッダーを署名に含める必要があります。署名には、content-type
のような他の標準ヘッダーを指定することもできます。 -
SignedHeaders
—CanonicalHeaders
に含めたヘッダーのリスト。セミコロン (;) で区切られています。これは、どのヘッダーが署名プロセスの一部であるかを示します。ヘッダー名には小文字を使用し、アルファベット順に表示する必要があります。 -
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
payload-hash
手順 2: 正規リクエストのハッシュを作成する
ペイロードのハッシュを作成する際に使用したのと同じアルゴリズムを使用して、正規リクエストのハッシュ (ダイジェスト) を作成します。正規リクエストのハッシュは、小文字の 16 進数文字の文字列として表す必要があります。
手順 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
canonical-request-hash
手順 4: 署名を計算する
署名する文字列を作成すると、リクエストに追加する認証情報の署名を計算する準備が整います。各ステップで、必要なキーとデータを使用してハッシュ関数を呼び出します。
hash(key, data)
ハッシュ関数を呼び出すたびに、その結果はハッシュ関数への次の呼び出しの入力になります。
入力必須
シークレットアクセスキーを含む文字列
Key
認証情報の範囲で使用される日付を含んだ YYYYYMMDD 形式の文字列
Date
リージョンコードを含む文字列
Region
(例:us-east-1
)サービスコードを含む文字列
Service
(例:ec2
)上記の手順で作成したトピックを選択します。
署名を計算するには
-
「AWS4」とシークレットアクセスキーを連結します。データとしてのキーおよび日付文字列として、連結した文字列を備えたハッシュ関数を呼び出します。
kDate = hash("AWS4" + Key, Date)
-
データとしてのキーおよびリージョン文字列として、前回の結果を備えたハッシュ関数を呼び出します。
kRegion = hash(kDate, Region)
-
データとしてのキーおよびサービス文字列として、前回の結果を備えたハッシュ関数を呼び出します。
kService = hash(kRegion, Service)
-
データとしてのキーおよび「aws4_request」として、前回の結果を備えたハッシュ関数を呼び出します
kSigning = hash(kService, "aws4_request")
-
データとしての署名用キーおよび文字列として、前回の結果を備えたハッシュ関数を呼び出します。その結果、署名はバイナリ値になります。
signature = hash(kSigning,
string-to-sign
) -
署名を 2 進数から 16 進数表現に、小文字に変換します。
手順 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 のソースコードが含まれています。
-
AWS SDK for .NET – AWS4Signer.cs
-
AWS SDK for C++ – AWSAuthV4Signer.cpp
-
AWS SDK for Go – v4.go
-
AWS SDK for Java – BaseAws4Signer.java
-
AWS SDK for JavaScript – v4.js
-
AWS SDK for PHP – SignatureV4.php
-
AWS SDK for Python (Boto) – signers.py
-
AWS SDK for Ruby – signer.rb