セキュリティを確保するために、すべての API リクエストに署名する必要があります。Alibaba Cloud は、リクエスト署名を使用して API 呼び出し元の ID を検証します。そのため、HTTP または HTTPS のどちらを使用して送信されたかに関係なく、各 API リクエストには署名情報を含める必要があります。
概要
次の形式で Message Queue for Apache RocketMQ API リクエストに署名を追加する必要があります。
https://Endpoint/?SignatureVersion=1.0&SignatureMethod=HMAC-SHA1&Signature=CT9X0VtwR86fNWSnsc6v8YGOjuE%3D&SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf- エンドポイント: ApsaraMQ for MQTT [******] のサービスアクセスアドレスは onsmqtt.[regionId].aliyuncs.com です。[ regionId] については、エンドポイント をご参照ください。
- SignatureMethod: 署名文字列の暗号化方式。値を HMAC-SHA1 に設定します。
- SignatureVersion: 署名暗号化アルゴリズムのバージョン。値を 1.0 に設定します。
- SignatureNonce: リプレイ攻撃を防ぐために使用される一意の乱数。リクエストごとに異なる乱数を使用する必要があります。汎用一意識別子 (UUID) を使用することをお勧めします。
- Signature: AccessKey シークレットを使用してリクエストを対称的に暗号化した後に生成される署名。
署名暗号化アルゴリズムは、RFC 2104 HMAC-SHA1 仕様に準拠しています。AccessKey シークレットを使用して、エンコードおよびソートされたクエリ文字列のハッシュベースのメッセージ認証コード (HMAC) 値が計算され、HMAC 値が署名文字列として使用されます。リクエスト署名には、操作固有のパラメーターが含まれます。そのため、リクエストの署名は、リクエストパラメーターによって異なります。署名文字列を計算するには、このトピックの手順に従ってください。
Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(
StringToSign)) )1 署名対象文字列の作成とエンコード
- リクエストパラメーターを配置して、正規化されたクエリ文字列を作成します。
- リクエストパラメーター (Signature を除くすべての共通パラメーターと操作固有のパラメーターを含む) をアルファベット順に配置します。説明 GET メソッドを使用してリクエストを送信する場合、これらのパラメーターはリクエスト URI のパラメーターフィールドを構成します。リクエスト URI の疑問符 (?) の後に配置され、アンパサンド (&) で接続されます。
- 各リクエストパラメーターの名前と値をエンコードします。名前と値は、UTF-8 文字セットを使用して URL エンコードする必要があります。エンコード規則の詳細については、次の表を参照してください。
文字 エンコード規則 A ~ Z、a ~ z、0 ~ 9、ハイフン (-)、アンダースコア (_)、ピリオド (.)、およびチルダ (~) これらの文字をエンコードする必要はありません その他の文字 これらの文字は、 %XY形式でパーセントエンコードする必要があります。XYは、16 進表記の文字の ASCII コードを表します。たとえば、二重引用符 (") は%22としてエンコードされます。拡張 UTF-8 文字 これらの文字は、 %XY%ZA…形式でエンコードされます。スペース文字 スペースは %20としてエンコードする必要があります。スペースをプラス記号 (+) としてエンコードしないでください。このエンコード方法は、application/x-www-form-urlencodedMIME エンコードアルゴリズム (Java 標準ライブラリで提供されるjava.net.URLEncoderクラスなど) とは異なります。標準ライブラリのエンコード規則に基づいてスペースをエンコードし、エンコードされた文字列のプラス記号 (+) を%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; } - エンコードされたパラメーター名とその値を等号 (=) を使用して接続します。
- 手順 1.1.1 で指定された順序でパラメーター名と値のペアをソートし、アンパサンド (&) を使用してペアを接続して、正規化されたクエリ文字列を作成します。
- リクエストパラメーター (Signature を除くすべての共通パラメーターと操作固有のパラメーターを含む) をアルファベット順に配置します。
- エンコードされた正規化クエリ文字列から署名対象文字列を作成します。署名対象文字列を作成する手順は次のとおりです。
StringToSign= HTTPMethod + “&” + percentEncode(“/”) + ”&” + percentEncode(CanonicalizedQueryString)上記の規則では、
- HTTPMethod: リクエストを行うために使用される HTTP メソッド (GET など)。
- percentEncode(“/”): 手順 1.1.2 で説明されている URL エンコード規則に基づいて、バックスラッシュ (/) を %2F としてエンコードします。
- percentEncode(CanonicalizedQueryString): この文字列は、手順 i で説明されている URL エンコード規則の結果です。
手順 2: 署名文字列の計算
- RFC2104 で定義されているように、署名対象文字列の HMAC 値を計算します。説明 署名の計算に使用されるキーは、AccessKey シークレットの後にアンパサンド (&) が続きます。計算には SHA1 アルゴリズムが使用されます。
- HMAC 値を Base64 でエンコードして、署名文字列を取得します。
- リクエストに署名文字列を Signature パラメーターとして追加します。説明 リクエストに署名文字列を Signature パラメーターとして追加する場合、RFC3986 で定義されている規則に基づいて、他のパラメーターと同様にパラメーターを URL エンコードする必要があります。
例
この例では、DescribeRegions 操作を呼び出す API リクエストに署名する方法を示します。AccessKeyId パラメーターの値が testid で、AccessKeySecret パラメーターの値が testsecret であるとします。署名されるリクエスト URL は次のとおりです。
http://ecs.aliyuncs.com/?Timestamp=2016-02-23T12%3A46:24Z&Format=XML&AccessKeyId=testid&Action=DescribeRegions&SignatureMethod=HMAC-SHA1&SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf&Version=2014-05-26&SignatureVersion=1.0testsecret& を使用して計算された署名文字列は次のとおりです。
OLeaidS1JvxuMvnyHOwuJ+uX5qY=リクエストに署名文字列を Signature パラメーターとして追加します。署名付きリクエストの URL は次のとおりです。
http://ecs.aliyuncs.com/?SignatureVersion=1.0&Action=DescribeRegions&Format=XML&SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf&Version=2014-05-26&AccessKeyId=testid&Signature=OLeaidS1JvxuMvnyHOwuJ+uX5qY=&SignatureMethod=HMAC-SHA1&Timestamp=2016-02-23T12%3A46%3A24Z