すべてのプロダクト
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
  • EndpointApsaraMQ 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 を例として使用します。AccessKeyIdtestid で、AccessKey secrettestsecret であると仮定します。署名なしのリクエスト 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