セキュリティを確保するには、すべての 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 を作成してエンコード
リクエストパラメーターを配置して、標準化されたクエリの文字列を作成します。
リクエストパラメーター (Signature を除くすべての共通パラメーターおよび操作固有のパラメーターを含む) をアルファベット順に配置します。
説明GET メソッドでリクエストを送信する場合、これらのパラメーターによりリクエスト URL のパラメーターフィールドが構成されます。 これらのパラメーターは、リクエスト URI の疑問符 (?) の後に置かれ、アンパサンド (&) で接続されます。
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; }エンコードされたパラメーター名と値を等号 (=) で接続します。
接続されたパラメーター名と値のペアを指定された順序で並べ替えて、アンパサンド (&) でペアを接続し、標準化されたクエリ文字列を取得します。
以下の方法で、エンコード済みの標準化されたクエリ文字列から string-to-sign を作成します:
StringToSign= HTTPMethod + "&" + percentEncode("/") + "&" + percentEncode(CanonicalizedQueryString)以下にパラメーターを説明します。
HTTPMethod は、リクエストの送信に使用する HTTP メソッド (GET など) を指定します。
percentEncode("/") は、スラッシュ (/) がエンコードされた値 (%2F) を指定します。 エンコードは、URL のエンコード規則に準拠します。
percentEncode(CanonicalizedQueryString):URL のエンコード規則に基づいて、エンコード済みの標準化されたクエリ文字列を指定します。
ステップ 2:署名文字列の計算
RFC 2104 に基づいて、文字列の HMAC 値を計算します。
説明SHA1 アルゴリズムを使用して、string-to-sign の HMAC 値を計算します。 HMAC 計算のキーとして、AccessKey Secret とアンパサンド (&) (ASCII コード 38) の組み合わせが使われます。
Base64 で HMAC 値をエンコードして署名文字列を取得します。
署名文字列を、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-20AccessKey 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****