すべてのプロダクト
Search
ドキュメントセンター

:リクエストの署名

最終更新日:Dec 18, 2024

セキュリティを確保するには、すべての API リクエストに署名する必要があります。 Alibaba Cloud はリクエストの署名を使用して、API の呼び出し元を確認します。 HTTPSを使用してAPIリクエストを送信する場合は、リクエストに署名を含める必要があります。

署名の概要

署名をキー管理サービスAPIリクエストに次の形式で追加する必要があります。

https://Endpoint/?SignatureVersion=1.0&SignatureMethod=HMAC-SHA1&Signature=CT9X0VtwR86fNWSnsc6v8YGOjuE%3D

署名には、次のパラメータが含まれます。

  • SignatureMethod:署名の文字列を暗号化する方法です。 値を HMAC-SHA1 に設定します。

  • SignatureVersion:署名を暗号化するアルゴリズムのバージョンです。 値を 1.0 に設定します。

  • Signature: リクエスト後に生成された署名文字列は、AccessKeyシークレットを使用して対称的に暗号化されます。

暗号化には、RFC 2104で指定されているHMAC-SHA1アルゴリズムが使用されます。 AccessKey Secret は、エンコードおよびソートされたクエリ文字列のハッシュベースのメッセージ認証コード (HMAC) 値の計算に使われ、HMAC 値は署名文字列として用いられます。 リクエストの署名には、操作固有のパラメーターが含まれます。 したがって、リクエストの署名は、リクエストのパラメーターに応じて変化します。 署名を計算するには、このトピックの手順を実行します。

Signature = Base64( HMAC-SHA1( AccessKey Secret, UTF-8-Encoding-Of(StringToSign)) )

ステップ 1:string-to-sign を作成してエンコード

  1. リクエストパラメーターを配置して、標準化されたクエリの文字列を作成します。

    1. リクエストパラメーター (Signature を除くすべての共通パラメーターおよび操作固有のパラメーターを含む) をアルファベット順に配置します。

      説明

      GET メソッドでリクエストを送信する場合、これらのパラメーターによりリクエスト URL のパラメーターフィールドが構成されます。 これらのパラメーターは、リクエスト URI の疑問符 (?) の後に置かれ、アンパサンド (&) で接続されます。

    2. UTF-8 の文字セットを使用して、リクエスト URL に配置されたリクエストパラメーターの名前と値をエンコードします。 下表に、エンコードのルールを示します。

      キャラクター

      エンコードルール

      大文字、小文字、数字、ハイフン (-)、アンダースコア (_)、ピリオド (.)、およびチルダ (~)

      これらの文字はエンコードの必要はありません。

      他の文字

      これらの文字は、% XY形式でパーセントエンコードする必要があります。 XYは文字のASCIIコードを16進表記で表します。 たとえば、二重引用符 (") は % 22としてエンコードされます。

      拡張 UTF-8 文字

      これらの文字は、% XY % ZA… 形式でエンコードする必要があります。

      スペース

      スペースは % 20としてエンコードする必要があります。 スペースは、プラス記号 (+) としてエンコードしないでください。

      このエンコード方法は、Java標準ライブラリによって提供されるjava.net.URLEncoderクラスなどの多目的インターネットメール拡張 (MIME) エンコードアルゴリズムapplication/x-www-form-urlencodedとは異なります。 ただし、MIMEエンコードアルゴリズムを適用して、エンコードされた文字列のプラス記号 (+) を % 20に、アスタリスク (*) を % 2Aに、% 7Eをチルダ (~) に置き換えることができます。 次のpercentEncodeメソッドを使用して、アルゴリズムを実装できます。

      private static final String ENCODING = "UTF-8";
      private static String percentEncode(String value) throws UnsupportedEncodingException 
      {
      return value != null ? URLEncoder.encode(value, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~") : null;
      }
    3. エンコードされたパラメーター名と値を等号 (=) で接続します。

    4. 接続されたパラメーター名と値のペアを指定された順序で並べ替えて、アンパサンド (&) でペアを接続し、標準化されたクエリ文字列を取得します。

  2. 以下の方法で、エンコード済みの標準化されたクエリ文字列から string-to-sign を作成します:

    StringToSign=
          HTTPMethod + "&" +
          percentEncode("/") + "&" +
          percentEncode(CanonicalizedQueryString)

    以下にパラメーターを説明します。

    • HTTPMethod は、リクエストの送信に使用する HTTP メソッド (GET など) を指定します。

    • percentEncode("/") は、スラッシュ (/) がエンコードされた値 (%2F) を指定します。 エンコードは、URL のエンコード規則に準拠します。

    • percentEncode(CanonicalizedQueryString):URL のエンコード規則に基づいて、エンコード済みの標準化されたクエリ文字列を指定します。

ステップ 2:署名文字列の計算

  1. RFC 2104 に基づいて、文字列の HMAC 値を計算します。

    説明

    SHA1 アルゴリズムを使用して、string-to-sign の HMAC 値を計算します。 HMAC 計算のキーとして、AccessKey Secret とアンパサンド (&) (ASCII コード 38) の組み合わせが使われます。

  2. Base64 で HMAC 値をエンコードして署名文字列を取得します。

  3. 署名文字列を、Signature パラメーターとしてリクエストに追加します。

    説明

    取得された署名値が最終的なリクエストパラメーター値として送信される場合、RFC 3986 で定義されたルールに基づき、他のパラメーターと同様に値を URL エンコードする必要があります。

CreateKey操作は、署名メソッドを紹介する例として使用されます。

リクエストが署名される前のリクエストURL:

https://kms.cn-hangzhou.aliyuncs.com/?Action=CreateKey
&SignatureVersion=1.0
&Format=json
&Version=2016-01-20
&AccessKeyId=testid
&SignatureMethod=HMAC-SHA1
&Timestamp=2016-03-28T03:13:08Z           

リクエストURLのStringToSign:

GET&%2F&AccessKeyId%3Dtestid%26Action%3DCreateKey%26Format%3Djson%26SignatureMethod%3DHMAC-SHA1%26SignatureVersion%3D1.0%26Timestamp%3D2016-03-28T03%253A13%253A08Z%26Version%3D2016-01-20

AccessKey IDがtestidで、AccessKey secretがtestsecretの場合、文字列記号のHMAC値の計算に使用されるキーはtestsecret&です。

署名値は41wk2SSX1GJh7fwnc5eqOfiJPF **** です。

リクエストの署名後のリクエストURL:

https://kms.cn-hangzhou.aliyuncs.com/?Action=CreateKey
&SignatureVersion=1.0
&Format=json
&Version=2016-01-20
&AccessKeyId=testid
&SignatureMethod=HMAC-SHA1
&Timestamp=2016-03-28T03:13:08Z
&Signature=41wk2SSX1GJh7fwnc5eqOfiJPF****