Amazon Web Services ブログ

ポート443でTLS認証を使ったMQTT: なぜ便利で、どのように動くのか

AWS IoT Coreサービスで、ポート443でTLSクライアント認証を使用してMQTTを使用してデバイスを接続できるようになりました。この機能を利用してどのようにデバイスを接続するのかを知るには次をお読みください、デバイス接続方法についてを知るには最後のセクションをお読みください。

443, 8883 -違い

TCP接続は通常、IPアドレスとポート番号の組み合わせの関連付けがなされています。そのために、アプリケーションが他のサードパーティのアプリケーションと通信できるようにするためには、使用するポート番号の問い合わせが発生します。これを解決するために Internet Assigned Numbers Authority(IANA)は 、組織に登録されているTCPとUDPの様々なメッセージプロトコルに対するマッピングを維持管理しています。これは標準的なリストではありませんが、広く採用されています。データベースのクイック検索では、ポート443はHTTP over TLSとして登録済みのポートであり、8883はMQTT over TLSとして登録済みのポートです。 AWS IoT Coreはこれらの規格を可能な限り遵守していますが、これを逸脱するシナリオがあることをお客様から学びました。

企業のファイアウォールや一部のホームルータでさえ、小さな範囲のTCPポートで送信されるインバウンドおよびアウトバウンドトラフィックを制限することがよくあります。 これは、サイバー攻撃の可能性がある攻撃対象を制限するためのセキュリティ手段として行われます。 HTTPSトラフィック(443)などの標準ポートは開いたままですが、MQTT(8883)のようにあまり一般的でないプロトコルに使用されるポートは意図的にブロックされる可能性があります。

もしあなたがIoTデバイスを製造しており、そのデバイスはあなたが制御できないIT環境で利用される場合、これは頭痛の原因となる可能性があります。たとえば、全国の病院に販売されている医療機器を製造する場合、各病院のIT部門と個別に交渉し、AWS IoT Coreと通信するために彼らのファイアウォールのポート8883を開放する必要があります。 標準的なTLSプロトコルへの拡張はまさにこういった問題のためにあります。

 

ALPN – 1つのポートですべてを管理する

Application Layer Protocol Negotiation (アプリケーション レイヤ プロトコル ネゴシエーション : ALPN)は、最も一般的なTLS実装の多くでサポートされているRFC 7301で定義されているTLSの拡張です。 ALPNを使用すると、TLSサーバーに接続しているクライアントは、TLSハンドシェイク中にClientHelloメッセージの一部としてProtocolNameListと呼ばれる追加パラメータを渡すことができます。 ProtocolNameListは、クライアントが通信に使用したいアプリケーションプロトコルの優先順位付きリストになります。 ServerHelloメッセージの一部として、TLSサーバーは、このリストから、アプリケーションデータを送信するために使用される1つのプロトコルを選択します。

ALPN拡張を含む完全なTLSハンドシェイクは、次のように動作します

 

AWS IoT Coreは、特別なProtocolNameとして “x-amzn-mqtt-ca”をサポートしています。クライアントは、TLSクライアント認証でMQTTを使用するように指定できます。単に “MQTT”ではなく、この特別な値を使用する必要があります。これは、クライアントが使用するアプリケーション・プロトコルを通知するだけでなく、AWS IoT Coreでは、TLSハンドシェイクの一部としてCertificateRequestを送信する必要があることを通知するためにProtocolNameも使用します。クライアントがAWS IoT Coreを要求せずに証明書を送信する場合、TLS仕様ではAWS IoT Coreがハンドシェイクを終了する必要があります。

 

MQTTを使用してデバイスをポート443に接続するにはどうすればよいですか?

  1. デバイスのTLSクライアントがALPN拡張をサポートしていることを確認します。
    • ご利用のライブラリなどのマニュアルを参照してください。このwikipediaページは、便利なリストを提供しています。
    • Amazon FreeRTOSのソースコードは、ALPN拡張に対応しています。
  2. 証明書の作成、有効化、ダウンロード、または独自の証明書の取得により、デバイスをAWS IoT Coreに登録します。
  3. 「x-amzn-mqtt-ca」プロトコル*を使用してデバイス上のALPN拡張を設定します。
  4. ポート443でAWS IoTコアに接続します。

*:現在、「x-amzn-mqtt-ca」のみがサポートされているALPN ProtocolNameであり、ポート443でのみサポートされています。マッピング情報の最新は AWS IoT Core開発者ガイドのプロトコルページを参照ください。

 

原文はこちら。翻訳はSA 小梁川が担当しました。