前書き

MQTTは、「モノのインターネット」デバイスへの軽量なパブリッシュ/サブスクライブ通信を提供するために設計されたマシンツーマシンメッセージングプロトコルです。 Mosquittoは人気のあるMQTTサーバー(またはMQTT用語では_broker_)であり、優れたコミュニティサポートがあり、インストールと構成が簡単です。

この要約クイックスタートチュートリアルでは、Mosquittoをインストールして設定し、Let’s Encrypt SSL証明書を使用してMQTTトラフィックを保護します。 手順のいずれかをさらに詳しく説明する必要がある場合は、次のチュートリアルを確認してください。

前提条件

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

ステップ1-ソフトウェアのインストール

最初に、カスタムソフトウェアリポジトリをインストールして、Certbotの最新バージョンであるLet’s Encryptクライアントを取得します。

sudo add-apt-repository ppa:certbot/certbot

`+ ENTER +`を押して受け入れ、MosquittoおよびCertbotのソフトウェアパッケージをインストールします。

sudo apt install certbot mosquitto mosquitto-clients

次に、SSL証明書を取得します。

ステップ2-SSL証明書のダウンロード

ファイアウォールでポート「80」を開きます:

sudo ufw allow 80

次に、Certbotを実行して証明書を取得します。 サーバーのドメイン名をここで必ず置き換えてください:

sudo certbot certonly --standalone --preferred-challenges http -d

メールアドレスを入力し、利用規約に同意するよう求められます。 そうすると、プロセスが正常に完了し、証明書が保存されている場所を示すメッセージが表示されます。

次に、これらの証明書を使用するようにMosquittoを構成します。

手順3-Mosquittoの構成

最初に、Mosquittoが接続の認証に使用するパスワードファイルを作成します。 これを行うには、 `+ mosquitto_passwd +`を使用し、自分の好みのユーザー名に置き換えてください:

sudo mosquitto_passwd -c /etc/mosquitto/passwd

パスワードの入力を2回求められます。

次に、Mosquittoの新しい構成ファイルを開きます。

sudo nano /etc/mosquitto/conf.d/default.conf

これにより、空のファイルが開きます。 以下に貼り付けます。

/etc/mosquitto/conf.d/default.conf

allow_anonymous false
password_file /etc/mosquitto/passwd

listener 1883 localhost

listener 8883
certfile /etc/letsencrypt/live//cert.pem
cafile /etc/letsencrypt/live//chain.pem
keyfile /etc/letsencrypt/live//privkey.pem

listener 8083
protocol websockets
certfile /etc/letsencrypt/live//cert.pem
cafile /etc/letsencrypt/live//chain.pem
keyfile /etc/letsencrypt/live//privkey.pem

ステップ2で使用したドメイン名を「++」に置き換えてください。 完了したら、ファイルを保存して閉じます。

このファイルは次のことを行います。

  • 匿名ログインを無効にする

  • パスワードファイルを使用してパスワード認証を有効にします

  • * localhost *専用のポート1883で保護されていないリスナーを設定します

  • ポート「8883」で安全なリスナーを設定します

  • ポート `+ 8083 +`で安全なwebsocketベースのリスナーを設定します

Mosquittoを再起動して、構成の変更を取得します。

sudo systemctl restart mosquitto

サービスが再び実行されていることを確認してください。

sudo systemctl status mosquitto
Output● mosquitto.service - LSB: mosquitto MQTT v3.1 message broker
  Loaded: loaded (/etc/init.d/mosquitto; generated)
  Active:  since Mon 2018-07-16 15:03:42 UTC; 2min 39s ago
    Docs: man:systemd-sysv-generator(8)
 Process: 6683 ExecStop=/etc/init.d/mosquitto stop (code=exited, status=0/SUCCESS)
 Process: 6699 ExecStart=/etc/init.d/mosquitto start (code=exited, status=0/SUCCESS)
   Tasks: 1 (limit: 1152)
  CGroup: /system.slice/mosquitto.service
          └─6705 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

ステータスは `+ active(running)+`でなければなりません。 そうでない場合は、構成ファイルを確認して再起動してください。 Mosquittoのログファイルには、さらにいくつかの情報があります。

sudo tail /var/log/mosquitto/mosquitto.log

すべてうまくいけば、 `+ ufw +`を使用して、2つの新しいポートがファイアウォールを通過できるようにします。

sudo ufw allow 8883
sudo ufw allow 8083

Mosquittoがセットアップされたので、証明書を更新した後にMosquittoを再起動するようにCertbotを構成します。

手順4-Certbotの更新の構成

Certbotは有効期限が切れる前にSSL証明書を自動的に更新しますが、そうするとMosquittoサービスを再起動するように指示する必要があります。

ドメイン名のCertbot更新構成ファイルを開きます。

sudo nano /etc/letsencrypt/renewal/.conf

最後の行に次の「+ renew_hook +」オプションを追加します。

/etc/letsencrypt/renewal/mqtt.example.com.conf

renew_hook = systemctl restart mosquitto

ファイルを保存して閉じ、Certbotのドライランを実行して、構文に問題がないことを確認します。

sudo certbot renew --dry-run

エラーが表示されなければ、設定は完了です。 次に、MQTTサーバーをテストしましょう。

ステップ5 – Mosquittoのテスト

手順1でいくつかのコマンドラインMQTTクライアントをインストールしました。 次のように、localhostリスナーの* test *トピックにサブスクライブできます。

mosquitto_sub -h localhost -t  -u "" -P ""

そして、 `+ mosquitto_pub +`で公開できます:

mosquitto_pub -h localhost -t  -m "" -u "" -P ""

ポート8883で保護されたリスナーを使用してサブスクライブするには、次の手順を実行します。

mosquitto_sub -h  -t  -p 8883 --capath /etc/ssl/certs/ -u "" -P ""

そして、これはセキュアなリスナーに公開する方法です:

mosquitto_pub -h  -t  -m "" -p 8883 --capath /etc/ssl/certs/ -u "" -P ""

`+ localhost `の代わりに完全なホスト名を使用していることに注意してください。 SSL証明書は「+」に対して発行されるため、「+ localhost」への安全な接続を試みると、ホスト名が証明書のホスト名と一致しないというエラーが表示されます。

Websocketの機能をテストするには、ブラウザーベースの公開MQTTクライアントを使用します。 https://www.eclipse.org/paho/clients/js/utility/ [ブラウザでEclipse Paho javascriptクライアントユーティリティを開きます]で、次のように接続情報を入力します。

  • *ホスト*はMosquittoサーバーのドメイン、「++」です

  • *ポート*は `+ 8083 +`です

  • * ClientId *はデフォルトのランダム化された値のままにすることができます

  • * Path は、デフォルト値 / ws *のままにすることができます

  • * Username *は、ステップ3のMosquittoユーザー名です。

  • * Password *は、ステップ3で選択したパスワードです

残りのフィールドはデフォルト値のままにすることができます。

接続*を押すと、クライアントはサーバーに接続します。 * Connection *ペインの下にある Subscribe および Publish Message *ペインを使用して、パブリッシュおよびサブスクライブできます。

結論

パスワードで保護され、SSLで暗号化された安全なMQTTサーバーをセットアップしてテストしました。 これは、IoT、ホームオートメーション、またはその他のプロジェクトの堅牢で安全なメッセージングプラットフォームとして機能します。