MQTT-TLS は TLS プロトコルを使用して、デバイスと IoT Platform 間のパブリッシュ/サブスクライブ通信を暗号化し、データのセキュリティを確保します。
背景情報
MQTT CONNECT プロトコルを設定する際は、次の点にご注意ください:
-
複数の物理デバイスが同じデバイス証明書 (ProductKey、DeviceName、DeviceSecret) または認証情報 (ProductKey、DeviceName、ClientID、DeviceToken) を共有している場合、頻繁に切断されます。新しく認証されたデバイスは、前のデバイスを強制的にオフラインにし、自動再接続をトリガーします。
-
デバイス側の Link SDK は、切断時に自動的に再接続します。デバイスの動作は Simple Log Service でモニターできます。
MQTT クライアントの直接接続
暗号化されていない TCP 接続はセキュリティリスクが高いため、新しいエンタープライズインスタンスではデフォルトで無効になっています。
-
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 検証を継続する必要があります。
-
ポートと証明書の対応
デバイスが使用するルート証明書に基づいて接続ポートを選択します:
-
デバイスが Global Sign R1 ルート証明書 (まだ更新されていない) を使用している場合は、ポート 443 または 1883 に接続します。
-
デバイスが Alibaba Cloud IoT Platform 自己署名証明書を使用している場合は、ポート 8883 に接続します。
Global Sign R1 証明書の有効期限切れによる影響
ポート 1883 で使用される Global Sign R1 ルート証明書は、2028 年 1 月 28 日に有効期限が切れます。この日以降:
-
Link SDK を使用しているデバイスや、CA ルート証明書を更新していない自己開発デバイスなど、期限切れの証明書に依存するデバイスは、TLS 接続の確立に失敗します。
-
MQTT-TCP (非 TLS) 経由で接続するデバイスは、この証明書の有効期限切れの影響を受けません。
今後の計画
2028 年以降、ポート 1883 は TLS 接続をサポートしなくなります。その日までに、SDK をアップグレードするか、デバイスの CA ルート証明書を Alibaba Cloud IoT Platform 自己署名証明書に更新し、ポート 8883 または 443 に切り替えてください。
-
-
MQTT クライアントを使用してサーバーに接続します。
-
オープンソースの MQTT クライアントを使用して接続できます。MQTT 公式ドキュメントもご参照ください。
説明Alibaba Cloud は、サードパーティのコードに対するテクニカルサポートを提供していません。
-
デバイス側 SDK を使用して IoT Platform に接続します。C 言語の例については、MQTT 接続をご参照ください。独自のクライアントを開発する場合は、次のパラメーターを設定します。
パラメーター
説明
接続ドメイン名
パブリックインスタンスおよびエンタープライズインスタンスの MQTT 接続ドメイン名については、インスタンスエンドポイントの表示と設定をご参照ください。
可変ヘッダー:キープアライブ
CONNECT 命令には Keep Alive 間隔を含める必要があります。有効範囲:30~1200 秒。推奨:300 秒以上 (不安定なネットワークの場合は値を大きくします)。IoT Platform は、範囲外の値を持つ接続を拒否します。
詳細は、以下の MQTT キープアライブセクションをご参照ください。
MQTT CONNECT メッセージパラメーター
一デバイス一シークレットおよび一プロダクト一シークレットの事前登録認証の場合:デバイス証明書 (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();暗号化されたパスワードは、2 進数から 16 進数への文字列です。以下は結果の例です:
FAFD82A3D602B37FB0FA8B7892F24A477F85****MQTT 署名パラメーターを計算するには、MQTT 署名パラメーターの計算方法に従ってください。
事前登録なしの一プロダクト一シークレット認証の場合:ProductKey、DeviceName、ClientID、DeviceToken を使用して接続します。
mqttClientId: clientId+"|securemode=-2,authType=connwl|" mqttUsername: deviceName+"&"+productKey mqttPassword: deviceToken-
mqttClientId:
| |の間の内容は拡張パラメーターです。 -
clientId、deviceToken:MQTT 経由の動的デバイス登録から取得した ClientID と DeviceToken。
-
securemode:セーフモード。事前登録なしの一プロダクト一シークレット認証の場合、このパラメーターは -2 に固定されます。
-
authType:認証方式。事前登録なしの一プロダクト一シークレット認証の場合、このパラメーターは connwl に固定されます。
-
-
例
以下のトピックでは、オープンソースの MQTT クライアントを使用した接続例を示します:
MQTT キープアライブ
デバイスは、キープアライブ間隔ごとに少なくとも 1 つのメッセージ (PING リクエストなど) を送信する必要があります。
有効範囲:30~1,200 秒。推奨:300 秒以上。
ハートビートタイマーは、IoT Platform が CONNECT メッセージに応答して CONNACK メッセージを送信すると開始されます。タイマーは、PUBLISH、SUBSCRIBE、PING、または PUBACK メッセージが受信されるとリセットされます。IoT Platform は、30 秒ごとにデバイスのキープアライブハートビートをチェックします。スケジュールされた検出の待機時間は、デバイスがオンラインになってから最新のスケジュールされた検出までの期間です。最大タイムアウト期間は、次の数式を使用して計算されます: (keepalive interval × 1.5) + (waiting time for scheduled detection)。最大タイムアウト期間が経過してもデバイスからメッセージが受信されない場合、サーバーはデバイスを自動的に切断します。