Alibaba Cloud は、署名を検証することで、各 API リクエストを認証します。すべてのリクエストには、HTTP と HTTPS のどちらを使用する場合でも、署名情報を含める必要があります。
概要
RPC API リクエストの場合、次の形式でクエリパラメーターに署名を追加します。
https://Endpoint/?SignatureVersion=1.0&SignatureMethod=HMAC-SHA1&Signature=CT9X0VtwR86fNWSnsc6v8YGOjuE%3D&SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf
- Endpoint:ApsaraMQ for MQTT の API エンドポイントは onsmqtt.[regionId].aliyuncs.com です。[regionId] の詳細については、「Endpoints」をご参照ください。
- SignatureMethod: 署名メソッドです。サポートされているメソッドは HMAC-SHA1 です。
- SignatureVersion: 署名アルゴリズムのバージョンです。現在のバージョンは 1.0 です。
- SignatureNonce: リプレイ攻撃を防ぐための一意な乱数です。各リクエストには、異なる乱数を使用する必要があります。汎用一意識別子 (UUID) の使用を推奨します。
- Signature: AccessKey シークレットから生成する署名です。
署名アルゴリズムは、RFC 2104 HMAC-SHA1 の仕様に準拠しています。署名は、エンコードしてソートしたリクエスト文字列から、AccessKey シークレットを使用して計算した HMAC 値です。各 API リクエストは内容が異なるため、署名もそれに応じて異なります。署名を計算するには、このトピックの手順に従ってください。
Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(
StringToSign)) )ステップ 1:署名対象文字列の構築
- リクエストパラメーターから正規化されたクエリ文字列を構築します。
- すべてのリクエストパラメーターを、パラメーター名でアルファベット順にソートします。これらのパラメーターには、共通リクエストパラメーターと操作固有パラメーターの両方が含まれますが、
Signatureパラメーターは除外します。説明 GET メソッドを使用してリクエストを送信する場合、これらのパラメーターはリクエスト URI の疑問符 (?) に続く部分であり、アンパサンド (&) で区切られます。 - ソートされたリクエストパラメーターの名前と値を、URL エンコーディングを使用して UTF-8 でエンコードします。次の表にエンコーディングルールを示します。
文字 エンコーディング方式 A~Z、a~z、0~9、および文字 -、_、.、~ エンコードしません。 その他の文字 %XY形式にエンコードします。XYは、文字の ASCII コードの 16 進数値を表します。たとえば、二重引用符 (") は%22とエンコードします。拡張 UTF-8 文字 %XY%ZA…形式にエンコードします。スペース プラス記号 (+) の代わりに %20としてエンコードします。このエンコーディング方式は、java.net.URLEncoderなどのライブラリで使用される標準のapplication/x-www-form-urlencodedMIME 形式とは異なります。必要なエンコーディングを生成するには、標準ライブラリを使用してから、プラス記号 (+) を%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; } - エンコードされたパラメーター名と値を等号 (=) で連結します。
- ソートした順序で、パラメーターと値のペアをアンパサンド (&) で連結します。結果の文字列が正規化されたクエリ文字列です。
- すべてのリクエストパラメーターを、パラメーター名でアルファベット順にソートします。これらのパラメーターには、共通リクエストパラメーターと操作固有パラメーターの両方が含まれますが、
- 前の手順で作成した正規化されたクエリ文字列を使用して、次のルールに基づいて署名対象文字列を構築します。
StringToSign= HTTPMethod + "&" + percentEncode("/") + "&" + percentEncode(CanonicalizedQueryString)各項目の説明:
- HTTPMethod は、GET など、リクエストの送信に使用される HTTP メソッドです。
- percentEncode("/") は、前述の URL エンコーディングルールに基づいてエンコードしたスラッシュ (/) 文字の値です。値は %2F です。
- percentEncode(CanonicalizedQueryString) は、正規化されたクエリ文字列を、前述の URL エンコーディングルールに基づいてエンコードしたものです。
ステップ 2:署名値の計算
- RFC 2104 で定義されているように、署名対象文字列 (StringToSign) の HMAC 値を計算します。説明 計算に使用されるキーは、AccessKey シークレットにアンパサンド (&) 文字 (ASCII コード 38) を付加したものです。ハッシュアルゴリズムは SHA1 です。
- Base64 ルールに基づいて HMAC 値を文字列としてエンコードします。結果の文字列が署名 (Signature) です。
- 計算された署名を
Signatureパラメーターとしてリクエストパラメーターに追加します。説明 署名を最終的なリクエストパラメーターとしてリクエストに追加する際には、RFC 3986 に従って、他のパラメーターと同様に URL エンコードする必要があります。
例
このセクションでは、QueryMqttTopic API を例として使用します。AccessKeyId が testid で、AccessKey secret が testsecret であると仮定します。署名なしのリクエスト URL は次のとおりです:
http://onsmqtt.cn-hangzhou.aliyuncs.com/?AccessKeyId=testid&Action=QueryMqttTopic&Format=XML&InstanceId=mqtt-cn-i7m2khg****&SignatureMethod=HMAC-SHA1&SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf&SignatureVersion=1.0&Timestamp=2016-02-23T12%3A46%3A24Z&Version=2020-04-20
キーとして testsecret& を使用して計算した署名は次のとおりです:
wJalrXUtnk51IbuD8iXp3x9d****=
署名を Signature パラメーターの値としてリクエスト URL に追加します。最終的な URL は次のとおりです:
http://onsmqtt.cn-hangzhou.aliyuncs.com/?AccessKeyId=testid&Action=QueryMqttTopic&Format=XML&InstanceId=mqtt-cn-i7m2khg****&SignatureMethod=HMAC-SHA1&SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf&SignatureVersion=1.0&Timestamp=2016-02-23T12%3A46%3A24Z&Version=2020-04-20&Signature=wJalrXUtnk51IbuD8iXp3x9d****%3D