View a markdown version of this page

リクエストの認証: クエリパラメータの使用 (AWS 署名バージョン 4) - Amazon Simple Storage Service

リクエストの認証: クエリパラメータの使用 (AWS 署名バージョン 4)

認証の概要 (認証方法 を参照) で説明されているように、クエリ文字列パラメータを使用して認証情報を指定できます。リクエストを完全に URL で表現したい場合、クエリパラメータを使用してリクエストを認証するのが便利です。このメソッドは、URL の事前署名とも呼ばれます。

署名付き URL のユースケースシナリオでは、Amazon S3 リソースへの一時的なアクセスを許可できます。例えば、署名付き URL をウェブサイトに埋め込んだり、コマンドラインクライアント (Curl など) で使用してオブジェクトをダウンロードしたりすることができます。

注記

AWS CLI を使用して署名付き URL を作成することもできます。詳細については、AWS CLI コマンドリファレンスの「presign」を参照してください。

署名付き URL の例を次に示します。

https://examplebucket.s3.amazonaws.com/test.txt ?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=<your-access-key-id>/20130721/us-east-1/s3/aws4_request &X-Amz-Date=20130721T201207Z &X-Amz-Expires=86400 &X-Amz-SignedHeaders=host &X-Amz-Signature=<signature-value>

例の URL では、以下の点に注意してください。

  • 読みやすくするために、ラインフィードが追加されています。

  • URL 内の X-Amz-Credential 値には、読みやすさのためにのみ挿入された「/」文字が表示されています。実際には、%2F としてエンコードする必要があります。例えば、次のようになります。

    &X-Amz-Credential=<your-access-key-id>%2F20130721%2Fus-east-1%2Fs3%2Faws4_request

次の表では、認証情報を提供する URL 内のクエリパラメータについて説明します。

クエリ文字列パラメータ名 値の例
X-Amz-Algorithm

AWS 署名のバージョンと署名の計算に使用したアルゴリズムを識別します。

AWS 署名バージョン 4 では、このパラメータ値を AWS4-HMAC-SHA256 に設定します。この文字列は、AWS 署名バージョン 4 (AWS4) および HMAC-SHA256 アルゴリズム (HMAC-SHA256) を識別します。

X-Amz-Credential

このパラメータは、アクセスキー ID の他に、署名が有効なスコープ (AWS リージョンおよびサービス) も指定します。この値は、次のセクションで説明する署名計算で使用するスコープと一致する必要があります。このパラメータ値の一般的な形式は次のとおりです。

<your-access-key-id>/<date>/<AWS リージョン>/<AWS-service>/aws4_request

例えば、次のようになります。

AKIAIOSFODNN7EXAMPLE/20130721/us-east-1/s3/aws4_request

Amazon S3 の場合、AWS-service 文字列は s3 です。S3 AWS-region 文字列のリストについては、「AWS 全般のリファレンス」の「リージョンとエンドポイント」を参照してください。

X-Amz-Date

日付と時刻の形式は ISO 8601 規格に準拠している必要があるため、「yyyyMMddTHHmmssZ」形式でフォーマットする必要があります。例えば、日付と時刻が「08/01/2016 15:32:41.982-700」の場合、まず UTC (協定世界時) に変換してから「20160801T223241Z」として送信する必要があります。

X-Amz-Expires

生成された署名付き URL が有効な期間を秒単位で指定します。例えば、86400 (24 時間) と指定します。この値は整数です。設定可能な最小値は 1、最大値は 604800 (7 日間) です。

署名計算に使用する署名キーは最大 7 日間有効であるため、署名付き URL は最大 7 日間有効です。

X-Amz-SignedHeaders

署名の計算に使用したヘッダーを一覧表示します。署名計算には次のヘッダーが必要です。

  • HTTP host ヘッダー。

  • リクエストに追加する予定のすべての x-amz-* ヘッダー。

注記

セキュリティの強化のために、リクエストに含める予定のすべてのリクエストヘッダーに署名する必要があります。

X-Amz-Signature

リクエストを認証するための署名を指定します。この署名は、Amazon S3 が計算する署名と一致する必要があります。一致しない場合、Amazon S3 はリクエストを拒否します。例: 733255ef022bec3f2a8701cd61d4b371f3f28c9f193a1f02279211d48d5193d7

署名計算については、次のセクションで説明します。

X-Amz-Security-Token

STS サービスから取得した認証情報を使用する場合のオプションの認証情報パラメータ。

署名の計算

次の図は、署名計算プロセスを示しています。

正規リクエスト、署名する文字列、署名生成ステップを含む AWS 署名バージョン 4 の署名プロセス。

次の表では、図に示されている関数について説明します。これらの関数のコードを実装する必要があります。

関数 説明
Lowercase() 文字列を小文字に変換します。
Hex() 16 進数の小文字エンコード。
SHA256Hash() セキュアハッシュアルゴリズム (SHA) 暗号化ハッシュ関数。
HMAC-SHA256() 指定した署名キーで SHA256 アルゴリズムを使用して HMAC を計算します。これが最後の署名です。
Trim() 先頭または末尾の空白をすべて削除します。
UriEncode()

すべてのバイトが URI でエンコードされます。UriEncode() は、以下のルールを適用する必要があります。

  • 非予約文字 (「A」-「Z」、「a」-「z」、「0」-「9」、「-」、「.」、「_」および「~」) を除くすべてのバイトが URI でエンコードされます。

  • スペース文字は予約文字であるため、「+」ではなく「%20」としてエンコードする必要があります。

  • URI で エンコードされた各バイトは、「%」とそのバイトの 2 桁の 16 進値で構成されています。

  • 16 進値の文字は大文字である必要があります (例:「%1A」)。

  • オブジェクトキー名以外では、フォワードスラッシュ文字「/」がエンコードされます。例えば、オブジェクトキー名が photos/Jan/sample.jpg の場合、キー名のフォワードスラッシュはエンコードされません。

重要

開発プラットフォームが提供する標準の UriEncode 関数は、実装の違いや基礎となる RFC のあいまいさにより動作しない場合があります。エンコードが確実に機能するように、独自のカスタム UriEncode 関数を作成することをお勧めします。

Java の UriEncode() 関数の例を次に示します。

public static String UriEncode(CharSequence input, boolean encodeSlash) { StringBuilder result = new StringBuilder(); for (int i = 0; i < input.length(); i++) { char ch = input.charAt(i); if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch == '_' || ch == '-' || ch == '~' || ch == '.') { result.append(ch); } else if (ch == '/') { result.append(encodeSlash ? "%2F" : ch); } else { result.append(toHexUTF8(ch)); } } return result.toString(); }

署名プロセスの詳細 (正規リクエストの作成、署名する文字列、署名計算の詳細) については、「Authorization ヘッダーの署名計算: 単一チャンクでのペイロードの転送 (AWS 署名バージョン 4)」を参照してください。このプロセスは一般的には同じですが、署名付き URL での CanonicalRequest の作成方法は、次のように異なります。

  • 署名付き URL を作成する際、URL が任意のペイロードのアップロードに使用されるため、ペイロードの内容を事前に特定できません。そのため、正規リクエストにはペイロードハッシュを含めません。代わりに、定数文字列 UNSIGNED-PAYLOAD を使用します。

  • 正規クエリ文字列には、X-Amz-Signature を除く前述のテーブルのすべてのクエリパラメータを含める必要があります。

  • S3 では、STS サービスから取得された認証情報を使用する場合は、URL に X-Amz-Security-Token クエリパラメータを含める必要があります。

  • 正規ヘッダーには HTTP host ヘッダーを含める必要があります。いずれかの x-amz-* ヘッダーを含める場合は、署名計算のためにこれらのヘッダーも追加する必要があります。必要に応じて、リクエストに含める予定の他のすべてのヘッダーを追加できます。セキュリティを強化するには、できるだけ多くのヘッダーに署名する必要があります。署名付きヘッダーを追加し、それが署名付きクエリパラメータでも指定されている場合、それぞれの値が異なる場合、入力が競合しているため InvalidRequest エラーが発生します。

examplebucket バケットにオブジェクト test.txt があるとします。署名付き URL を作成して、このオブジェクトを 24 時間 (86,400 秒間) 他のユーザーと共有したいと考えています。

https://examplebucket.s3.amazonaws.com/test.txt ?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request &X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host &X-Amz-Signature=<signature-value>

次のステップでは、まず署名の計算を行い、次に署名付き URL の構築について説明します。この例では、さらに次を前提としています。

  • リクエストのタイムスタンプは Fri, 24 May 2013 00:00:00 GMT です。

  • バケットは米国東部 (バージニア北部) リージョンにあり、認証情報 ScopeSigning Key の計算ではリージョン指定子として us-east-1 が使用されます。リージョンの詳細については、https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_regionの「AWS 全般のリファレンスリージョンとエンドポイント」を参照してください。

この例をテストケースとして使用して、お客様のコードで計算された署名を検証できます。ただし、同じバケット名、オブジェクトキー、タイムスタンプ、および次の認証情報の例を使用する必要があります。

パラメータ
AWSAccessKeyId AKIAIOSFODNN7EXAMPLE
AWSSecretAccessKey wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
  1. StringToSign
    1. CanonicalRequest

      GET /test.txt X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host host:examplebucket.s3.amazonaws.com host UNSIGNED-PAYLOAD

    2. StringToSign

      AWS4-HMAC-SHA256 20130524T000000Z 20130524/us-east-1/s3/aws4_request 3bfa292879f6447bbcda7001decf97f4a54dc650c8942174ae0a9121cf58ad04

  2. SigningKey

    signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<YourSecretAccessKey>","20130524"),"us-east-1"),"s3"),"aws4_request")

  3. Signature

    aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404

    これで、署名付き URL を作成するためのすべての情報が揃いました。この例の結果得られる URL は次のとおりです (これを使用して署名付き URL と比較できます)。

    https://examplebucket.s3.amazonaws.com/test.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404

例 2

以下は、X-Amz-Security-Token パラメータを含む署名付き URL を示す例です (前の例とは無関係です)。

https://examplebucket.s3.us-east-1.amazonaws.com/test.txt ?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request &X-Amz-Date=20200524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host &X-Amz-Security-Token=IQoJb3JpZ2luX2VjEMv%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJGMEQCIBSUbVdj9YGs2g0HkHsOHFdkwOozjARSKHL987NhhOC8AiBPepRU1obMvIbGU0T%2BWphFPgK%2Fqpxaf5Snvm5M57XFkCqlAgjz%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAAaDDQ3MjM4NTU0NDY2MCIM83pULBe5%2F%2BNm1GZBKvkBVslSaJVgwSef7SsoZCJlfJ56weYl3QCwEGr2F4BmCZZyFpmWEYzWnhNK1AnHMj5nkfKlKBx30XAT5PZGVrmq4Vkn9ewlXQy1Iu3QJRi9Tdod8Ef9%2FyajTaUGh76%2BF5u5a4O115jwultOQiKomVwO318CO4l8lv%2F3HhMOkpdanMXn%2B4PY8lvM8RgnzSu90jOUpGXEOAo%2F6G8OqlMim3%2BZmaQmasn4VYRvESEd7O72QGZ3%2BvDnDVnss0lSYjlv8PP7IujnvhZRnj0WoeOyMe1lL0wTG%2Fa9usH5hE52w%2FYUJccOn0OaZuyROuVsRV4Q70sbWQhUvYUt%2B0tUMKzm8vsFOp4BaNZFqobbjtb36Y92v%2Bx5kY6i0s8QE886jJtUWMP5ldMziClGx3p0mN5dzsYlM3GyiJ%2FO1mWkPQDwg3mtSpOA9oeeuAMPTA7qMqy9RNuTKBDSx9EW27wvPzBum3SJhEfxv48euadKgrIX3Z79ruQFSQOc9LUrDjR%2B4SoWAJqK%2BGX8Q3vPSjsLxhqhEMWd6U4TXcM7ku3gxMbzqfT8NDg%3D &X-Amz-Signature=<signature-value>