MQTT-TLS は TLS プロトコルを使用して、デバイスと IoT Platform 間のパブリッシュ/サブスクライブ通信を暗号化し、データセキュリティを確保します。
背景情報
MQTT CONNECT プロトコルを設定する際は、以下の点にご注意ください。
-
複数の物理デバイスが同一のデバイス証明書(ProductKey、DeviceName、および DeviceSecret)または認証情報(ProductKey、DeviceName、ClientID、および DeviceToken)を共有している場合、頻繁に切断されます。新たに認証されたデバイスが既存のデバイスを強制的にオフラインにし、自動再接続がトリガーされるためです。
-
デバイス側の Link SDK は切断時に自動的に再接続します。Simple Log Service でデバイスの動作をモニターできます。
直接 MQTT クライアント接続
暗号化されていない TCP 接続は高いセキュリティリスクを伴うため、新規の Enterprise Edition インスタンスではデフォルトで無効になっています。
-
安全な通信を確保するため、TLS 暗号化接続を使用してください。
-
デバイス側の Link SDK には TLS 暗号化が事前設定されています。手動での設定は不要です。
-
独自にデバイスクライアントを開発する場合は、IoT Platform サーバーの認証に以下のいずれかのルート証明書を使用してください。
-
推奨: Alibaba Cloud IoT Platform 自己署名証明書。有効期限:2053 年 7 月 4 日まで。ポート 8883 に接続します。
重要証明書ファイルの整合性を確認するには、MD5 ハッシュ
c7a6afb466713832af778a7bcb6d1aefを使用できます。 -
Global Sign R1 ルート証明書。有効期限:2028 年 1 月 28 日まで。ポート 1883 に接続します。有効期限が切れた後は、デバイス側で CA ルート証明書を更新し、TLS 検証を継続する必要があります。
-
-
-
MQTT クライアントを使用してサーバーに接続します。
-
オープンソースの MQTT クライアント を使用して接続できます。また、MQTT 公式ドキュメント もご参照ください。
説明Alibaba Cloud はサードパーティ製コードについてテクニカルサポートを提供しません。
-
デバイス側 SDK を使用して IoT Platform に接続します。C 言語の例については、「MQTT 接続」をご参照ください。独自にクライアントを開発する場合は、以下のパラメーターを設定してください。
パラメーター
説明
接続ドメイン名
パブリックインスタンスおよび Enterprise Edition インスタンスの MQTT 接続ドメイン名については、「インスタンスエンドポイントの確認と設定」をご参照ください。
可変ヘッダー:Keep Alive
CONNECT 命令にはキープアライブ間隔を必ず含める必要があります。有効値:30~1200 秒。推奨値:300 秒以上(ネットワークが不安定な場合はさらに長くしてください)。IoT Platform は範囲外の値を持つ接続を拒否します。
詳細は、下記の「MQTT キープアライブ」セクションをご参照ください。
MQTT CONNECT メッセージパラメーター
One-Device-One-Secret および One-Product-One-Secret の事前登録認証の場合:デバイス証明書(ProductKey、DeviceName、および DeviceSecret)を使用して接続します。
mqttClientId: clientId+"|securemode=3,signmethod=hmacsha1,timestamp=132323232|" mqttUsername: deviceName+"&"+productKey mqttPassword: sign_hmac(deviceSecret,content)-
mqttClientId:
| |の間の内容は拡張パラメーターです。 -
clientId:カスタムクライアント ID。最大長:64 文字。識別しやすいように、デバイスの MAC アドレスまたはシリアル番号(SN)の使用を推奨します。
-
securemode:セキュリティモード。有効値:2(TLS 直接接続)、3(TCP 直接接続)。
-
signmethod:署名アルゴリズム。有効値:hmacmd5、hmacsha1、hmacsha256。
-
timestamp:オプション。現在時刻(ミリ秒単位)。
-
mqttPassword:サーバーに送信するパラメーターをアルファベット順にソートした後、指定された `signmethod` を使用して署名します。計算の詳細は、「MQTT 接続署名の例」をご参照ください。
-
content:`content` の値は、サーバーに送信するパラメーター(productKey、deviceName、timestamp、および clientId)の値を連結して生成される文字列です。連結前に、パラメーター名をアルファベット順にソートしてください。
重要productKey および deviceName は必須パラメーターであり、timestamp および clientId はオプションパラメーターです。timestamp または clientId を渡す場合は、その値を mqttClientId の設定値と一致させる必要があります。
例:
clientId = 12345, deviceName = device, productKey = pk, timestamp = 789, signmethod=hmacsha1, and deviceSecret=secretと仮定します。TCP 経由で MQTT に送信されるパラメーターは次のとおりです。mqttclientId=12345|securemode=3,signmethod=hmacsha1,timestamp=789| mqttUsername=device&pk mqttPassword=hmacsha1("secret","clientId12345deviceNamedeviceproductKeypktimestamp789").toHexString();暗号化されたパスワードはバイナリから 16 進数への変換文字列です。以下は結果の例です。
FAFD82A3D602B37FB0FA8B7892F24A477F85****MQTT 署名パラメーターの計算方法については、「MQTT 署名パラメーターの計算方法」に従ってください。
事前登録なしの One-Product-One-Secret 認証の場合:ProductKey、DeviceName、ClientID、および DeviceToken を使用して接続します。
mqttClientId: clientId+"|securemode=-2,authType=connwl|" mqttUsername: deviceName+"&"+productKey mqttPassword: deviceToken-
mqttClientId:
| |の間の内容は拡張パラメーターです。 -
clientId、deviceToken:「MQTT による動的デバイス登録」から取得した ClientID および DeviceToken。
-
securemode:セーフモード。事前登録なしの One-Product-One-Secret 認証では、このパラメーターは -2 に固定されます。
-
authType:認証方式。事前登録なしの One-Product-One-Secret 認証では、このパラメーターは connwl に固定されます。
-
-
例
以下のトピックでは、オープンソース MQTT クライアントを使用した接続例を紹介しています。
MQTT キープアライブ
デバイスは、各キープアライブ間隔内に少なくとも 1 つのメッセージ(たとえば PING リクエスト)を送信する必要があります。
有効値:30~1,200 秒。推奨値:300 秒以上。
ハートビートタイマーは、IoT Platform が CONNECT メッセージに対する応答として CONNACK メッセージを送信した時点で開始されます。PUBLISH、SUBSCRIBE、PING、または PUBACK メッセージを受信すると、タイマーはリセットされます。IoT Platform はデバイスのキープアライブハートビートを 30 秒ごとにチェックします。スケジュールされた検出の待機時間とは、デバイスがオンラインになってから最新のスケジュール検出までの期間を指します。最大タイムアウト期間は、次の数式で計算されます:(キープアライブ間隔 × 1.5) + (スケジュール検出の待機時間)。最大タイムアウト期間経過後もデバイスからのメッセージが受信されない場合、サーバーは自動的にデバイスを切断します。