前書き
MQTTは、「モノのインターネット」デバイスへの軽量のパブリッシュ/サブスクライブ通信を提供するように設計された、マシンツーマシンメッセージングプロトコルです。 一般的に、車両のジオトラッキング車両、ホームオートメーション、環境センサーネットワーク、ユーティリティスケールのデータ収集に使用されます。
Mosquittoは人気のあるMQTTサーバー(またはMQTT用語ではbroker)であり、優れたコミュニティサポートがあり、インストールと構成が簡単です。
このチュートリアルでは、Mosquittoをインストールし、SSLを使用してパスワードで保護されたMQTT通信を保護するようにブローカーを設定します。
前提条件
このチュートリアルを開始する前に、次のものが必要です。
-
this Ubuntu 18.04 server setup tutorialで詳しく説明されているように、root以外のsudo対応ユーザーと基本的なファイアウォールが設定されたUbuntu18.04サーバー。
-
How to Set Up a Host Name with DigitalOceanに従って、サーバーを指すドメイン名。 このチュートリアルでは、全体を通して
mqtt.example.com
を使用します。 -
Certbotツールを使用して生成された、ドメインとMosquittoで使用する自動更新可能なLet's Encrypt SSL証明書。 これを設定する方法をHow To Use Certbot Standalone Mode to Retrieve Let’s Encrypt SSL Certificates on Ubuntu 18.04で学ぶことができます
-
手順4で、
systemctl restart mosquitto
をrenew_hook
として追加できます。 必ず、前の前提条件の手順で構成したのと同じドメインを使用してください。
-
[[step-1 -—- installing-mosquitto]] ==ステップ1—Mosquittoのインストール
Ubuntu 18.04には、デフォルトのソフトウェアリポジトリにかなり新しいバージョンのMosquittoが含まれているため、そこからインストールできます。
まず、root以外のユーザーを使用してログインし、apt update
を使用してパッケージリストを更新します。
sudo apt update
ここで、apt install
を使用してMosquittoをインストールします。
sudo apt install mosquitto mosquitto-clients
デフォルトでは、Ubuntuはインストール後にMosquittoサービスを開始します。 デフォルトの構成をテストしましょう。 インストールしたMosquittoクライアントの1つを使用して、ブローカーのトピックをサブスクライブします。
Topicsは、メッセージを公開およびサブスクライブするラベルです。 これらは階層として配置されているため、たとえば、sensors/outside/temp
とsensors/outside/humidity
を使用できます。 トピックの配置方法は、あなたとあなたのニーズ次第です。 このチュートリアルでは、簡単なテストトピックを使用して構成の変更をテストします。
サーバーに2回ログインすると、2つの端末が並んでいます。 新しいターミナルで、mosquitto_sub
を使用してテストトピックをサブスクライブします。
mosquitto_sub -h localhost -t test
-h
はMQTTサーバーのホスト名を指定するために使用され、-t
はトピック名です。 mosquitto_sub
はメッセージの到着を待機しているため、ENTER
を押しても出力は表示されません。 他の端末に切り替えて、メッセージを公開します。
mosquitto_pub -h localhost -t test -m "hello world"
mosquitto_pub
のオプションはmosquitto_sub
と同じですが、今回は追加の-m
オプションを使用してメッセージを指定します。 ENTER
を押すと、他の端末にhello worldがポップアップするはずです。 最初のMQTTメッセージを送信しました!
2番目の端末にCTRL+C
を入力して、mosquitto_sub
を終了しますが、サーバーへの接続は開いたままにします。 手順5の別のテストで再び使用します。
次に、パスワードベースの認証を使用してインストールを保護します。
[[step-2 -—- configuring-mqtt-passwords]] ==ステップ2—MQTTパスワードの構成
パスワードを使用するようにMosquittoを設定しましょう。 Mosquittoには、mosquitto_passwd
と呼ばれる特別なパスワードファイルを生成するユーティリティが含まれています。 このコマンドは、指定されたユーザー名のパスワードを入力するように求め、結果を/etc/mosquitto/passwd
に配置します。
sudo mosquitto_passwd -c /etc/mosquitto/passwd sammy
次に、Mosquittoの新しい構成ファイルを開き、このパスワードファイルを使用してすべての接続にログインを要求するように指示します。
sudo nano /etc/mosquitto/conf.d/default.conf
これにより、空のファイルが開きます。 以下に貼り付けます。
/etc/mosquitto/conf.d/default.conf
allow_anonymous false
password_file /etc/mosquitto/passwd
ファイルの最後に必ず末尾の改行を残してください。
allow_anonymous false
は認証されていないすべての接続を無効にし、password_file
行はMosquittoにユーザーとパスワードの情報を探す場所を指示します。 ファイルを保存して終了します。
次に、Mosquittoを再起動して、変更をテストする必要があります。
sudo systemctl restart mosquitto
パスワードなしでメッセージを公開してみてください:
mosquitto_pub -h localhost -t "test" -m "hello world"
メッセージは拒否されるべきです:
OutputConnection Refused: not authorised.
Error: The connection was refused.
パスワードを再試行する前に、2番目のターミナルウィンドウに再度切り替えて、今回はユーザー名とパスワードを使用して「テスト」トピックにサブスクライブします。
mosquitto_sub -h localhost -t test -u "sammy" -P "password"
接続して座って、メッセージを待つ必要があります。 定期的にテストメッセージを送信するため、このターミナルを開いたままにしてチュートリアルの残りの部分で接続しておくことができます。
ユーザー名とパスワードを使用して、もう一方の端末でメッセージを公開します。
mosquitto_pub -h localhost -t "test" -m "hello world" -u "sammy" -P "password"
メッセージはステップ1のように通過するはずです。 Mosquittoにパスワード保護を追加しました。 残念ながら、暗号化されていないパスワードをインターネット経由で送信しています。 次に、MosquittoにSSL暗号化を追加して、これを修正します。
[[step-3 -—- configuring-mqtt-ssl]] ==ステップ3— MQTTSSLの構成
SSL暗号化を有効にするには、Let's Encrypt証明書の保存場所をMosquittoに伝える必要があります。 以前に開始した構成ファイルを開きます。
sudo nano /etc/mosquitto/conf.d/default.conf
ファイルの最後に以下を貼り付けて、追加した2行を残します。
/etc/mosquitto/conf.d/default.conf
. . .
listener 1883 localhost
listener 8883
certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem
cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem
繰り返しになりますが、ファイルの最後に必ず末尾の改行を残してください。
2つの別々のlistener
ブロックを構成に追加します。 最初のlistener 1883 localhost
は、ポート1883
のデフォルトのMQTTリスナーを更新します。これは、これまで接続してきたものです。 1883
は、暗号化されていない標準のMQTTポートです。 行のlocalhost
部分は、このポートをlocalhostインターフェイスにのみバインドするようにMosquittoに指示しているため、外部からアクセスすることはできません。 いずれにせよ、外部リクエストはファイアウォールによってブロックされていたはずですが、明示するのは良いことです。
listener 8883
は、ポート8883
に暗号化されたリスナーを設定します。 これは、MQTT + SSLの標準ポートであり、MQTTSとも呼ばれます。 次の3行、certfile
、cafile
、およびkeyfile
はすべて、Mosquittoが適切なLet’sEncryptファイルをポイントして暗号化された接続をセットアップすることを示しています。
ファイルを保存して終了し、Mosquittoを再起動して設定を更新します。
sudo systemctl restart mosquitto
ポート8883
への接続を許可するようにファイアウォールを更新します。
sudo ufw allow 8883
OutputRule added
Rule added (v6)
ここで、SSLのいくつかの異なるオプションを使用して、mosquitto_pub
を使用して再度テストします。
mosquitto_pub -h mqtt.example.com -t test -m "hello again" -p 8883 --capath /etc/ssl/certs/ -u "sammy" -P "password"
localhost
の代わりに完全なホスト名を使用していることに注意してください。 SSL証明書はmqtt.example.com
に対して発行されるため、localhost
に安全に接続しようとすると、ホスト名が証明書のホスト名と一致しないというエラーが表示されます(両方が同じモスキートを指している場合でも)サーバ)。
--capath /etc/ssl/certs/
はmosquitto_pub
のSSLを有効にし、ルート証明書を探す場所を指示します。 これらは通常、オペレーティングシステムによってインストールされるため、Mac OS、Windowsなどではパスが異なります。 mosquitto_pub
は、ルート証明書を使用して、Mosquittoサーバーの証明書がLet’sEncrypt認証局によって適切に署名されていることを確認します。 %の標準の安全なポートに接続している場合でも、mosquitto_pub
とmosquitto_sub
はこのオプション(または同様の--cafile
オプション)なしではSSL接続を試行しないことに注意することが重要です。 (t6)s。
すべてがテストに問題がなければ、hello againが他のmosquitto_sub
ターミナルに表示されます。 これは、サーバーが完全にセットアップされたことを意味します! MQTTプロトコルを拡張してWebソケットで動作するようにしたい場合は、最後の手順に従ってください。
[[step-4 -—- configuring-mqtt-over-websockets-optional]] ==ステップ4— MQTT Over Websocketsの設定(オプション)
Webブラウザ内からJavaScriptを使用してMQTTを話すために、プロトコルは標準のWebソケット上で動作するように適合されました。 この機能が必要ない場合は、この手順をスキップできます。
Mosquitto構成にもう1つのlistener
ブロックを追加する必要があります。
sudo nano /etc/mosquitto/conf.d/default.conf
ファイルの最後に、次を追加します。
/etc/mosquitto/conf.d/default.conf
. . .
listener 8083
protocol websockets
certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem
cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem
繰り返しになりますが、ファイルの最後に必ず末尾の改行を残してください。
これは、ポート番号とprotocol websockets
行を除いて、前のブロックとほとんど同じです。 WebSocketを介したMQTTの公式の標準化されたポートはありませんが、8083
が最も一般的です。
ファイルを保存して終了し、Mosquittoを再起動します。
sudo systemctl restart mosquitto
次に、ファイアウォールでポート8083
を開きます。
sudo ufw allow 8083
この機能をテストするには、ブラウザベースの公開MQTTクライアントを使用します。 そこにはいくつかありますが、Eclipse Paho JavaScript Clientはシンプルで簡単に使用できます。 Open the Paho client in your browser。 以下が表示されます。
接続情報を次のように入力します。
-
Hostは、Mosquittoサーバーのドメイン
mqtt.example.com
である必要があります。 -
Portは
8083
である必要があります。 -
ClientIdは、デフォルト値のjs-utility-DI1m6のままにしておくことができます。
-
Pathは、デフォルト値の/wsのままにしておくことができます。
-
UsernameはMosquittoのユーザー名である必要があります。ここでは、sammyを使用しました。
-
Passwordは選択したパスワードである必要があります。
残りのフィールドはデフォルト値のままにすることができます。
Connectを押すと、PahoブラウザベースのクライアントがMosquittoサーバーに接続します。
メッセージを公開するには、Publish Messageペインに移動し、Topicをtestとして入力し、Messageセクションにメッセージを入力します。 次に、Publishを押します。 メッセージはmosquitto_sub
ターミナルに表示されます。
結論
セキュリティで保護され、パスワードで保護され、SSLで保護されたMQTTサーバーをセットアップしました。 これは、どんなプロジェクトを考えても、堅牢で安全なメッセージングプラットフォームとして機能します。 MQTTプロトコルで適切に動作する一般的なソフトウェアとハードウェアには次のものがあります。
-
OwnTracks、携帯電話にインストールできるオープンソースの地理追跡アプリ。 OwnTracksは定期的に位置情報をMQTTサーバーに報告します。MQTTサーバーは、マップに保存して表示したり、位置に基づいてアラートを作成してIoTハードウェアをアクティブにしたりできます。
-
Node-REDは、モノのインターネットを「配線」するためのブラウザベースのグラフィカルインターフェイスです。 あるノードの出力を別のノードの入力にドラッグすると、フィルターを介して、さまざまなプロトコル間で、データベースなどに情報をルーティングできます。 MQTTはNode-REDで非常によくサポートされています。
-
ESP8266は、MQTT機能を備えた安価なwifiマイクロコントローラーです。 温度データをトピックに公開するために配線するか、気圧のトピックにサブスクライブして、嵐が来ているときにブザーを鳴らすことができます!
これらは、MQTTエコシステムの一般的な例のほんの一部です。 プロトコルを話すハードウェアとソフトウェアがはるかに多くあります。 お気に入りのハードウェアプラットフォームまたはソフトウェア言語を既にお持ちの場合は、MQTT機能を備えている可能性があります。 あなたの「もの」が互いに話し合うのを楽しんでください!