リクエストへの署名 - Amazon S3 Glacier

「翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。」

リクエストへの署名

S3 Glacier では、リクエストに署名することで、送信するすべてのリクエストを認証する必要があります。リクエストに署名するには、暗号化ハッシュ関数を使用してデジタル署名を計算します。暗号化ハッシュは、入力データから一意のハッシュ値生成して返す関数です。ハッシュ関数に渡される入力データとしては、リクエストのテキスト、およびシークレットアクセスキーが該当します。ハッシュ関数から返されるハッシュ値をリクエストに署名として含めます。署名は、リクエストの Authorization ヘッダーの一部です。

S3 Glacier は、リクエストを受け取ると、リクエストの署名に使用されたものと同じハッシュ関数と入力を使用して署名を再計算します。再計算された署名とリクエスト内の署名が一致した場合、S3 Glacier はリクエストを処理します。それ以外の場合、リクエストは拒否されます。

S3 Glacier は、AWS 署名バージョン 4 を使用した認証をサポートします。署名の計算プロセスは 3 つのタスクに分けることができます。

  • タスク 1: 正規リクエストを作成する

    HTTP リクエストを正規形式に変換します。S3 Glacier では、送信された署名と比較するために署名を再計算するときに正規形式が使用されるので、同じ正規形式を使用する必要があります。

  • タスク 2: 署名文字列を作成する

    暗号化ハッシュ関数への入力値の 1 つとして使用する文字列を作成します。署名文字列と呼ばれる文字列は、ハッシュアルゴリズムの名前、要求日付、認証情報スコープの文字列、および前のタスクで正規化されたリクエストを結合したものです。認証情報スコープの文字列自体は、日付、AWS リージョン、およびサービス情報を結合したものです。

  • タスク 3: 署名を作成する

    2 つの入力文字列 (署名文字列派生キー) を受け付ける暗号化ハッシュ関数を使用して、リクエストの署名を作成します。シークレットアクセスキーから開始し、認証情報スコープの文字列を使用して一連のハッシュベースのメッセージ認証コード (HMAC) を作成することで、派生キーが計算されます。この署名手順で使用するハッシュ関数は、データのアップロードのための S3 Glacier API で使用する木構造ハッシュアルゴリズムではありません。

署名の計算例

次の例で、ボールトの作成 (PUT vault) の署名を作成する詳細な手順を示します。実際の署名計算方法を確認するときに、この例を参考にしてください。その他の参考計算例については、アマゾン ウェブ サービス用語集のSignature Version 4 Test Suite を参照してください。

例では、次のように想定しています。

  • リクエストのタイムスタンプは Fri, 25 May 2012 00:24:53 GMT

  • エンドポイントは、米国東部 (バージニア北部) リージョン us-east-1 です。

リクエストの一般的な構文 (JSON の本体を含む) は次のとおりです。

PUT /-/vaults/examplevault HTTP/1.1 Host: glacier.us-east-1.amazonaws.com Date: Fri, 25 May 2012 00:24:53 GMT Authorization: SignatureToBeCalculated x-amz-glacier-version: 2012-06-01

タスク 1: 正規リクエストを作成する」で計算されるリクエストの正規形式は次のとおりです。

PUT /-/vaults/examplevault host:glacier.us-east-1.amazonaws.com x-amz-date:20120525T002453Z x-amz-glacier-version:2012-06-01 host;x-amz-date;x-amz-glacier-version e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

正規リクエストの最後の行はリクエストボディのハッシュです。また、正規リクエストの 3 行目が空であることに注意してください。これは、この API のクエリ​パラメータがないためです。

タスク 2: 署名する文字列を作成する」で署名する文字列は次のとおりです。

AWS4-HMAC-SHA256 20120525T002453Z 20120525/us-east-1/glacier/aws4_request 5f1da1a2d0feb614dd03d71e87928b8e449ac87614479332aced3a701f916743

署名する文字列の最初の行はアルゴリズム、2 行目はタイムスタンプ、3 行目は認証情報スコープ、最後の行は「タスク 1: 正規リクエストを作成する」で作成した正規リクエストのハッシュです。認証情報スコープで使用するサービス名は glacier です。

タスク 3: 署名を作成する」について、派生キーは次のように表されます。

derived key = HMAC(HMAC(HMAC(HMAC("AWS4" + YourSecretAccessKey,"20120525"),"us-east-1"),"glacier"),"aws4_request")

シークレットアクセスキー wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY を使用する場合、計算された署名は次のようになります。

3ce5b2f2fffac9262b4da9256f8d086b4aaf42eba5f111c21681a65a127b7c2a

最後のステップは、Authorization ヘッダーの構築です。デモンストレーションのアクセスキー AKIAIOSFODNN7EXAMPLE の場合、ヘッダーは次のとおりです (読みやすいように改行しています)。

Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20120525/us-east-1/glacier/aws4_request, SignedHeaders=host;x-amz-date;x-amz-glacier-version, Signature=3ce5b2f2fffac9262b4da9256f8d086b4aaf42eba5f111c21681a65a127b7c2a

ストリーミングオペレーションの署名の計算

アーカイブのアップロード (POST archive)パートのアップロード (PUT uploadID) の 2 つのストリーミングオペレーションでは、リクエストに署名して送信する際に、追加のヘッダーとして x-amz-content-sha256 を含める必要があります。ストリーミングオペレーションの署名手順は、ストリーミング用のヘッダーを追加することを除いて、他のオペレーションとまったく同じです。

ストリーミングヘッダー x-amz-content-sha256 の計算は、アップロードされる全コンテンツ (ペイロード) の SHA256 ハッシュに基づいています。この計算は、SHA256 木構造ハッシュとは異なりますのでご注意ください (チェックサムの計算)。ペイロードデータの SHA 256 ハッシュ値は、基本的にはペイロードデータの SHA256 木構造ハッシュと異なるものになります。

ペイロードデータがバイトの配列として指定されている場合には、以下の Java コードスニペットを使用して SHA256 ハッシュを計算できます。

public static byte[] computePayloadSHA256Hash2(byte[] payload) throws NoSuchAlgorithmException, IOException { BufferedInputStream bis = new BufferedInputStream(new ByteArrayInputStream(payload)); MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); byte[] buffer = new byte[4096]; int bytesRead = -1; while ( (bytesRead = bis.read(buffer, 0, buffer.length)) != -1 ) { messageDigest.update(buffer, 0, bytesRead); } return messageDigest.digest(); }

これと同じく、C# では、以下のコードスニペットに示すように、ペイロードデータの SHA256 ハッシュを計算できます。

public static byte[] CalculateSHA256Hash(byte[] payload) { SHA256 sha256 = System.Security.Cryptography.SHA256.Create(); byte[] hash = sha256.ComputeHash(payload); return hash; }

ストリーミング API の署名の計算例

以下の例は、2 つある S3 Glacier のストリーミング API の 1 つ、アーカイブのアップロード (POST archive) の署名の作成に関する詳細を示したものです。例では、次のように想定しています。

  • リクエストのタイムスタンプは Mon, 07 May 2012 00:00:00 GMT

  • エンドポイントは、米国東部 (バージニア北部) リージョン、us-east-1 1 です。

  • コンテンツのペイロードは、文字列「Welcome to S3 Glacier」です。

(JSON 本文も含めた) 一般的なリクエストの構文を以下の例に示します。 x-amz-content-sha256 ヘッダーが含まれていることに注意してください。この単純な例では、x-amz-sha256-tree-hashx-amz-content-sha256 は同じ値となっています。ただし、このことは、1 MB を超えるアーカイブをアップロードする場合には必ずしも当てはまりません。

POST /-/vaults/examplevault HTTP/1.1 Host: glacier.us-east-1.amazonaws.com Date: Mon, 07 May 2012 00:00:00 GMT x-amz-archive-description: my archive x-amz-sha256-tree-hash: SHA256 tree hash x-amz-content-sha256: SHA256 payload hash Authorization: SignatureToBeCalculated x-amz-glacier-version: 2012-06-01

タスク 1: 正規リクエストを作成する」で計算されるリクエストの正規形式は、以下のとおりです。ストリーミングヘッダー x-amz-content-sha256 が値に含まれていることにご注意ください。これは、ペイロードを読み取って SHA256 ハッシュを計算してから、署名を計算する必要があることを示しています。

POST /-/vaults/examplevault host:glacier.us-east-1.amazonaws.com x-amz-content-sha256:726e392cb4d09924dbad1cc0ba3b00c3643d03d14cb4b823e2f041cff612a628 x-amz-date:20120507T000000Z x-amz-glacier-version:2012-06-01 host;x-amz-content-sha256;x-amz-date;x-amz-glacier-version 726e392cb4d09924dbad1cc0ba3b00c3643d03d14cb4b823e2f041cff612a628

署名の計算手順の残りの部分については、「署名の計算例」で説明しています。Authorization ヘッダーはシークレットアクセスキー wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY を使用しています。アクセスキー AKIAIOSFODNN7EXAMPLE は、以下に示すとおりです (読みやすくなるよう、改行を追加しています)。

Authorization=AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20120507/us-east-1/glacier/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-glacier-version, Signature=b092397439375d59119072764a1e9a144677c43d9906fd98a5742c57a2855de6