序章

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

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

前提条件

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

  • このUbuntu18.04サーバーセットアップチュートリアルで詳しく説明されているように、root以外のsudo対応ユーザーと基本的なファイアウォールがセットアップされたUbuntu18.04サーバー
  • サーバーを指すドメイン名。 このチュートリアルでは、プレースホルダーを使用します mqtt.example.com 全体を通して
  • ポート80はサーバーで使用されていない必要があります。 このポートを占有するWebサーバーを備えたマシンにMosquittoをインストールする場合は、Certbotの webrootモードなど、別の方法を使用して証明書をフェッチする必要があります。

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

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

  1. sudo add-apt-repository ppa:certbot/certbot

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

  1. sudo apt install certbot mosquitto mosquitto-clients

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

ステップ2—SSL証明書をダウンロードする

ポートを開く 80 ファイアウォール内:

  1. sudo ufw allow 80

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

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

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

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

ステップ3—Mosquittoの構成

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

  1. sudo mosquitto_passwd -c /etc/mosquitto/passwd your-username

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

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

  1. 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/mqtt.example.com/cert.pem
cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem

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

手順2で使用したドメイン名を必ず置き換えてください mqtt.example.com. 終了したら、ファイルを保存して閉じます。

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

  • 匿名ログインを無効にします
  • パスワードファイルを使用してパスワード認証を有効にする
  • localhostのみのポート1883にセキュリティで保護されていないリスナーを設定します
  • ポートにセキュアリスナーを設定します 8883
  • ポートに安全なWebSocketベースのリスナーを設定します 8083

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

  1. sudo systemctl restart mosquitto

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

  1. sudo systemctl status mosquitto
Output
● mosquitto.service - LSB: mosquitto MQTT v3.1 message broker Loaded: loaded (/etc/init.d/mosquitto; generated) Active: active (running) 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のログファイルには、さらにいくつかの情報が記載されている場合があります。

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

すべてが順調な場合は、 ufw 2つの新しいポートがファイアウォールを通過できるようにするには:

  1. sudo ufw allow 8883
  2. sudo ufw allow 8083

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

ステップ4—Certbot更新の構成

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

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

  1. sudo nano /etc/letsencrypt/renewal/mqtt.example.com.conf

以下を追加します renew_hook 最後の行のオプション:

/etc/letsencrypt/renewal/mqtt.example.com.conf
renew_hook = systemctl restart mosquitto

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

  1. sudo certbot renew --dry-run

エラーが表示されない場合は、すべて設定されています。 次に、MQTTサーバーをテストしてみましょう。

ステップ5–モスキートのテスト

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

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

そして、私たちはで公開することができます mosquitto_pub:

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

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

  1. mosquitto_sub -h mqtt.example.com -t test -p 8883 --capath /etc/ssl/certs/ -u "your-username" -P "your-password"

そして、これはあなたが安全なリスナーに公開する方法です:

  1. mosquitto_pub -h mqtt.example.com -t test -m "hello world" -p 8883 --capath /etc/ssl/certs/ -u "your-username" -P "your-password"

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

WebSocketの機能をテストするために、ブラウザーベースのパブリックMQTTクライアントを使用します。 ブラウザでEclipsePahojavascriptクライアントユーティリティを開き、次のように接続情報を入力します。

  • Host は、Mosquittoサーバーのドメインです。 mqtt.example.com
  • ポート8083
  • ClientIdはデフォルトのランダム化された値のままにすることができます
  • Pathはデフォルト値の/wsのままにしておくことができます
  • ユーザー名は、ステップ3のMosquittoユーザー名です。
  • Password は、ステップ3で選択したパスワードです。

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

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

結論

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