AWS 全般のリファレンス
リファレンスガイド (Version 1.0)

署名バージョン 2 の署名プロセス

API リクエストへの署名に、署名バージョン 2 を使用できます。ただし、リクエストには 署名バージョン 4 で署名することをお勧めします。詳細については、「署名バージョン 4 署名プロセス」を参照してください。

サポートされているリージョンおよびサービス

AWS リージョンと AWS のサービスによっては、API リクエストの署名に署名バージョン 2 を使用できます。それ以外の場合、署名バージョン 4 を使用して API リクエストに署名する必要があります。

署名バージョン 2 をサポートするリージョン

  • 米国東部 (バージニア北部) リージョン

  • 米国西部 (北カリフォルニア) リージョン

  • 米国西部 (オレゴン) リージョン

  • 欧州 (アイルランド) リージョン

  • アジアパシフィック (東京) リージョン

  • アジアパシフィック (シンガポール) リージョン

  • アジアパシフィック (シドニー) リージョン

  • 南米 (サンパウロ) リージョン

署名バージョン 2 をサポートするサービス

  • Amazon EC2 Auto Scaling

  • AWS CloudFormation

  • Amazon CloudWatch

  • AWS Elastic Beanstalk

  • Amazon Elastic Compute Cloud (Amazon EC2)

  • Elastic Load Balancing

  • Amazon EMR

  • Amazon ElastiCache

  • AWS Identity and Access Management (IAM)

  • AWS Import/Export

  • Amazon Relational Database Service (Amazon RDS

  • Amazon Simple Notification Service (Amazon SNS)

  • Amazon Simple Queue Service (Amazon SQS)

  • Amazon SimpleDB

署名バージョン 2 の Query リクエストの要素

AWS では、署名バージョン 2 向けのフォーマットを持つ各 HTTP または HTTPS Query リクエストは、以下の要素を含んでいる必要があります。

エンドポイント

HTTP リクエストのホスト部分とも呼ばれます。Query リクエストの送信先となるコンピュータの DNS 名です。これは AWS リージョンごとに異なります。各サービスのエンドポイントのリストについては、「AWS サービスエンドポイント」を参照してください。

アクション

ウェブサービスに実行させるアクション。この値により、リクエスト内で使用されるパラメータが決まります。

AWSAccessKeyId

AWS アカウントにサインアップしたときに AWS から渡される値。

SignatureMethod

署名を計算するために使用されているハッシュベースのプロトコル。署名バージョン 2 では、HMAC-SHA1 または HMAC-SHA256 を使用できます。

SignatureVersion

AWS 署名プロトコルのバージョン。

タイムスタンプ

リクエストを行う時刻。第三者がリクエストを傍受することを防止するため、これを Query リクエストに含めます。

必須およびオプションのパラメータ

各アクションには、API 呼び出しを定義する必須およびオプションのパラメータのセットがあります。

署名

署名が有効で改ざんされていないことを確認するための計算値。

以下に、HTTPS GET リクエストの形式になっている Amazon EMR Query リクエストの例を示します。

  • エンドポイント elasticmapreduce.amazonaws.com はデフォルトエンドポイントであり、リージョン us-east-1 に対応します。

  • アクションは DescribeJobFlows であり、1 つ以上のジョブフローに関する情報をリクエストします。

注記

実際の Query リクエストでは、空白や改行文字はありません。リクエストは、ひと続きのテキスト行です。以下に示すものは、人間が読みやすい形式にしてあります。

https://elasticmapreduce.amazonaws.com? &AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE &Action=DescribeJobFlows &SignatureMethod=HmacSHA256 &SignatureVersion=2 &Timestamp=2011-10-03T15%3A19%3A30 &Version=2009-03-31 &Signature=calculated value

Query リクエスト用の署名バージョン 2 を生成する方法

ウェブサービスリクエストはインターネット経由で送信されるため、改ざんされる危険があります。リクエストが改変されていないかチェックするために、AWS は署名を計算して、いずれかのパラメータまたはパラメータ値が途中で変更されていないかを判断します。AWS では、すべてのリクエストで署名が必要とされます。

注記

リクエストは、必ず URI エンコードする必要があります。例えば、 リクエスト内の空白は、%20 にエンコードします。エンコードされた空白は、通常、HTTP プロトコルの仕様で許可されていますが、エンコードされていない文字を使用すると Query リクエスト内に作成される署名が無効なものとなります。エラーの原因となるので、空白をプラス記号 (+) としてエンコードしないでください。

以下のトピックでは、AWS 署名バージョン 2 を使用して署名を計算するために必要なステップを説明します。

タスク 1: Query リクエストのフォーマット

クエリリクエストに署名する前に、標準化 (正規) 形式でリクエストをフォーマットします。これが必要なのは、Query リクエストをフォーマットする方法が異なると、異なる HMAC 署名が生成されるためです。署名する前に正規形式でリクエストをフォーマットします。これにより、アプリケーションと AWS はリクエスト用に同じ署名を計算します。

署名する文字列を作成するには、Query リクエストのコンポーネントを連結します。次の例では、Amazon EMR API への次のような呼び出しに署名するための文字列を生成します。

https://elasticmapreduce.amazonaws.com? Action=DescribeJobFlows &Version=2009-03-31 &AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE &SignatureVersion=2 &SignatureMethod=HmacSHA256 &Timestamp=2011-10-03T15:19:30

注記

前述のリクエストでは、最後の 4 個のパラメータ (AWSAccessKeyID から Timestamp まで) を認証パラメータと呼びます。これらは、すべての署名バージョン 2 のリクエストで必須です。AWS はこれらのパラメータを使用して、リクエストの送信者と、リクエストされたアクセス権限を付与するかどうかを判断します。

署名 (署名バージョン 2) する文字列を作成するには

  1. 最初にリクエスト方法 (GET または POST) を指定し、その後に改行文字を置きます人間が読みやすい形式とするため、改行文字を \n で表します。

    GET\n
  2. HTTP ホストヘッダー (エンドポイント) を小文字で追加し、その後に改行文字を置きます。ポート情報は、プロトコルの標準ポート (HTTP ではポート 80、HTTPS ではポート 443) であれば省略しますが、標準以外のポートの場合は含めます。

    elasticmapreduce.amazonaws.com\n
  3. URI の各パスセグメントの URL エンコードされたバージョン (HTTP ホストヘッダーとクエリ文字列パラメータを開始する疑問符 (?) の間のすべて) を追加し、その後に改行文字を置きます。各パスセグメントを区切るフォワードスラッシュ (/) はエンコードしないでください。

    この例では、絶対パスが空値の場合は、フォワードスラッシュ (/) を使用します。

    /\n
    1. クエリ文字列コンポーネントを、URL エンコードされた UTF-8 文字 (16 進数文字は大文字である必要があります) として追加します。リクエスト内では最初の疑問符文字 (?) はエンコードしません。詳細については、RFC 3986を参照してください。

    2. クエリ文字列コンポーネントをバイト順で並べ替えます。バイト順では大文字と小文字が区別されます。AWS は、ローバイトに基づいてこれらのコンポーネントを並べ替えます。

      たとえば、次に示すのはクエリ文字列コンポーネントの元の順序です。

      Action=DescribeJobFlows Version=2009-03-31 AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE SignatureVersion=2 SignatureMethod=HmacSHA256 Timestamp=2011-10-03T15%3A19%3A30

      クエリ文字列コンポーネントは次のように再編成されます。

      AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE Action=DescribeJobFlows SignatureMethod=HmacSHA256 SignatureVersion=2 Timestamp=2011-10-03T15%3A19%3A30 Version=2009-03-31
    3. パラメーターの値が空値の場合でも、等号 (=) を使用して、パラメーター名とその値を分離します。アンパサンド文字 (&) で、パラメーターと値のペアを区切ります。パラメータとその値を連結して、空白のない 1 つの長い文字列にします。パラメータ値の中に空白を含めることはできますが、%20 に URL エンコードする必要があります。連結される文字列の中で、ピリオド (.) はエスケープしません。ピリオドは、RFC 3986 では非予約文字として扱われるため、URL エンコードされません。

      注記

      RFC 3986 では、ASCII 制御文字、拡張 UTF-8 文字、および RFC 1738 によって予約されているその他の文字によって何が行われるか指定されていません。文字列値にはどのような値でも渡される可能性があるので、これらのその他の文字は %XY のようにパーセントエンコードする必要があります。ここで X と Y は大文字の 16 進数文字を表します。拡張 UTF-8 文字は、%XY%ZA... という形式 (これは複数バイトを扱います) になります。

    次の例では、アンパーサンド文字 (&) で統合され、バイト順に並べ替えられたパラメータを持つクエリ文字列コンポーネントを示します。

    AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Action=DescribeJobFlows&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-10-03T15%3A19%3A30&Version=2009-03-3
  4. 最終的な正規リクエストを作成するには、各手順のすべてのコンポーネントを結合します。例のように、各コンポーネントは改行文字で終わります。

    GET\n elasticmapreduce.amazonaws.com\n /\n AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Action=DescribeJobFlows&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-10-03T15%3A19%3A30&Version=2009-03-31

タスク 2: 署名を計算する

標準化された文字列を タスク 1: Query リクエストのフォーマット で説明されているとおりに作成したら、HMAC-SHA1 または HMAC-SHA256 プロトコルを使用してハッシュベースのメッセージ認証コード (HMAC) を作成することにより、署名を計算します。HMAC-SHA256 の方を使用することを推奨します。

この例の署名は、次の正規文字列とシークレットキーをキー付きハッシュ関数への入力として使用して計算されました。

  • 正規クエリ文字列

    GET\n elasticmapreduce.amazonaws.com\n /\n AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Action=DescribeJobFlows&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-10-03T15%3A19%3A30&Version=2009-03-31
  • シークレットキー例

    wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

作成される署名は base-64 エンコードである必要があります。

i91nKc4PWAt0JJIdXwz9HxZCJDdiy6cf%2FMj6vPxyYIs%3D

結果の値を、Signature パラメータとして Query リクエストに追加します。リクエストにこのパラメータを追加する場合、他のパラメータと同じように URI エンコードする必要があります。署名されたこのリクエストを HTTP または HTTPS 呼び出しで使用できます。

https://elasticmapreduce.amazonaws.com?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Action=DescribeJobFlows&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-10-03T15%3A19%3A30&Version=2009-03-31&Signature=i91nKc4PWAt0JJIdXwz9HxZCJDdiy6cf%2FMj6vPxyYIs%3D

注記

AWS Security Token Service (AWS STS) によって提供された一時的なセキュリティ認証情報を使用してリクエストに署名できます。プロセスは、長期の認証情報を使用する場合と同じですが、リクエストには、セキュリティトークン用の追加のパラメーターが必要です。

次のリクエストは、一時アクセスキー ID および SecurityToken パラメーターを使用します。

例 一時的なセキュリティ認証情報を使用したリクエストの例

https://sdb.amazonaws.com/ ?Action=GetAttributes &AWSAccessKeyId=access-key-from-AWS Security Token Service &DomainName=MyDomain &ItemName=MyItem &SignatureVersion=2 &SignatureMethod=HmacSHA256 &Timestamp=2010-01-25T15%3A03%3A07-07%3A00 &Version=2009-04-15 &Signature=signature-calculated-using-the-temporary-access-key &SecurityToken=session-token

詳細については、以下のリソースを参照してください。

  • Amazon EMR 開発者ガイド には、Amazon EMR API 呼び出しに関する情報があります。

  • 各サービスの API のドキュメントには、アクションの要件と固有のパラメータに関する情報が記載されています。

  • AWS SDK には、Query リクエスト署名を生成するための関数が用意されています。AWS SDK for Java を使用する例については、「Java SDK を使用した Query リクエストへの署名」を参照してください。

リクエスト署名バージョン 2 のトラブルシューティング

このセクションでは、Query リクエストへの署名を生成するコードを初めて作成するときに発生することのある、エラーコードについて説明します。

ウェブサービスでの SignatureDoesNotMatch 署名エラー

ウェブサービスで署名値を再計算することによってリクエストの署名を検証しようとしたときに、生成された値がリクエストに付加されている署名と一致しないと、次のエラー応答が返されます。これは、リクエストの送信時とウェブサービスエンドポイントへの到着時との間で、リクエストが変更された (これを検出するために署名は設計されています) か、署名の計算が誤っているために発生している可能性があります。次のエラーメッセージの一般的な原因としては、Amazon S3 バケット名でコロン (:) やフォワードスラッシュ (/) といった URL のエンコード文字を忘れているなど、署名する文字列を適切に作成していないことがあります。

<ErrorResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31"> <Error> <Type>Sender</Type> <Code>SignatureDoesNotMatch</Code> <Message>The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.</Message> </Error> <RequestId>7589637b-e4b0-11e0-95d9-639f87241c66</RequestId> </ErrorResponse>

ウェブサービスでの IncompleteSignature 署名エラー

以下のエラーは、署名に情報が欠落しているか、または形式が不適切であることを示します。

<ErrorResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31"> <Error> <Type>Sender</Type> <Code>IncompleteSignature</Code> <Message>Request must contain a signature that conforms to AWS standards</Message> </Error> <RequestId>7146d0dd-e48e-11e0-a276-bd10ea0cbb74</RequestId> </ErrorResponse>

Java SDK を使用した Query リクエストへの署名

次の例では、AWS SDK for Java の amazon.webservices.common パッケージを使用して、AWS 署名バージョン 2 の Query リクエスト署名を作成します。そのために、RFC 2104 準拠の HMAC 署名を作成しています。HMAC の詳細情報については、HMAC: Keyed-Hashing for Message Authentication を参照してください。

注記

実装例として Java が使用されています。HMAC アルゴリズムを実装して Query リクエストに署名するために、任意のプログラミング言語を使用できます。

import java.security.SignatureException; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import com.amazonaws.util.*; /** * This class defines common routines for generating * authentication signatures for AWS Platform requests. */ public class Signature { private static final String HMAC_SHA256_ALGORITHM = "HmacSHA256"; /** * Computes RFC 2104-compliant HMAC signature. * * @param data * The signed data. * @param key * The signing key. * @return * The Base64-encoded RFC 2104-compliant HMAC signature. * @throws * java.security.SignatureException when signature generation fails */ public static String calculateRFC2104HMAC(String data, String key) throws java.security.SignatureException { String result; try { // Get an hmac_sha256 key from the raw key bytes. SecretKeySpec signingKey = new SecretKeySpec(key.getBytes("UTF-8"), HMAC_SHA256_ALGORITHM); // Get an hmac_sha256 Mac instance and initialize with the signing key. Mac mac = Mac.getInstance(HMAC_SHA256_ALGORITHM); mac.init(signingKey); // Compute the hmac on input data bytes. byte[] rawHmac = mac.doFinal(data.getBytes("UTF-8")); // Base64-encode the hmac by using the utility in the SDK result = BinaryUtils.toBase64(rawHmac); } catch (Exception e) { throw new SignatureException("Failed to generate HMAC : " + e.getMessage()); } return result; } }