セキュリティを確保するには、すべての 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)
- string-to-signを作成してエンコードします。
- リクエストパラメータを使用して、正規化クエリ文字列を作成します。
- リクエストパラメーターをアルファベット順に並べて、正規化されたクエリ文字列を作成します。 Signatureを除くすべての共通および操作固有のパラメーターを含めます。
GETメソッドを使用してリクエストを送信する場合、これらのパラメーターはクエスチョンマーク (?) の後にあるリクエストURIの一部であり、アンパサンド (&) で接続されています。
- 正規化されたクエリ文字列を UTF-8でエンコードします。 次のリストは、パーセントエンコードのルールを示しています。
-
文字、数字、ハイフン (-) 、アンダースコア (_) 、ピリオド (.) 、およびチルダ (~) はエンコードする必要はありません。
-
他の文字は
% XY形式でエンコードする必要があります。XYは文字のASCIIコードを16進表記で表します。 たとえば、二重引用符 (") は% 22としてエンコードされます。 -
拡張UTF-8文字は
% XY % ZA...形式でエンコードされます。 -
スペースは
% 20としてエンコードする必要があります。 スペースは、プラス記号 (+) としてエンコードしないでください。このエンコード方法は、Java標準ライブラリの
java.net.URLEncoderクラスで使用されるapplication/x-www-form-urlencodedMIMEエンコード方法とは異なります。 このようなテキストをパーセントエンコード形式に変換するには、エンコード文字列のプラス記号 (+) を% 20に、アスタリスク (*) を% 2Aに、% 7Eをチルダ (~) に置き換えます。 次のpercentEncodeメソッドがこの変換を実行します。プライベート静的最終文字列ENCODING = "UTF-8"; プライベート静的文字列percentEncode (文字列値) がUnsupportedEncodingExceptionをスローします { 戻り値! = null? URLEncoder.encode(value, ENCODING).replace("+", "% 20").replace("*", "% 2A").replace("% 7E", "~") : null; } - 等号 (=) を使用して、各エンコードされたパラメータ名をそのエンコードされた値と接続します。
- パラメータ名と値のペアをステップiで指定した順序でソートします。 次に、ペアをアンパサンド (&) で接続して、正規化されたクエリ文字列を生成します。
-
- リクエストパラメーターをアルファベット順に並べて、正規化されたクエリ文字列を作成します。 Signatureを除くすべての共通および操作固有のパラメーターを含めます。
- 正規化されたクエリ文字列を使用して、次の方法で署名計算用の文字列を作成します。
StringToSign= HTTPMethod + "&" + percentEncode("/") + "&" + percentEncode(CanonicalizedQueryString)説明:
- HTTPMethodは、GETなど、リクエストを行うために使用されるHTTPメソッドです。
- percentEncode("/") は、URLのバックスラッシュ (/) を % 2Fとしてエンコードします。
- percentEncode(CanonicalizedQueryString) は、ステップ1.2で説明したURLエンコーディングルールに基づいて、正規化クエリ文字列をエンコードします。
- リクエストパラメータを使用して、正規化クエリ文字列を作成します。
- string-to-signのHMAC値を計算します。
- string-to-signのRFC 2104準拠のHMAC値を計算します。
説明 SHA1 アルゴリズムを使用して、string-to-sign の HMAC 値を計算します。 AccessKeyシークレットとそれに続くアンパサンド (&) (ASCIIコード38) がHMAC計算のキーとして使用されます。
- Base64でHMAC値をエンコードして署名文字列を取得する
- 署名文字列を、Signature パラメーターとしてリクエストに追加します。
説明 署名パラメーターの値も、RFC 3986で定義されているルールに基づいてパーセントエンコードされている必要があります。
- string-to-signのRFC 2104準拠のHMAC値を計算します。
例
この例では、DescribeInstanceIds操作の署名付きリクエストURLを生成します。 この例では、AccessKey IDはtestid、AccessKey secretはtestsecretです。 署名するリクエスト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