

# API リクエストに対する AWS Signature Version 4
<a name="reference_sigv"></a>

**重要**  
AWS SDK (「[サンプルコードとライブラリ](https://aws.amazon.com/developer/)」を参照) または AWS Command Line Interface (AWS CLI) ツールを使用して API リクエストを AWS に送信する場合、SDK および CLI クライアントが指定したアクセスキーを使用してリクエストを認証するため、署名プロセスをスキップできます。正当な理由がない限り、常に SDK または CLI を使用することをお勧めします。  
複数の署名バージョンをサポートするリージョンでは、リクエストに手動で署名する場合、使用する署名バージョンを指定する必要があります。マルチリージョンアクセスポイントにリクエストを送信すると、SDK と CLI は Signature Version 4A の使用に自動的に切り替えます。追加の設定は不要です。

リクエストで送信する認証情報には、署名が含まれている必要があります。AWSSignature Version 4 (SigV4) は、AWS API リクエストに認証情報を追加するための AWS 署名プロトコルです。

API リクエストの署名には、シークレットアクセスキーを使用しません。そうではなく、SigV4 署名プロセスを使用します。リクエストを署名するには、以下の手順を実行します。

1. リクエストの詳しい情報に基づいて正規リクエストを作成します。

1. 自分の AWS 認証情報を使用して署名を計算します。

1. 求めた署名を認可ヘッダーとしてリクエストに追加します。

AWS は、このプロセスをレプリケートして署名を検証し、検証結果に応じてアクセスを許可または拒否します。

Symmetric SigV4 では、特定の日に 1 つの AWS リージョンの 1 つの AWS サービスに限定されたキーを取得する必要があります。これにより、キーと計算された署名はリージョンごとに異なるため、どのリージョンにリクエストを送るのかを事前に把握しておく必要があります。

非対称署名バージョン 4 (SigV4a ) は、新しいアルゴリズムによる署名と、複数の AWS リージョンで検証可能な個々の署名の生成をサポートする拡張機能です。SigV4a を使用すると、複数のリージョンのリクエストに署名し、リージョン間でシームレスなルーティングとフェイルオーバーを行うことができます。AWS SDK または AWS CLI を使用して、マルチリージョン署名を必要とする機能を呼び出すと、署名タイプが自動的に SigV4a を使用するように変更されます。詳細については、「[AWS SigV4a の仕組み](#how-sigv4a-works)」を参照してください。

## AWS SigV4 の仕組み
<a name="how-aws-signing-works"></a>

次の手順では、SigV4 を使用して署名を計算する一般的なプロセスについて説明します。

1. **署名する文字列**はリクエストのタイプによって異なります。例えば、認証に HTTP Authorization ヘッダーまたはクエリパラメータを使用する場合、リクエスト要素を組み合わせて、署名文字列を作成します。HTTP POST リクエストでは、リクエスト内の `POST` ポリシーは、署名する文字列です。

1. **署名キー**は、一続きの計算で求められ、各ステップの結果が次の計算に送られます。最後の手順は署名キーです。

1. AWS サービスが認証されたリクエストを受け取ると、リクエストに含まれる認証情報を使用して**署名**が再作成されます。署名が一致すると、サービスはリクエストを処理します。それ以外の場合、リクエストを拒否します。

詳細については、「[AWS API リクエスト署名の要素](reference_sigv-signing-elements.md)」を参照してください。

## AWS SigV4a の仕組み
<a name="how-sigv4a-works"></a>

SigV4a は、公開鍵暗号方式に基づく非対称署名を使用します。SigV4a は、SigV4 と同様のスコープ認証情報導出プロセスを実行します。ただし、SigV4a は同じキーを使用してすべてのリクエストに署名します。日付、サービス、リージョンに基づいて個別の署名キーを取得する必要はありません。[楕円曲線デジタル署名アルゴリズム](https://csrc.nist.gov/glossary/term/ecdsa) (ECDSA) キーペアは、既存の AWS シークレットアクセスキーから取得できます。

システムは非対称暗号化を使用してマルチリージョン署名を検証するため、AWS はパブリックキーのみを保存する必要があります。パブリックキーはシークレットではなく、リクエストの署名には使用できません。非対称署名は、Amazon S3 マルチリージョン アクセス ポイントなどのマルチリージョン API リクエストに必要です。

次の手順では、SigV4a を使用して署名を計算する一般的なプロセスについて説明します。

1. **署名する文字列**はリクエストのタイプによって異なります。例えば、認証に HTTP Authorization ヘッダーまたはクエリパラメータを使用する場合、リクエスト要素を組み合わせて、署名文字列を作成します。HTTP POST リクエストでは、リクエスト内の `POST` ポリシーは、署名する文字列です。

1. **署名キー**は、AWS のシークレットアクセスキーから一連の計算によって求められ、各ステップの結果が次の計算に送られます。最後のステップでは、キーペアを生成します。

1. AWS サービスが SigV4a で署名されたリクエストを受信すると、 AWS はキーペアのパブリック半分のみを使用して署名を検証します。署名が有効な場合、リクエストは認証され、サービスはリクエストを処理します。無効な署名を持つリクエストは拒否されます。

マルチリージョン API リクエストの SigV4a の詳細については、GitHub の「[sigv4a-signing-examples](https://github.com/aws-samples/sigv4a-signing-examples)」プロジェクトを参照してください。

## リクエストに署名するタイミング
<a name="when-do-you-need-to-sign"></a>

AWS に API リクエストを送信するためのカスタムコードを記述するときは、リクエストに署名するためのコードを含める必要があります。カスタムコードを書く理由には、以下のような場合が考えられます。
+ AWS SDK がないプログラミング言語を使用しているためです。
+ AWS にリクエストを送る方法を完全に管理する必要がある場合。

API リクエストは AWS SigV4 でアクセスを認証しますが、AWS SDK と AWS CLI はユーザーが指定したアクセスキーを使用してリクエストを認証します。AWS SDK と AWS CLI による認証の詳細については、「[その他のリソース](#reference_aws-signing-resources)」を参照してください。

## リクエストに署名する理由
<a name="why-requests-are-signed"></a>

署名プロセスは、次のような点でリクエストのセキュリティ確保に役立ちます。
+ **リクエスタの ID の確認**

  認証されたリクエストには、アクセスキー (アクセスキー ID、シークレットアクセスキー) を使用して作成した署名が必要です。一時的なセキュリティ認証情報を使用している場合、署名の計算にはセキュリティトークンも必要です。詳細については、「[AWS security credentials programmatic access](security-creds-programmatic-access.md)」(セキュリティ認証情報のプログラムによるアクセス) を参照してください。
+ **送信中のデータの保護**

  送信中のリクエストの改ざんを防ぐために、一部のリクエスト要素からリクエストのハッシュ (ダイジェスト) を計算し、得られたハッシュ値をリクエストの一部として含めます。AWS のサービス がリクエストを受け取ると、同じ情報を使用してハッシュを計算し、リクエストに含まれているハッシュ値と比較します。ハッシュ値が一致しない場合、AWS はそのリクエストを拒否します。
+ **潜在的なリプレイ攻撃の防止**

  多くの場合、リクエストは、リクエストのタイムスタンプの 5 分以内に AWS に到達する必要があります。その条件を満たさない場合、AWS はリクエストを拒否します。

AWS SigV4 は、HTTP 認可ヘッダーに表現することも、URL にクエリ文字列として表現することもできます。詳細については、「[認証方法](reference_sigv-authentication-methods.md)」を参照してください。

## その他のリソース
<a name="reference_aws-signing-resources"></a>
+ さまざまなサービスの SigV4 署名プロセスの詳細については、「[リクエスト署名の例](reference_sigv-examples.md)」を参照してください。
+ AWS CLI でプログラマティックにアクセスできるように認証情報を設定するには、「AWS コマンドラインインターフェイスユーザーガイド」の「[認証とアクセス認証情報](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-authentication.html)」を参照してください。
+ AWS SDK には、AWS API リクエストに署名する方法を示す GitHub のソースコードが含まれています。コードの例については、「[AWS サンプルリポジトリ内のプロジェクト例](reference_sigv-examples.md#signature-v4-examples-sdk)」を参照してください。
  + AWS SDK for .NET – [AWS4Signer.cs](https://github.com/aws/aws-sdk-net/blob/master/sdk/src/Core/Amazon.Runtime/Internal/Auth/AWS4Signer.cs)
  + AWS SDK for C\$1\$1 – [AWSAuthV4Signer.cpp](https://github.com/aws/aws-sdk-cpp/blob/main/src/aws-cpp-sdk-core/source/auth/signer/AWSAuthV4Signer.cpp)
  + AWS SDK for Go – [sigv4.go](https://github.com/aws/smithy-go/blob/a4c9efcda6aa54c75d1a130d1320a2709eebf51d/aws-http-auth/sigv4/sigv4.go)
  + AWS SDK for Java – [BaseAws4Signer.java](https://github.com/aws/aws-sdk-java-v2/blob/master/core/auth/src/main/java/software/amazon/awssdk/auth/signer/internal/BaseAws4Signer.java)
  + AWS SDK for JavaScript – [signature-v4](https://github.com/smithy-lang/smithy-typescript/tree/main/packages/signature-v4)
  + AWS SDK for PHP – [SignatureV4.php](https://github.com/aws/aws-sdk-php/blob/master/src/Signature/SignatureV4.php)
  + AWS SDK for Python (Boto) – [signers.py](https://github.com/boto/botocore/blob/develop/botocore/signers.py)
  + AWS SDK for Ruby – [signer.rb](https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sigv4/lib/aws-sigv4/signer.rb)