Mosquitto adalah broker pesan sumber terbuka yang menggunakan Transport Telemetri Antrian Pesan (MQTT ) Protokol. Protokol ini dirancang untuk menyediakan komunikasi ringan ke Internet of Things (IoT ) perangkat. Biasanya digunakan untuk pelacakan GPS kendaraan, otomatisasi rumah, sensor lingkungan, dan pengumpulan data skala besar.
Protokol MQTT berjalan di atas model TCP/IP. Menjadi ringan, jejak kodenya yang kecil memungkinkan Anda membuat aplikasi untuk perangkat dengan sumber daya minimal. Itu bergantung pada model terbitkan/berlangganan. Dalam model ini, klien terhubung ke server Mosquitto, yang bertindak sebagai perantara untuk mengirim informasi ke klien lain yang berlangganan saluran.
Dalam tutorial ini, Anda akan menginstal Mosquitto dan mengatur broker untuk menggunakan SSL untuk melindungi komunikasi.
Prasyarat
- Server Ubuntu 20.04 dengan pengguna non-root dengan hak istimewa sudo.
- Nama domain (
myqtt.example.com
) menunjuk ke server Anda.
Langkah 1 - Instal Server dan Klien Nyamuk
Ubuntu dikirimkan dengan Mosquitto versi 1.6 yang lebih lama. Untuk menginstal versi terbaru, tambahkan repositori resmi Mosquitto.
$ sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppa
Instal server Mosquitto dan klien.
$ sudo apt install mosquitto mosquitto-clients
Periksa status server.
$ sudo systemctl status mosquitto ? mosquitto.service - Mosquitto MQTT Broker Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2022-01-25 09:18:40 UTC; 25s ago Docs: man:mosquitto.conf(5) man:mosquitto(8) Main PID: 119694 (mosquitto) Tasks: 1 (limit: 2274) Memory: 1.0M CGroup: /system.slice/mosquitto.service ??119694 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf Jan 25 09:18:39 <userid> systemd[1]: Starting Mosquitto MQTT Broker... Jan 25 09:18:40 <userid> systemd[1]: Started Mosquitto MQTT Broker.
Langkah 2 - Konfigurasikan Otentikasi Kata Sandi MQTT
Mosquitto dilengkapi dengan utilitas untuk menghasilkan file kata sandi yang disebut mosquitto_passwd
. Mosquitto menyimpan semua konfigurasi di /etc/mosquitto
direktori.
Jalankan perintah berikut untuk menghasilkan file kata sandi terenkripsi di /etc/mosquitto/passwd
untuk nama pengguna username
. Masukkan kata sandi pilihan Anda.
$ sudo mosquitto_passwd -c /etc/mosquitto/passwd username Password: Reenter password:
Selanjutnya, buat default.conf
file di bawah /etc/mosquitto/conf.d
direktori dan buka untuk diedit.
$ sudo nano /etc/mosquitto/conf.d/default.conf
Tempel baris berikut untuk menentukan lokasi file kata sandi. Jika Anda menghilangkan bidang pendengar, itu akan selalu terhubung secara anonim, terlepas dari konfigurasinya.
listener 1883 password_file /etc/mosquitto/passwd
Simpan file dengan menekan Ctrl + X dan memasukkan Y saat diminta.
Mulai ulang server Mosquitto untuk menerapkan perubahan.
$ sudo systemctl restart mosquitto
Langkah 3 - Uji Klien Nyamuk
Tergantung pada kasus penggunaan, Anda dapat menggunakan klien Mosquitto untuk mengirim dan menerima pesan tentang topik yang berbeda. Klien adalah pelanggan atau penerbit.
Langkah selanjutnya adalah berlangganan topik. Dalam protokol MQTT, topik mengacu pada string yang digunakan oleh server/broker untuk memfilter pesan untuk klien yang terhubung. Berikut adalah beberapa contoh topik yang dapat Anda gunakan dalam aplikasi otomatisasi rumah.
- rumah/lampu/ruang duduk
- rumah/lampu/dapur
- rumah/lampu/kamar_master
- rumah/lampu/kamar tidur anak
Untuk berlangganan suatu topik, jalankan mosquitto_sub -t
perintah diikuti oleh topik. Misalnya, untuk berlangganan home/lights/kitchen
topik, jalankan perintah berikut.
$ mosquitto_sub -u username -P YOUR_PASSWORD -t "home/lights/kitchen"
Jangan tutup jendela yang ada. Buka jendela terminal baru untuk memublikasikan pesan ke home/lights/kitchen
topik menggunakan perintah berikut.
$ mosquitto_pub -u username -P YOUR_PASSWORD -m "ON" -t "home/lights/kitchen"
Kembali ke jendela terminal pertama, dan Anda akan menerima ON
muatan.
ON
Selanjutnya, kirim kode OFF
pesan tentang topik yang sama dari terminal kedua.
$ mosquitto_pub -u username -P YOUR_PASSWORD -m "OFF" -t "home/lights/kitchen"
Terminal pertama akan menampilkan pesan yang baru diterbitkan.
ON OFF
Jika Anda mencoba mengirim komentar yang tidak diautentikasi, itu akan gagal. Misalnya, coba perintah berikut.
$ mosquitto_sub -t "home/lights/sitting_room" Connection error: Connection Refused: not authorised.
Tidak disarankan, tetapi Anda perlu menambahkan baris berikut ke /etc/mosquitto/conf.d/default.conf
file jika Anda ingin menjalankan perintah tanpa otentikasi.
allow_anonymous true
Langkah 4 - Instal SSL
Untuk menginstal sertifikat SSL menggunakan Let's Encrypt, kita perlu mengunduh alat Certbot. Kami akan menggunakan penginstal paket Snapd untuk itu.
Instal penginstal Snap.
$ sudo apt install snapd
Pastikan versi Snapd Anda terbaru.
$ sudo snap install core $ sudo snap refresh core
Instal Certbot.
$ sudo snap install --classic certbot
Gunakan perintah berikut untuk memastikan bahwa perintah Certbot berjalan dengan membuat tautan simbolis ke /usr/bin
direktori.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Buat sertifikat SSL.
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d mqtt.example.com
Perintah di atas akan mengunduh sertifikat ke /etc/letsencrypt/live/mqtt.example.com
direktori di server Anda.
Buat grup Diffie-Hellman sertifikat.
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Buat direktori root web tantangan untuk pembaruan otomatis Let's Encrypt.
$ sudo mkdir -p /var/lib/letsencrypt
Buat Pekerjaan Cron untuk memperbarui SSL. Ini akan berjalan setiap hari untuk memeriksa sertifikat dan memperbarui jika diperlukan. Untuk itu, buat dulu file /etc/cron.daily/certbot-renew
dan buka untuk diedit.
$ sudo nano /etc/cron.daily/certbot-renew
Tempelkan kode berikut.
#!/bin/sh certbot renew --cert-name mqtt.example.com --webroot -w /var/lib/letsencrypt/
Simpan file dengan menekan Ctrl + X dan memasukkan Y saat diminta.
Ubah izin pada file tugas agar dapat dieksekusi.
$ sudo chmod +x /etc/cron.daily/certbot-renew
Langkah 5 - Konfigurasikan SSL MQTT
Sekarang setelah kita memiliki sertifikat SSL, kita perlu memberikan akses Mosquitto kepada mereka. Untuk ini, kita perlu menyalin sertifikat ke lokasi di mana Nyamuk dapat mengaksesnya.
$ sudo cp /etc/letsencrypt/live/mqtt.example.com/fullchain.pem /etc/mosquitto/certs/server.pem $ sudo cp /etc/letsencrypt/live/mqtt.example.com/privkey.pem /etc/mosquitto/certs/server.key
Ubah kepemilikan /etc/mosquitto/certs
direktori ke mosquitto
yang dibuat pengguna selama penginstalan.
$ sudo chown mosquitto: /etc/mosquitto/certs
Langkah selanjutnya untuk mengaktifkan enkripsi SSL untuk Nyamuk adalah menentukan lokasi sertifikat SSL. Buka file konfigurasi untuk diedit.
$ sudo nano /etc/mosquitto/conf.d/default.conf
Tempelkan kode berikut di akhir file.
. . . listener 8883 certfile /etc/mosquitto/certs/server.pem cafile /etc/ssl/certs/ISRG_Root_X1.pem keyfile /etc/mosquitto/certs/server.key dhparamfile /etc/ssl/certs/dhparam.pem
Simpan file dengan menekan Ctrl + X dan memasukkan Y ketika diminta. Pastikan untuk meninggalkan baris baru di akhir file.
listener 8883
bagian mengatur pendengar terenkripsi. Ini adalah port standar untuk MQTT + SSL, disebut sebagai MQTTS. Empat baris berikutnya menentukan lokasi file SSL.
Mulai ulang Mosquitto untuk memperbarui pengaturan.
$ sudo systemctl restart mosquitto
Anda perlu memperbarui firewall untuk mengizinkan koneksi ke port 8883.
$ sudo ufw allow 8883
Selanjutnya, kita perlu menguji fungsionalitas menggunakan mosquitto_pub
perintah.
$ mosquitto_pub -h mqtt.example.com -t "home/lights/kitchen" -m "hello" -p 8883 --capath /etc/ssl/certs/ -u username -P YOUR_PASSWORD
Seperti yang Anda lihat, kami telah menyertakan parameter tambahan tertentu, termasuk nomor port dan jalur ke sertifikat SSL. Kapan pun Anda perlu menggunakan SSL, Anda harus selalu menentukan nama host lengkap, yaitu mqtt.example.com
bukannya localhost
jika tidak, itu akan memberikan kesalahan.
Anda juga perlu menambahkan --capath
arahan setiap saat. Ini memberitahu klien Mosquitto untuk mencari sertifikat root yang diinstal oleh sistem operasi.
Langkah 6 - Konfigurasi Pembaruan SSL
Certbot akan secara otomatis memperbarui sertifikat Anda sebelum kedaluwarsa. Tetapi perlu diberitahu untuk menyalin sertifikat yang diperbarui ke /etc/mosquitto/certs
direktori dan mulai ulang layanan Mosquitto.
Kita akan melakukannya dengan membuat skrip shell. Buat file mosquitto-copy.sh
di /etc/letsencrypt/renewal-hooks/deploy
direktori.
$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh
Tempelkan kode berikut di dalamnya. Ganti nilai MY_DOMAIN
variabel dengan domain Anda. ${RENEWED_LINEAGE}
variabel menunjuk ke /etc/letsencrypt/live/mqtt.example.com
direktori selama pembaruan.
# Set which domain this script will be run for MY_DOMAIN=mqtt.example.com # Set the directory that the certificates will be copied to. CERTIFICATE_DIR=/etc/mosquitto/certs if [ "${RENEWED_DOMAINS}" = "${MY_DOMAIN}" ]; then # Copy new certificate to Mosquitto directory cp ${RENEWED_LINEAGE}/fullchain.pem ${CERTIFICATE_DIR}/server.pem cp ${RENEWED_LINEAGE}/privkey.pem ${CERTIFICATE_DIR}/server.key # Set ownership to Mosquitto chown mosquitto: ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key # Ensure permissions are restrictive chmod 0600 ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key # Tell Mosquitto to reload certificates and configuration pkill -HUP -x mosquitto fi
Simpan file dengan menekan Ctrl + X dan memasukkan Y saat diminta.
Jadikan file tersebut dapat dieksekusi.
$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh
Skrip ini akan dijalankan secara otomatis pada setiap perpanjangan sertifikat yang berhasil.
Jika Anda menjalankan Mosquitto dan server web seperti Nginx, Anda perlu menginstruksikan Certbot untuk menghentikan server sebelum memperbarui dan memulainya lagi setelah selesai. Untuk melakukannya, buka file etc/letsencrypt/renewal/mqtt.example.com.conf
.
$ sudo nano /etc/letsencrypt/renewal/mqtt.example.com.conf
Tambahkan baris berikut di akhir file. Ubah perintah sesuai dengan server web yang Anda gunakan.
pre_hook = systemctl stop nginx post_hook = systemctl start nginx
Simpan file dengan menekan Ctrl + X dan memasukkan Y saat diminta.
Jalankan uji kering Certbot untuk memverifikasi.
$ sudo certbot renew --dry-run
Jika Anda tidak melihat kesalahan, itu berarti semuanya sudah diatur.
Langkah 7 - Konfigurasi Websockets
Anda dapat mengonfigurasi Mosquitto untuk menggunakan protokol MQTT dari dalam browser menggunakan Javascript menggunakan fungsionalitas Websockets. Untuk mengaktifkannya, buka file konfigurasi.
$ sudo nano /etc/mosquitto/conf.d/default.conf
Tempel baris berikut di akhir file.
. . . listener 8083 protocol websockets certfile /etc/mosquitto/certs/server.pem cafile /etc/ssl/certs/ISRG_Root_X1.pem keyfile /etc/mosquitto/certs/server.key dhparamfile /etc/ssl/certs/dhparam.pem
Simpan file dengan menekan Ctrl + X dan memasukkan Y saat diminta.
Jika Anda perhatikan, itu adalah blok yang sama dengan yang kami gunakan untuk mengaktifkan SSL kecuali untuk nomor port dan bidang protokol. 8083 adalah port yang paling umum digunakan oleh MQTT untuk berbicara menggunakan WebSockets.
Mulai ulang layanan Mosquitto.
$ sudo systemctl restart mosquitto
Buka port 8083.
$ sudo ufw allow 8083
Kita perlu menggunakan klien MQTT berbasis browser untuk menguji fungsionalitas WebSockets. Ada banyak klien yang tersedia, tetapi kami akan menggunakan klien HiveMQ Websocket untuk tujuan kami. Luncurkan klien di browser Anda, dan Anda akan melihat yang berikut ini.
Seperti yang ditunjukkan pada tangkapan layar di atas, isi bidang seperti yang ditunjukkan.
- Host harus menjadi domain server Mosquitto Anda, mqtt.example.com.
- Port harus 8083.
- Bidang ID Klien dapat dibiarkan apa adanya.
- Nama pengguna harus nama pengguna Mosquitto Anda.
- Kata sandi harus berupa kata sandi yang Anda buat di atas.
- Periksa SSL kotak.
Tekan tombol Hubungkan dan klien HiveMQ akan terhubung ke server Mosquitto Anda.
Setelah terhubung, masukkan home/lights/kitchen
sebagai topik, masukkan pesan apa saja dan tekan Terbitkan .
Pesan akan muncul di mosquitto_sub
. Anda jendela terminal mengkonfirmasikan koneksi yang berhasil.
Ini menunjukkan bahwa implementasi Websockets berhasil.
Kesimpulan
Ini menyimpulkan penyiapan kami untuk server MQTT yang aman, dilindungi kata sandi, dan terenkripsi SSL pada mesin berbasis Ubuntu 20.04. Jika Anda memiliki pertanyaan, kirimkan di komentar di bawah.