MQTTブローカーである mosquitto をインストールしてみます。インターネット上に見えるMQTTブローカーなので、SSLでの暗号化と接続のための何らかの認証を導入します。
本来ならば、クライアントの正当性を認証するところまでやるべきなのですが、1クライントごとに証明書を生成して管理する必要が出てきます。趣味の世界でそこまでやると大変なので、MQTTブローカーに接続する際にパスワード認証を行うレベルにとどめました。
こちらの記事を参考にしました。
mosquittoのインストール
以下の手順でインストールしていきます。
root@i-xxxxxxxx:/etc/nginx/sites-available# apt install mosquitto mosquitto-clients
mosquittoが接続の認証に使用するパスワードファイルを作成します。
root@i-xxxxxxxx:/etc/mosquitto# mosquitto_passwd -c /etc/mosquitto/passwd (ユーザー名)
以下の内容で mosquitto の設定ファイル /etc/mosquitto/conf.d/default.conf を作成します。(※mosquittoでLet’s Encryptの証明書を使うと、2ヶ月に一度証明書が更新されるたびにファームウェアを修正する必要が出てきます。後日こちらの記事でMQTTについてはオレオレ証明書を使うように設定変更しています。)
allow_anonymous false password_file /etc/mosquitto/passwd listener 1883 localhost listener 8883 certfile /etc/letsencrypt/live/example.com/cert.pem cafile /etc/letsencrypt/live/example.com/chain.pem keyfile /etc/letsencrypt/live/example.com/privkey.pem listener 8083 protocol websockets certfile /etc/letsencrypt/live/example.com/cert.pem cafile /etc/letsencrypt/live/example.com/chain.pem keyfile /etc/letsencrypt/live/example.com/privkey.pem
mosquitto を再起動することで、設定ファイルを適用した状態で active 状態であることを確認します。
root@i-xxxxxxxx:/etc/mosquitto# systemctl restart mosquitto root@i-xxxxxxxx:/etc/mosquitto# systemctl status mosquitto ● mosquitto.service - LSB: mosquitto MQTT v3.1 message broker Loaded: loaded (/etc/init.d/mosquitto; generated) Active: active (exited) since Sun 2020-08-02 21:30:06 UTC; 12s ago Docs: man:systemd-sysv-generator(8) Process: 32035 ExecStop=/etc/init.d/mosquitto stop (code=exited, status=0/SUCCESS) Process: 32041 ExecStart=/etc/init.d/mosquitto start (code=exited, status=0/SUCCESS) Aug 02 21:30:06 i-xxxxxxxx systemd[1]: Stopped LSB: mosquitto MQTT v3.1 message broker. Aug 02 21:30:06 i-xxxxxxxx systemd[1]: mosquitto.service: Found left-over process 31814 (mosquitto) in contro Aug 02 21:30:06 i-xxxxxxxx systemd[1]: This usually indicates unclean termination of a previous run, or servi Aug 02 21:30:06 i-xxxxxxxx systemd[1]: Starting LSB: mosquitto MQTT v3.1 message broker... Aug 02 21:30:06 i-xxxxxxxx mosquitto[32041]: * Starting network daemon: mosquitto Aug 02 21:30:06 i-xxxxxxxx mosquitto[32041]: ...done. Aug 02 21:30:06 i-xxxxxxxx systemd[1]: Started LSB: mosquitto MQTT v3.1 message broker.
ファイアウォールの設定を変更して穴あけをします。
root@i-xxxxxxxx:/etc/mosquitto# ufw allow 8883 root@i-xxxxxxxx:/etc/mosquitto# ufw allow 8083
証明書自動更新時にmosquittoを再起動するよう設定します。/etc/letsencrypt/renewal/example.com.conf を編集して、最後の行に以下の内容を付け加えます。
# Autorestart for mosquitto renew_hook = systemctl restart mosquitto
ドライランで構文チェックを行います。
root@i-xxxxxxxx:/etc/letsencrypt/renewal# certbot renew --dry-run
クライアントからは以下の方法でテストできます。
サブスクライブ(購読)は以下の通りです。上は localhost 限定。下はSSL接続の場合。
ubuntu@i-xxxxxxxx:~$ mosquitto_sub -h localhost -t test -u (ユーザー名) -P (パスワード) ubuntu@i-xxxxxxxx:~$ mosquitto_sub -h example.com -t test -p 8883 --capath /etc/ssl/certs/ -u (ユーザー名) -P (パスワード)
パブリッシュは以下の通りです。上は localhost 限定。下はSSL接続の場合。
ubuntu@i-xxxxxxxx:~$ mosquitto_pub -h localhost -t test -m "TEST MESSAGE" -u (ユーザー名) -P (パスワード) ubuntu@i-xxxxxxxx:~$ mosquitto_pub -h exmple.com -t test -p 8883 --capath /etc/ssl/certs/ -m "SSL TEST MESSAGE" -u (ユーザー名) -P (パスワード)
以上で他のLinuxマシンからの MQTT over SSL で接続できるようになりました。