セキュリティを確保するために、すべての API リクエストに署名する必要があります。Alibaba Cloud は、リクエスト署名を使用して API 呼び出し元の ID を検証します。リクエストが HTTP または HTTPS のどちらで送信されるかに関係なく、各 API リクエストには署名を含める必要があります。
概要
次の形式でリソース管理 API リクエストに署名を追加する必要があります。
https://Endpoint/?SignatureVersion=1.0&SignatureMethod=HMAC-SHA1&Signature=CT9X0VtwR86fNWSnsc6v8YGOjuE%3D&SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf以下にパラメーターを示します。
- SignatureMethod: 署名文字列の暗号化方式。値を HMAC-SHA1 に設定します。
- SignatureVersion: 署名暗号化アルゴリズムのバージョン。値を 1.0 に設定します。
- SignatureNonce: リプレイ攻撃を防ぐために使用される一意の乱数。リクエストごとに異なる番号を使用する必要があります。汎用一意識別子(UUID)を使用することをお勧めします。
- Signature: AccessKey シークレットを使用してリクエストを対称的に暗号化した後に生成される署名文字列。
署名暗号化アルゴリズムは、RFC 2104 HMAC-SHA1 仕様に準拠しています。AccessKey シークレットは、エンコードおよびソートされたクエリ文字列のハッシュベースのメッセージ認証コード(HMAC)値を計算するために使用され、HMAC 値は署名文字列として使用されます。リクエスト署名には、操作固有のパラメーターが含まれます。したがって、リクエストの署名は、リクエストパラメーターによって異なります。以下のセクションでは、リクエストの署名文字列を計算する方法について説明します。
Signature = Base64( HMAC-SHA1( AccessKey Secret, UTF-8-Encoding-Of(StringToSign)) )手順 1: 署名対象文字列の作成とエンコード
- リクエストパラメーターを配置して、正規化されたクエリ文字列を作成します。
- リクエストパラメーター(Signature を除くすべての共通パラメーターと操作固有のパラメーターを含む)をアルファベット順に配置します。 説明 GET メソッドを使用してリクエストを送信する場合、これらのパラメーターはリクエスト URL のパラメーターフィールドを構成します。これらのパラメーターは、リクエスト URI の疑問符(?)の後に配置され、アンパサンド(&)で接続されます。
- リクエスト URL 内の配置されたリクエストパラメーターの名前と値を、UTF-8 文字セットを使用してエンコードします。次の表にエンコードルールを示します。
文字 エンコードルール 大文字、小文字、数字、ハイフン(-)、アンダースコア(_)、ピリオド(.)、およびチルダ(~) これらの文字をエンコードする必要はありません。 その他の文字 これらの文字は、 %XY形式でパーセントエンコードする必要があります。XYは、16 進表記の文字の ASCII コードを表します。たとえば、二重引用符(")は%22としてエンコードされます。拡張 UTF-8 文字 これらの文字は、 %XY%ZA…形式でエンコードする必要があります。スペース スペースは %20としてエンコードする必要があります。スペースをプラス記号(+)としてエンコードしないでください。このエンコード方法は、Java 標準ライブラリによって提供されるapplication/x-www-form-urlencodedjava.net.URLEncoderクラスなどの、多目的インターネットメール拡張(MIME)エンコーディングアルゴリズム%20%2A%7EpercentEncode
とは異なります。ただし、MIME エンコーディングアルゴリズムを適用してから、エンコードされた文字列のプラス記号(+)を に、アスタリスク(*)を に、 をチルダ(~)に置き換えることができます。次の メソッドを使用して、アルゴリズムを実装できます。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; } - エンコードされたパラメーター名と値を等号(=)で接続します。
- 接続されたパラメーター名と値のペアを指定された順序でソートし、ペアをアンパサンド(&)で接続して、正規化されたクエリ文字列を取得します。
- リクエストパラメーター(Signature を除くすべての共通パラメーターと操作固有のパラメーターを含む)をアルファベット順に配置します。
- エンコードされた正規化クエリ文字列から、次のように署名対象文字列を作成します。
StringToSign= HTTPMethod + "&" + percentEncode("/") + "&" + percentEncode(CanonicalizedQueryString)以下にパラメーターを示します。
- HTTPMethod: GET など、リクエストの送信に使用される HTTP メソッドを指定します。
- percentEncode("/"): スラッシュ(/)のエンコード値(%2F)を指定します。エンコーディングは URL エンコーディングルールに従います。
- percentEncode(CanonicalizedQueryString): URL エンコーディングルールに基づいてエンコードされた正規化クエリ文字列を指定します。
手順 2: 署名文字列の計算
- RFC 2104 に基づいて、署名対象文字列の HMAC 値を計算します。 説明 SHA1 アルゴリズムを使用して、署名対象文字列の HMAC 値を計算します。AccessKey シークレットとアンパサンド(&)(ASCII コード 38)の組み合わせは、HMAC 計算のキーとして使用されます。
- HMAC 値を Base64 でエンコードして、署名文字列を取得します。
- リクエストに署名文字列を Signature パラメーターとして追加します。 説明 取得した署名値が最終的なリクエストパラメーター値として送信される場合、値は RFC 3986 で定義されているルールに基づいて、他のパラメーターと同様に URL エンコードする必要があります。
署名の例
CreateTrail API リクエストを例にとると、次のサンプルリクエスト URL に署名する必要があります。
https://actiontrail.cn-hangzhou.aliyuncs.com/?AccessKeyId=testid&Action=CreateTrail&Format=JSON&Name=test&RegionId=cn-hangzhou&RoleName=AliyunServiceRoleForActionTrail&SignatureMethod=HMAC-SHA1&SignatureNonce=d7730860-e66f-11ea-a3a5-d5f3b52e66a1&SignatureVersion=1.0&Timestamp=2020-08-25T01%3A11%3A01Z&Version=2017-12-04次の文字列は、string-to-sign です。
POST&%2F&AccessKeyId%3Dtestid%26Action%3DCreateTrail%26Format%3DJSON%26Name%3Dtest%26RegionId%3Dcn-hangzhou%26RoleName%3DAliyunServiceRoleForActionTrail%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3Dd7730860-e66f-11ea-a3a5-d5f3b52e66a1%26SignatureVersion%3D1.0%26Timestamp%3D2020-08-25T01%25253A11%25253A01Z%26Version%3D2017-12-04AccessKey ID が testid、AccessKey シークレットが testsecret であるとします。署名対象文字列の HMAC 値を計算するために使用されるキーは testsecret& です。
計算された署名文字列は、d15sJSZ0cc+y6a6FHlWxGK/qcUA= です。
この例では、次の署名付きリクエスト URL が生成されます。
https://actiontrail.cn-hangzhou.aliyuncs.com/?Signature=d15sJSZ0cc+y6a6FHlWxGK/qcUA=&AccessKeyId=testid&Action=CreateTrail&Format=JSON&Name=test&RegionId=cn-hangzhou&RoleName=AliyunServiceRoleForActionTrail&SignatureMethod=HMAC-SHA1&SignatureNonce=d7730860-e66f-11ea-a3a5-d5f3b52e66a1&SignatureVersion=1.0&Timestamp=2020-08-25T01%3A11%3A01Z&Version=2017-12-04