序章

MQTT は、マシンツーマシンメッセージングプロトコルであり、「モノのインターネット」デバイスへの軽量のパブリッシュ/サブスクライブ通信を提供するように設計されています。 これは一般的に、車両の地理追跡、ホームオートメーション、環境センサーネットワーク、およびユーティリティ規模のデータ収集に使用されます。

Mosquitto は人気のあるMQTTサーバー(またはMQTT用語ではブローカー)であり、優れたコミュニティサポートを備えており、インストールと構成が簡単です。

このチュートリアルでは、Mosquittoをインストールし、Let’s EncryptからSSL証明書を取得し、SSLを使用してパスワードで保護されたMQTT通信を保護するようにブローカーを設定します。

前提条件

このチュートリアルを開始する前に、次のものが必要です。

  • ルート以外のsudo対応ユーザーと基本的なファイアウォールが設定されたCentOS7サーバー。 これ(およびそれ以上)はすべて新しいCentOS7サーバーチェックリストでカバーされています。
  • DigitalOcean を使用してホスト名を設定する方法に従って、サーバーを指すドメイン名。 このチュートリアルでは、 mqtt.example.com 全体を通して。
  • オプションで、 nano テキストエディタ。 このチュートリアルでは、 nano 全体に、いつでもインストールできます sudo yum -y install nano、またはお気に入りのテキストエディタに置き換えます。

ステップ1—Mosquittoのインストール

CentOS7には mosquitto デフォルトでパッケージ。 これをインストールするには、最初にEnterpriseLinux用のExtraPackages(EPEL)と呼ばれる追加のソフトウェアリポジトリをインストールします。 このリポジトリには、CentOS、Red Hat、およびその他のエンタープライズ指向のLinuxディストリビューションに適切にインストールされる追加のソフトウェアが満載です。

root以外のユーザーでログインし、 yum をインストールするパッケージマネージャー epel-release パッケージ。

  1. sudo yum -y install epel-release

これにより、EPELリポジトリ情報がシステムに追加されます。 The -y オプションは、プロセス全体でいくつかのプロンプトに自動的に「はい」と答えます。 これで、 mosquitto パッケージ。

  1. sudo yum -y install mosquitto

パッケージには単純なデフォルト構成が付属しているので、それを実行してインストールをテストしてみましょう。

  1. sudo systemctl start mosquitto

また、システムを再起動したときにサービスが確実に起動するように、サービスを有効にする必要があります。

  1. sudo systemctl enable mosquitto

次に、デフォルト構成をテストしてみましょう。 The mosquitto パッケージには、いくつかのコマンドラインMQTTクライアントが付属しています。 それらの1つを使用して、ブローカーのトピックをサブスクライブします。

トピックは、メッセージを公開およびサブスクライブするラベルです。 それらは階層として配置されているので、 sensors/outside/tempsensors/outside/humidity、 例えば。 トピックをどのように配置するかは、あなたとあなたのニーズ次第です。 このチュートリアル全体を通して、簡単なテストトピックを使用して構成の変更をテストします。

サーバーにもう一度ログインすると、2つの端末が並んでいます。 新しいターミナルでは、 mosquitto_sub テストトピックを購読するには:

  1. mosquitto_sub -h localhost -t test

-h MQTTサーバーのホスト名を指定するために使用されます。 -t トピック名です。 押した後、出力は表示されません ENTER なぜなら mosquitto_sub メッセージが到着するのを待っています。 他の端末に戻り、メッセージを公開します。

  1. mosquitto_pub -h localhost -t test -m "hello world"

のオプション mosquitto_pub と同じです mosquitto_sub、今回は追加のを使用しますが -m メッセージを指定するオプション。 打つ ENTER、他の端末に helloworldがポップアップ表示されるはずです。 最初のMQTTメッセージを送信しました。

入る CTRL+C 2番目のターミナルで終了します mosquitto_sub、ただし、サーバーへの接続は開いたままにします。 ステップ5の別のテストに再び使用します。

次に、新しいLet’s EncryptクライアントであるCertbotを使用して、SSLでインストールを保護します。

ステップ2—Let’sEncrypt証明書用のCertbotのインストールと実行

Let’s Encryptは、自動化されたAPIを介して無料のSSL証明書を提供する新しいサービスです。 公式のLet’sEncryptクライアントはCertbotと呼ばれ、前の手順でインストールしたEPELリポジトリに含まれています。

でCertbotをインストールします yum.

  1. sudo yum -y install certbot

Certbotは、ドメインを制御していることを証明するために、Let’sEncryptAPIによって発行された暗号化の課題に答える必要があります。 ポートを使用します 80 (HTTP)および/または 443 (HTTPS)これを実現します。 ポートのみを使用します 80、それでは、そのポートでの着信トラフィックを許可しましょう。

使用する firewall-cmd HTTPサービスを追加します。

  1. sudo firewall-cmd --permanent --add-service=http

ファイアウォールをリロードして、変更を有効にします。

  1. sudo firewall-cmd --reload

これで、Certbotを実行して証明書を取得できます。 を使用します --standalone CertbotにHTTPチャレンジリクエストを独自に処理するように指示するオプション、および --standalone-supported-challenges http-01 ポートへの通信を制限します 80. -d 証明書が必要なドメインを指定するために使用され、 certonly 他の構成手順を実行せずに証明書を取得するようにCertbotに指示します。

  1. sudo certbot certonly --standalone --standalone-supported-challenges http-01 -d mqtt.example.com

コマンドを実行すると、電子メールアドレスを入力し、利用規約に同意するように求められます。 そうすると、プロセスが成功し、証明書がどこに保存されているかを示すメッセージが表示されます。

証明書を持っています。 次に、Certbotが期限切れになりそうになったときに自動的に更新するようにする必要があります。

ステップ3—Certbot自動更新の設定

Let’s Encryptの証明書は、90日間のみ有効です。 これは、ユーザーが証明書の更新プロセスを自動化することを奨励するためです。 定期的に実行するコマンドを設定して、期限切れの証明書を確認し、それらを自動的に更新する必要があります。

毎日更新チェックを実行するには、 cron、定期的なジョブを実行するための標準的なシステムサービス。 教えて cron と呼ばれるファイルを開いて編集することによって何をすべきか crontab.

  1. sudo EDITOR=nano crontab -e

EDITOR=nano crontabファイルをで開きます nano 編集者。 デフォルトを使用する場合は、オフのままにします vi 編集者。

これで、デフォルトが表示されます。 crontab、空白のファイル。 次の行に貼り付けて、ファイルを保存して閉じます。

crontab
15 3 * * * certbot renew --noninteractive --post-hook "systemctl restart mosquitto"

The 15 3 * * * この行の一部は、「毎日午前3時15分に次のコマンドを実行する」ことを意味します。 The renew Certbotのコマンドは、システムにインストールされているすべての証明書をチェックし、30日以内に期限切れになるように設定されている証明書を更新します。 --noninteractive ユーザー入力を待たないようにCertbotに指示します。

--post-hook "systemctl restart mosquitto" Mosquittoを再起動して新しい証明書を取得しますが、証明書が更新された場合に限ります。

証明書の自動更新がすべて設定されたので、Mosquittoのより安全な構成に戻ります。

ステップ4—MQTTパスワードの設定

パスワードを使用するようにMosquittoを構成しましょう。 Mosquittoには、と呼ばれる特別なパスワードファイルを生成するユーティリティが含まれています mosquitto_passwd. このコマンドは、指定されたユーザー名のパスワードを入力するように求め、結果を /etc/mosquitto/passwd.

  1. sudo mosquitto_passwd -c /etc/mosquitto/passwd sammy

次に、デフォルトの構成ファイルを置き換え、すべての接続にログインを要求するためにこのパスワードファイルを使用するようにMosquittoに指示します。 まず、既存のものを削除します mosquitto.conf.

  1. sudo rm /etc/mosquitto/mosquitto.conf

次に、新しい空白の構成を開きます。

  1. sudo nano /etc/mosquitto/mosquitto.conf

以下に貼り付けます。

/etc/mosquitto/mosquitto.conf
allow_anonymous false
password_file /etc/mosquitto/passwd

allow_anonymous false 認証されていないすべての接続を無効にし、 password_file 行は、ユーザーとパスワードの情報を探す場所をMosquittoに指示します。 ファイルを保存して終了します。

次に、Mosquittoを再起動して、変更をテストする必要があります。

  1. sudo systemctl restart mosquitto

パスワードなしでメッセージを公開してみてください。

  1. mosquitto_pub -h localhost -t "test" -m "hello world"

メッセージは拒否する必要があります:

Output
Connection Refused: not authorised. Error: The connection was refused.

パスワードで再試行する前に、2番目のターミナルウィンドウに再度切り替えて、今回はユーザー名とパスワードを使用して「テスト」トピックにサブスクライブします。

  1. mosquitto_sub -h localhost -t test -u "sammy" -P "password"

接続して座って、メッセージを待つ必要があります。 テストメッセージを定期的に送信するため、チュートリアルの残りの部分では、この端末を開いたまま接続したままにしておくことができます。

次に、ユーザー名とパスワードを使用して、他の端末でメッセージを公開します。

  1. mosquitto_pub -h localhost -t "test" -m "hello world" -u "sammy" -P "password"

メッセージはステップ1のように通過するはずです。 Mosquittoにパスワード保護を追加しました。 残念ながら、インターネットを介して暗号化されていないパスワードを送信しています。 次に、SSL暗号化をMosquittoに追加して修正します。

ステップ5—MQTTSSLの構成

SSL暗号化を有効にするには、Let’sEncrypt証明書が保存されている場所をMosquittoに通知する必要があります。 以前に開始した構成ファイルを開きます。

  1. sudo nano /etc/mosquitto/mosquitto.conf

ファイルの最後に次のように貼り付けて、すでに追加した2行を残します。

/etc/mosquitto/mosquitto.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、ポートのデフォルトのMQTTリスナーを更新します 1883、これまで接続してきたものです。 1883 標準の暗号化されていないMQTTポートです。 The localhost 行の一部は、このポートをローカルホストインターフェイスにのみバインドするようにMosquittoに指示しているため、外部からアクセスすることはできません。 とにかく外部リクエストはファイアウォールによってブロックされていたでしょうが、明示的にするのは良いことです。

listener 8883 ポートに暗号化されたリスナーを設定します 8883. これはMQTT+SSLの標準ポートであり、MQTTSと呼ばれることもあります。 次の3行、 certfile, cafile、 と keyfile、すべてMosquittoが適切なLet’s Encryptファイルをポイントして、暗号化された接続を設定します。

ファイルを保存して終了します。

Mosquittoを再起動して新しい構成をロードする前に、デフォルトで1つ修正する必要があります mosquitto サービスファイル。 これは systemd 実行方法を決定するために使用します mosquitto. お気に入りのエディターで開きます。

  1. sudo nano /etc/systemd/system/multi-user.target.wants/mosquitto.service

次のような行を探します User=mosquitto それを削除してから、ファイルを保存して終了します。

Mosquittoは引き続きmosquittoユーザーとして実行されますが、最初に起動したときは root 権限があり、Let’s Encrypt証明書([ X206X] root アクセス、セキュリティ上の理由から)。 証明書をロードすると、mosquittoユーザーにドロップダウンします。

リロードする必要があります systemd それ自体が、サービスファイルに加えた変更に気づきます。

  1. sudo systemctl daemon-reload

これで、Mosquittoを再起動して設定を更新できます。

  1. sudo systemctl restart mosquitto

ポートへの接続を許可するようにファイアウォールを更新します 8883.

  1. sudo firewall-cmd --permanent --add-port=8883/tcp

そしてファイアウォールをリロードします。

  1. sudo firewall-cmd --reload

次に、を使用して再度テストします mosquitto_pub、SSLのいくつかの異なるオプションがあります。

  1. mosquitto_pub -h mqtt.example.com -t test -m "hello again" -p 8883 --cafile /etc/ssl/certs/ca-bundle.crt -u "sammy" -P "password"

代わりに完全なホスト名を使用していることに注意してください localhost. SSL証明書が発行されているため mqtt.example.com、への安全な接続を試みる場合 localhost ホスト名が証明書のホスト名と一致しないというエラーが表示されます(両方が同じMosquittoサーバーを指している場合でも)。

--cafile /etc/ssl/certs/ca-bundle.crt のSSLを有効にします mosquitto_pub、およびルート証明書を探す場所を指示します。 これらは通常、オペレーティングシステムによってインストールされるため、Mac OS、Windowsなどではパスが異なります。 mosquitto_pub ルート証明書を使用して、Mosquittoサーバーの証明書がLet’sEncrypt認証局によって適切に署名されていることを確認します。 注意することが重要です mosquitto_pubmosquitto_sub このオプション(または同様のオプション)がないとSSL接続を試行しません --capath オプション)、標準の安全なポートに接続している場合でも 8883.

テストがすべてうまくいけば、こんにちはがもう一方に表示されます mosquitto_sub ターミナル。 これは、サーバーが完全にセットアップされていることを意味します。 MQTTプロトコルを拡張してWebSocketで動作するようにする場合は、最後の手順に従うことができます。

ステップ6— Websocketを介したMQTTの構成(オプション)

Webブラウザ内からJavaScriptを使用してMQTTを話すために、プロトコルは標準のWebSocketで機能するように調整されました。 この機能が必要ない場合は、この手順をスキップできます。

もう1つ追加する必要があります listener Mosquitto構成にブロックします。

  1. sudo nano /etc/mosquitto/mosquitto.conf

ファイルの最後に、以下を追加します。

/etc/mosquitto/mosquitto.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を再起動します。

  1. sudo systemctl restart mosquitto

今、ポートを開きます 8083 ファイアウォールで。

  1. sudo firewall-cmd --permanent --add-port=8083/tcp

そして、ファイアウォールをもう一度リロードします。

  1. sudo firewall-cmd --reload

この機能をテストするために、パブリックなブラウザーベースのMQTTクライアントを使用します。 そこにはいくつかありますが、mqtt-adminはシンプルで簡単です。 ブラウザでmqtt-adminを開きます。 次のように表示されます。

次のように接続情報を入力します。

  • プロトコルwss w eb s ocket s ecureの略)である必要があります。
  • Host は、Mosquittoサーバーのドメインである必要があります。 mqtt.example.com.
  • ポート8083.
  • UserはMosquittoのユーザー名である必要があります。 ここでは、sammyを使用しました。
  • Password は、選択したパスワードである必要があります。
  • ClientIdはデフォルト値のmqtt-adminのままにしておくことができます。

設定の保存を押した後、 mqtt-admin Mosquittoサーバーに接続します。 次の画面で、トピックテストと入力し、ペイロードのメッセージを入力して、公開を押します。 メッセージはに表示されます mosquitto_sub ターミナル。

結論

Let’s EncryptサービスからのSSL証明書を自動更新することで、パスワードで保護された安全なMQTTサーバーをセットアップしました。 これは、あなたが夢見ているどんなプロジェクトに対しても、堅牢で安全なメッセージングプラットフォームとして機能します。 MQTTプロトコルでうまく機能する一般的なソフトウェアとハードウェアには次のものがあります。

  • OwnTracks 、携帯電話にインストールできるオープンソースの地理追跡アプリ。 OwnTracksは定期的に位置情報をMQTTサーバーに報告します。これを保存して地図に表示したり、アラートを作成して場所に基づいてIoTハードウェアをアクティブ化したりできます。
  • Node-RED は、モノのインターネットを「配線」するためのブラウザベースのグラフィカルインターフェイスです。 あるノードの出力を別のノードの入力にドラッグすると、フィルターを介して、さまざまなプロトコル間で、データベースなどに情報をルーティングできます。 MQTTはNode-REDによって非常によくサポートされています。
  • ESP8266 は、MQTT機能を備えた安価なwifiマイクロコントローラーです。 温度データをトピックに公開するために1つを接続するか、気圧トピックをサブスクライブして、嵐が来たときにブザーを鳴らすことができます。

これらは、MQTTエコシステムからのいくつかの人気のある例です。 プロトコルを話すハードウェアとソフトウェアはもっとたくさんあります。 お気に入りのハードウェアプラットフォームまたはソフトウェア言語がすでにある場合は、おそらくMQTT機能があります。 あなたの「もの」がお互いに話し合うのを楽しんでください!