前書き
前提条件
このチュートリアルを開始する前に、次のものが必要です。
-
this Ubuntu 18.04 server setup tutorialで詳しく説明されているように、root以外のsudo対応ユーザーと基本的なファイアウォールが設定されたUbuntu18.04サーバー
-
サーバーを指すドメイン名。 このチュートリアルでは、全体でプレースホルダー
mqtt.example.com
を使用します -
サーバーではポート80を使用しないでください。 このポートを占有するWebサーバーを備えたマシンにMosquittoをインストールする場合は、Certbotのwebroot modeなど、別の方法を使用して証明書をフェッチする必要があります。
[[step-1 -—- installing-the-software]] ==ステップ1—ソフトウェアのインストール
まず、カスタムソフトウェアリポジトリをインストールして、Certbotの最新バージョンであるLet's Encryptクライアントを取得します。
sudo add-apt-repository ppa:certbot/certbot
ENTER
を押して受け入れ、MosquittoおよびCertbotのソフトウェアパッケージをインストールします。
sudo apt install certbot mosquitto mosquitto-clients
次に、SSL証明書を取得します。
[[step-2 -—- downloading-an-ssl-certificate]] ==ステップ2—SSL証明書のダウンロード
ファイアウォールでポート80
を開きます。
sudo ufw allow 80
次に、Certbotを実行して証明書を取得します。 サーバーのドメイン名をここで必ず置き換えてください:
sudo certbot certonly --standalone --preferred-challenges http -d mqtt.example.com
メールアドレスを入力し、利用規約に同意するよう求められます。 そうすると、プロセスが正常に完了し、証明書が保存されている場所を示すメッセージが表示されます。
次に、これらの証明書を使用するようにMosquittoを構成します。
[[step-3 -—- configuring-mosquitto]] ==ステップ3—Mosquittoの構成
最初に、Mosquittoが接続の認証に使用するパスワードファイルを作成します。 これを行うには、mosquitto_passwd
を使用します。必ず、自分の好みのユーザー名に置き換えてください。
sudo mosquitto_passwd -c /etc/mosquitto/passwd your-username
パスワードの入力を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/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
にセキュアリスナーを設定します -
ポート
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: 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のログファイルには、さらにいくつかの情報があります。
sudo tail /var/log/mosquitto/mosquitto.log
すべてが順調な場合は、ufw
を使用して、2つの新しいポートがファイアウォールを通過できるようにします。
sudo ufw allow 8883
sudo ufw allow 8083
Mosquittoがセットアップされたので、証明書を更新した後にMosquittoを再起動するようにCertbotを構成します。
[[step-4 -—- configuring-certbot-renewals]] ==ステップ4—Certbot更新の構成
Certbotは有効期限が切れる前にSSL証明書を自動的に更新しますが、そうするとMosquittoサービスを再起動するように指示する必要があります。
ドメイン名のCertbot更新構成ファイルを開きます。
sudo nano /etc/letsencrypt/renewal/mqtt.example.com.conf
最後の行に次のrenew_hook
オプションを追加します。
/etc/letsencrypt/renewal/mqtt.example.com.conf
renew_hook = systemctl restart mosquitto
ファイルを保存して閉じ、Certbotのドライランを実行して、構文に問題がないことを確認します。
sudo certbot renew --dry-run
エラーが表示されなければ、設定は完了です。 次に、MQTTサーバーをテストしましょう。
[[step-5 -–- testing-mosquitto]] ==ステップ5–Mosquittoのテスト
手順1でいくつかのコマンドラインMQTTクライアントをインストールしました。 次のように、ローカルホストリスナーでトピックtestをサブスクライブできます。
mosquitto_sub -h localhost -t test -u "your-user" -P "your-password"
そして、mosquitto_pub
で公開できます:
mosquitto_pub -h localhost -t test -m "hello world" -u "your-user" -P "your-password"
ポート8883で保護されたリスナーを使用してサブスクライブするには、次の手順を実行します。
mosquitto_sub -h mqtt.example.com -t test -p 8883 --capath /etc/ssl/certs/ -u "your-username" -P "your-password"
そして、これはセキュアなリスナーに公開する方法です:
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クライアントを使用します。 Open the Eclipse Paho javascript client utility in your browserを入力し、次のように接続情報を入力します。
-
Hostは、Mosquittoサーバーのドメインです。
mqtt.example.com
-
Portは
8083
です -
ClientIdはデフォルトのランダム化された値のままにすることができます
-
Pathはデフォルト値の/wsのままにしておくことができます
-
Usernameは、ステップ3のMosquittoユーザー名です。
-
Passwordは、手順3で選択したパスワードです。
残りのフィールドはデフォルト値のままにすることができます。
Connectを押すと、クライアントはサーバーに接続します。 Connectionペインの下にあるSubscribeおよびPublish Messageペインを使用して、パブリッシュおよびサブスクライブできます。
結論
パスワードで保護され、SSLで暗号化された安全なMQTTサーバーをセットアップしてテストしました。 これは、IoT、ホームオートメーション、またはその他のプロジェクトの堅牢で安全なメッセージングプラットフォームとして機能します。