Mosquittoは、メッセージキューテレメトリトランスポート( MQTT )を使用するオープンソースのメッセージブローカーです。 )プロトコル。このプロトコルは、モノのインターネット( IoT )に軽量の通信を提供するように設計されています )デバイス。これは、車両のGPS追跡、ホームオートメーション、環境センサー、および大規模なデータ収集に一般的に使用されます。
MQTTプロトコルは、TCP/IPモデル上で実行されます。軽量であるため、コードフットプリントが小さいため、最小限のリソースでデバイス用のアプリケーションを作成できます。パブリッシュ/サブスクライブモデルに依存しています。このモデルでは、クライアントはMosquittoサーバーに接続します。このサーバーは、チャネルにサブスクライブしている他のクライアントに情報を送信するブローカーとして機能します。
このチュートリアルでは、Mosquittoをインストールし、SSLを使用して通信を保護するようにブローカーを設定します。
- sudo権限を持つroot以外のユーザーがいるUbuntu20.04サーバー。
- ドメイン名(
myqtt.example.com
)サーバーを指さしました。
ステップ1-Mosquittoサーバーとクライアントをインストールします
Ubuntuには古い1.6バージョンのMosquittoが同梱されています。最新バージョンをインストールするには、公式のMosquittoリポジトリを追加します。
$ sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppa
Mosquittoサーバーとクライアントをインストールします。
$ sudo apt install mosquitto mosquitto-clients
サーバーのステータスを確認してください。
$ sudo systemctl status mosquitto ? mosquitto.service - Mosquitto MQTT Broker Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2022-01-25 09:18:40 UTC; 25s ago Docs: man:mosquitto.conf(5) man:mosquitto(8) Main PID: 119694 (mosquitto) Tasks: 1 (limit: 2274) Memory: 1.0M CGroup: /system.slice/mosquitto.service ??119694 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf Jan 25 09:18:39 <userid> systemd[1]: Starting Mosquitto MQTT Broker... Jan 25 09:18:40 <userid> systemd[1]: Started Mosquitto MQTT Broker.
ステップ2-MQTTパスワード認証を構成する
Mosquittoには、mosquitto_passwd
というパスワードファイルを生成するユーティリティが付属しています。 。 Mosquittoは、すべての構成を/etc/mosquitto
に保存します ディレクトリ。
次のコマンドを実行して、/etc/mosquitto/passwd
に暗号化されたパスワードファイルを生成します。 ユーザー名username
。選択したパスワードを入力してください。
$ sudo mosquitto_passwd -c /etc/mosquitto/passwd username Password: Reenter password:
次に、default.conf
を作成します /etc/mosquitto/conf.d
の下のファイル ディレクトリを開いて編集します。
$ sudo nano /etc/mosquitto/conf.d/default.conf
次の行を貼り付けて、パスワードファイルの場所を指定します。リスナーフィールドを省略すると、構成に関係なく、常に匿名で接続されます。
listener 1883 password_file /etc/mosquitto/passwd
Ctrl + Xを押してファイルを保存します Yと入力します プロンプトが表示されたら。
Mosquittoサーバーを再起動して、変更を実装します。
$ sudo systemctl restart mosquitto
ステップ3-Mosquittoクライアントをテストする
ユースケースに応じて、Mosquittoクライアントを使用して、さまざまなトピックに関するメッセージを送受信できます。クライアントはサブスクライバーまたはパブリッシャーのいずれかです。
次のステップは、トピックをサブスクライブすることです。 MQTTプロトコルでは、トピックとは、サーバー/ブローカーが接続されたクライアントのメッセージをフィルタリングするために使用する文字列を指します。ホームオートメーションアプリケーションで使用できるサンプルトピックを次に示します。
- home / lights / sitting_room
- 家/照明/キッチン
- home / lights / master_bedroom
- home / lights / kids_bedroom
トピックをサブスクライブするには、mosquitto_sub -t
を実行します コマンドの後にトピックが続きます。たとえば、home/lights/kitchen
に登録するには トピックについては、次のコマンドを実行してください。
$ mosquitto_sub -u username -P YOUR_PASSWORD -t "home/lights/kitchen"
既存のウィンドウを閉じないでください。新しいターミナルウィンドウを開いて、home/lights/kitchen
にメッセージを公開します 次のコマンドを使用してトピックを作成します。
$ mosquitto_pub -u username -P YOUR_PASSWORD -m "ON" -t "home/lights/kitchen"
最初のターミナルウィンドウに戻ると、ON
が表示されます ペイロード。
ON
次に、OFF
を送信します 2番目の端末からの同じトピックに関するメッセージ。
$ mosquitto_pub -u username -P YOUR_PASSWORD -m "OFF" -t "home/lights/kitchen"
最初の端末には、新しく公開されたメッセージが表示されます。
ON OFF
認証されていないコメントを送信しようとすると、失敗します。たとえば、次のコマンドを試してください。
$ mosquitto_sub -t "home/lights/sitting_room" Connection error: Connection Refused: not authorised.
推奨されていませんが、次の行を/etc/mosquitto/conf.d/default.conf
に追加する必要があります。 認証なしでコマンドを実行する場合はファイル。
allow_anonymous true
Let's Encryptを使用してSSL証明書をインストールするには、Certbotツールをダウンロードする必要があります。そのためにSnapdパッケージインストーラーを使用します。
Snapインストーラーをインストールします。
$ sudo apt install snapd
Snapdのバージョンが最新であることを確認してください。
$ sudo snap install core $ sudo snap refresh core
Certbotをインストールします。
$ sudo snap install --classic certbot
次のコマンドを使用して、/usr/bin
へのシンボリックリンクを作成することにより、Certbotコマンドが実行されるようにします。 ディレクトリ。
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
SSL証明書を生成します。
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d mqtt.example.com
上記のコマンドは、証明書を/etc/letsencrypt/live/mqtt.example.com
にダウンロードします。 サーバー上のディレクトリ。
Diffie-Hellmanグループを生成します 証明書。
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Let'sEncryptの自動更新用のチャレンジWebルートディレクトリを作成します。
$ sudo mkdir -p /var/lib/letsencrypt
Cronジョブを作成してSSLを更新します。証明書を確認し、必要に応じて更新するために毎日実行されます。そのためには、まず、ファイル/etc/cron.daily/certbot-renew
を作成します。 開いて編集します。
$ sudo nano /etc/cron.daily/certbot-renew
次のコードを貼り付けます。
#!/bin/sh certbot renew --cert-name mqtt.example.com --webroot -w /var/lib/letsencrypt/
Ctrl + Xを押してファイルを保存します Yと入力します プロンプトが表示されたら。
タスクファイルの権限を変更して実行可能にします。
$ sudo chmod +x /etc/cron.daily/certbot-renew
SSL証明書の準備ができたので、MosquittoにSSL証明書へのアクセスを提供する必要があります。このためには、Mosquittoが証明書にアクセスできる場所に証明書をコピーする必要があります。
$ sudo cp /etc/letsencrypt/live/mqtt.example.com/fullchain.pem /etc/mosquitto/certs/server.pem $ sudo cp /etc/letsencrypt/live/mqtt.example.com/privkey.pem /etc/mosquitto/certs/server.key
/etc/mosquitto/certs
の所有権を変更します mosquitto
へのディレクトリ インストール中に作成されたユーザー。
$ sudo chown mosquitto: /etc/mosquitto/certs
MosquittoのSSL暗号化を有効にする次のステップは、SSL証明書の場所を指定することです。編集のために構成ファイルを開きます。
$ sudo nano /etc/mosquitto/conf.d/default.conf
次のコードをファイルの最後に貼り付けます。
. . . listener 8883 certfile /etc/mosquitto/certs/server.pem cafile /etc/ssl/certs/ISRG_Root_X1.pem keyfile /etc/mosquitto/certs/server.key dhparamfile /etc/ssl/certs/dhparam.pem
Ctrl + Xを押してファイルを保存します Yと入力します プロンプトが表示されたら。ファイルの最後に必ず末尾の改行を残してください。
listener 8883
部分は暗号化されたリスナーを設定します。これは、MQTTSと呼ばれるMQTT+SSLの標準ポートです。次の4行は、SSLファイルの場所を指定します。
Mosquittoを再起動して、設定を更新します。
$ sudo systemctl restart mosquitto
ポート8883への接続を許可するには、ファイアウォールを更新する必要があります。
$ sudo ufw allow 8883
次に、mosquitto_pub
を使用して機能をテストする必要があります コマンド。
$ mosquitto_pub -h mqtt.example.com -t "home/lights/kitchen" -m "hello" -p 8883 --capath /etc/ssl/certs/ -u username -P YOUR_PASSWORD
ご覧のとおり、ポート番号やSSL証明書へのパスなど、特定の追加パラメーターが含まれています。 SSLを使用する必要がある場合は常に、完全なホスト名、つまりmqtt.example.com
を指定する必要があります。 localhost
の代わりに そうしないと、エラーが発生します。
--capath
も追加する必要があります 毎回ディレクティブ。これは、Mosquittoクライアントに、オペレーティングシステムによってインストールされたルート証明書を探すように指示します。
Certbotは、有効期限が切れる前に証明書を自動的に更新します。ただし、更新された証明書を/etc/mosquitto/certs
にコピーするように指示する必要があります。 ディレクトリを作成し、Mosquittoサービスを再起動します。
これを行うには、シェルスクリプトを作成します。ファイルmosquitto-copy.sh
を作成します /etc/letsencrypt/renewal-hooks/deploy
にあります ディレクトリ。
$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh
次のコードを貼り付けます。 MY_DOMAIN
の値を置き換えます ドメインによって異なります。 ${RENEWED_LINEAGE}
変数は/etc/letsencrypt/live/mqtt.example.com
を指します 更新中のディレクトリ。
# Set which domain this script will be run for MY_DOMAIN=mqtt.example.com # Set the directory that the certificates will be copied to. CERTIFICATE_DIR=/etc/mosquitto/certs if [ "${RENEWED_DOMAINS}" = "${MY_DOMAIN}" ]; then # Copy new certificate to Mosquitto directory cp ${RENEWED_LINEAGE}/fullchain.pem ${CERTIFICATE_DIR}/server.pem cp ${RENEWED_LINEAGE}/privkey.pem ${CERTIFICATE_DIR}/server.key # Set ownership to Mosquitto chown mosquitto: ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key # Ensure permissions are restrictive chmod 0600 ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key # Tell Mosquitto to reload certificates and configuration pkill -HUP -x mosquitto fi
Ctrl + Xを押してファイルを保存します Yと入力します プロンプトが表示されたら。
ファイルを実行可能にします。
$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh
このスクリプトは、証明書が正常に更新されるたびに自動的に実行されます。
MosquittoとNginxなどのWebサーバーを実行している場合は、更新前にサーバーを停止し、終了したらサーバーを再起動するようにCertbotに指示する必要があります。これを行うには、ファイルetc/letsencrypt/renewal/mqtt.example.com.conf
を開きます 。
$ sudo nano /etc/letsencrypt/renewal/mqtt.example.com.conf
ファイルの最後に次の行を追加します。使用しているWebサーバーに応じてコマンドを変更してください。
pre_hook = systemctl stop nginx post_hook = systemctl start nginx
Ctrl + Xを押してファイルを保存します Yと入力します プロンプトが表示されたら。
Certbotドライランを実行して確認します。
$ sudo certbot renew --dry-run
エラーが表示されない場合は、すべてが設定されていることを意味します。
Websocket機能を使用してJavascriptを使用し、ブラウザー内からMQTTプロトコルを使用するようにMosquittoを構成できます。有効にするには、構成ファイルを開きます。
$ sudo nano /etc/mosquitto/conf.d/default.conf
ファイルの最後に次の行を貼り付けます。
. . . listener 8083 protocol websockets certfile /etc/mosquitto/certs/server.pem cafile /etc/ssl/certs/ISRG_Root_X1.pem keyfile /etc/mosquitto/certs/server.key dhparamfile /etc/ssl/certs/dhparam.pem
Ctrl + Xを押してファイルを保存します Yと入力します プロンプトが表示されたら。
お気づきの方もいらっしゃると思いますが、ポート番号とプロトコルフィールドを除いて、SSLを有効にするために使用したブロックと同じです。 8083は、MQTTがWebSocketを使用して通信するために使用する最も一般的なポートです。
Mosquittoサービスを再起動します。
$ sudo systemctl restart mosquitto
ポート8083を開きます。
$ sudo ufw allow 8083
WebSocketの機能をテストするには、ブラウザーベースのMQTTクライアントを使用する必要があります。利用可能なクライアントはたくさんありますが、目的のためにHiveMQWebsocketクライアントを使用します。ブラウザでクライアントを起動すると、次のように表示されます。
上のスクリーンショットに示されているように、示されているようにフィールドに入力します。
- ホストは、Mosquittoサーバーのドメインmqtt.example.comである必要があります。
- ポートは8083である必要があります。
- ClientIDフィールドはそのままにしておくことができます。
- ユーザー名はMosquittoのユーザー名である必要があります。
- パスワードは、上記で作成したパスワードである必要があります。
- SSLを確認してください ボックス。
接続を押します ボタンをクリックすると、HiveMQクライアントがMosquittoサーバーに接続されます。
接続したら、home/lights/kitchen
と入力します トピックとして、メッセージを入力し、公開を押します 。
メッセージはmosquitto_sub
に表示されます 接続が成功したことを確認するターミナルウィンドウ。
これは、Websocketの実装が成功していることを示しています。
これで、Ubuntu 20.04ベースのマシンで、パスワードで保護され、SSLで暗号化された安全なMQTTサーバーのセットアップが完了しました。ご不明な点がございましたら、下のコメント欄に投稿してください。