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

PolarDB:署名方法

最終更新日:May 30, 2024

セキュリティを確保するには、すべての API リクエストに署名する必要があります。 Alibaba Cloud はリクエストの署名を使用して、API の呼び出し元を確認します。 各APIリクエストには、HTTPまたはHTTPSで送信されるかどうかに関係なく、署名が含まれている必要があります。

概要

署名をPolarDB-X APIリクエストに次の形式で追加する必要があります。

https:// Endpoint/?SignatureVersion=1.0&SignatureMethod=HMAC-SHA1&Signature=CT9X0VtwR86fNWSnsc6v8YGOjuE % 3D&SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd 6cf
説明:
  • SignatureMethod:署名の文字列を暗号化する方法です。 値を HMAC-SHA1 に設定します。
  • SignatureVersion:署名を暗号化するアルゴリズムのバージョンです。 値を 1.0 に設定します。
  • SignatureNonce:リプレイ攻撃を防ぐための、一意の乱数を設定します。 リクエストごとに異なる乱数を使用する必要があります。 汎用一意識別子 (UUID) の使用を推奨します。
  • Signature: リクエストの署名。 署名は、AccessKeyシークレットをキーとして対称暗号化アルゴリズムを使用して生成されます。

署名の計算

署名アルゴリズムは、RFC 2104のHMAC-SHA1仕様に準拠しています。 AccessKey secretは、エンコードおよびフォーマットされたクエリ文字列のハッシュベースのメッセージ認証コード (HMAC) 値を計算するために使用されます。 次いで、HMAC値が署名として使用される。 リクエストの一部のパラメータは、署名の計算に使用されます。 したがって、リクエストの署名はAPIリクエストのパラメーターによって異なります。

Signature = Base64( HMAC-SHA1( AccessSecret、UTF-8-Encoding-Of))
StringToSign) 
署名を計算するには、次の手順を実行します。
  1. string-to-signを作成してエンコードします。
    1. リクエストパラメータを使用して、正規化クエリ文字列を作成します。
      1. リクエストパラメーターをアルファベット順に並べて、正規化されたクエリ文字列を作成します。 Signatureを除くすべての共通および操作固有のパラメーターを含めます。

        GETメソッドを使用してリクエストを送信する場合、これらのパラメーターはクエスチョンマーク (?) の後にあるリクエストURIの一部であり、アンパサンド (&) で接続されています。

      2. 正規化されたクエリ文字列を UTF-8でエンコードします。 次のリストは、パーセントエンコードのルールを示しています。
        • 文字、数字、ハイフン (-) 、アンダースコア (_) 、ピリオド (.) 、およびチルダ (~) はエンコードする必要はありません。

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

        • 拡張UTF-8文字は % XY % ZA... 形式でエンコードされます。

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

          このエンコード方法は、Java標準ライブラリのjava.net.URLEncoderクラスで使用されるapplication/x-www-form-urlencoded MIMEエンコード方法とは異なります。 このようなテキストをパーセントエンコード形式に変換するには、エンコード文字列のプラス記号 (+) を % 20に、アスタリスク (*) を % 2Aに、% 7Eをチルダ (~) に置き換えます。 次のpercentEncodeメソッドがこの変換を実行します。

          プライベート静的最終文字列ENCODING = "UTF-8";
          プライベート静的文字列percentEncode (文字列値) がUnsupportedEncodingExceptionをスローします
          {
          戻り値! = null? URLEncoder.encode(value, ENCODING).replace("+", "% 20").replace("*", "% 2A").replace("% 7E", "~") : null;
          } 
        • 等号 (=) を使用して、各エンコードされたパラメータ名をそのエンコードされた値と接続します。
        • パラメータ名と値のペアをステップiで指定した順序でソートします。 次に、ペアをアンパサンド (&) で接続して、正規化されたクエリ文字列を生成します。
    2. 正規化されたクエリ文字列を使用して、次の方法で署名計算用の文字列を作成します。
      StringToSign=
            HTTPMethod + "&" +
            percentEncode("/") + "&" +
             percentEncode(CanonicalizedQueryString) 

      説明:

      • HTTPMethodは、GETなど、リクエストを行うために使用されるHTTPメソッドです。
      • percentEncode("/") は、URLのバックスラッシュ (/) を % 2Fとしてエンコードします。
      • percentEncode(CanonicalizedQueryString) は、ステップ1.2で説明したURLエンコーディングルールに基づいて、正規化クエリ文字列をエンコードします。
  2. string-to-signのHMAC値を計算します。
    1. string-to-signのRFC 2104準拠のHMAC値を計算します。
      説明 SHA1 アルゴリズムを使用して、string-to-sign の HMAC 値を計算します。 AccessKeyシークレットとそれに続くアンパサンド (&) (ASCIIコード38) がHMAC計算のキーとして使用されます。
    2. Base64でHMAC値をエンコードして署名文字列を取得する
    3. 署名文字列を、Signature パラメーターとしてリクエストに追加します。
      説明 署名パラメーターの値も、RFC 3986で定義されているルールに基づいてパーセントエンコードされている必要があります。

この例では、DescribeInstanceIds操作の署名付きリクエストURLを生成します。 この例では、AccessKey IDtestidAccessKey secrettestsecretです。 署名するリクエストURLの例を次に示します。

AccessKeyId=testid&Action=DescribeDrdsInstances&Format=XML&RegionId=cn-hangzhou&SignatureMethod=HMAC-SHA1&SignatureNonce=ae5bdbeb-9b44-40a1-8bb4-b40784bff686&SignatureVersion=1.0&Timestamp=2016-01-20T14% 3A26% 3A15Z&バージョン=2015-04-13

次の署名文字列は、testsecret& を使用して計算されます。

h/ka/jNO + WZv8Tqgo4a75sp6eTs=

Signatureパラメーターとその値がリクエストに追加されると、次のURLが生成されます。

http://drds.aliyuncs.com/?AccessKeyId=testid&Action=DescribeDrdsInstances&Format=XML&RegionId=cn-hangzhou&SignatureMethod=HMAC-SHA1&SignatureNonce=ae5bdbeb-9b44-40a1-8bb4-b40784bff686&SignatureVersion=1.0&Timestamp=2016-01-20T14%3A26%3A15Z&Version=2015-04-13&Signature=h%2Fka%2FjNO%2BWZv8Tqgo4a75sp6eTs%3D