すべてのプロダクト
Search
ドキュメントセンター

ApsaraMQ for MQTT:署名メカニズム

最終更新日:Jun 17, 2026

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:署名対象文字列の構築

  1. リクエストパラメーターから正規化されたクエリ文字列を構築します。
    1. すべてのリクエストパラメーターを、パラメーター名でアルファベット順にソートします。これらのパラメーターには、共通リクエストパラメーターと操作固有パラメーターの両方が含まれますが、Signature パラメーターは除外します。
      説明 GET メソッドを使用してリクエストを送信する場合、これらのパラメーターはリクエスト URI の疑問符 (?) に続く部分であり、アンパサンド (&) で区切られます。
    2. ソートされたリクエストパラメーターの名前と値を、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-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;
      }
    3. エンコードされたパラメーター名と値を等号 (=) で連結します。
    4. ソートした順序で、パラメーターと値のペアをアンパサンド (&) で連結します。結果の文字列が正規化されたクエリ文字列です。
  2. 前の手順で作成した正規化されたクエリ文字列を使用して、次のルールに基づいて署名対象文字列を構築します。
    StringToSign=
          HTTPMethod + "&" +
          percentEncode("/") + "&" +
           percentEncode(CanonicalizedQueryString)

    各項目の説明:

    • HTTPMethod は、GET など、リクエストの送信に使用される HTTP メソッドです。
    • percentEncode("/") は、前述の URL エンコーディングルールに基づいてエンコードしたスラッシュ (/) 文字の値です。値は %2F です。
    • percentEncode(CanonicalizedQueryString) は、正規化されたクエリ文字列を、前述の URL エンコーディングルールに基づいてエンコードしたものです。

ステップ 2:署名値の計算

  1. RFC 2104 で定義されているように、署名対象文字列 (StringToSign) の HMAC 値を計算します。
    説明 計算に使用されるキーは、AccessKey シークレットにアンパサンド (&) 文字 (ASCII コード 38) を付加したものです。ハッシュアルゴリズムは SHA1 です。
  2. Base64 ルールに基づいて HMAC 値を文字列としてエンコードします。結果の文字列が署名 (Signature) です。
  3. 計算された署名を 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