Mosquitto là một trình môi giới tin nhắn nguồn mở sử dụng Giao thức truyền tải tin nhắn hàng đợi từ xa (MQTT). Giao thức này được thiết kế để cung cấp khả năng giao tiếp nhẹ đến các thiết bị Internet vạn vật (IoT). Giao thức này thường được sử dụng để theo dõi GPS của xe cộ, tự động hóa gia đình, cảm biến môi trường và thu thập dữ liệu quy mô lớn.
Giao thức MQTT chạy trên mô hình TCP/IP. Nhẹ, dấu chân mã nhỏ của giao thức này cho phép bạn tạo ứng dụng cho các thiết bị có tài nguyên tối thiểu. Giao thức này dựa trên mô hình xuất bản/đăng ký. Trong mô hình này, máy khách kết nối với máy chủ Mosquitto, hoạt động như một môi giới để gửi thông tin đến các máy khách khác đã đăng ký kênh.
Trong hướng dẫn này, bạn sẽ cài đặt Mosquitto và thiết lập môi giới để sử dụng SSL nhằm bảo vệ thông tin liên lạc.
Cài đặt máy chủ Mosquitto và máy khách.
Kiểm tra trạng thái của máy chủ.
Chạy lệnh sau để tạo tệp mật khẩu được mã hóa tại /etc/mosquitto/passwd cho tên người dùng username. Nhập mật khẩu theo lựa chọn của bạn.
Tiếp theo, tạo tệp default.conf trong thư mục /etc/mosquitto/conf.d và mở tệp đó để chỉnh sửa.
Dán các dòng sau để chỉ định vị trí của tệp mật khẩu. Nếu bạn bỏ qua trường listener, nó sẽ luôn kết nối ẩn danh, bất kể cấu hình.
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.
Khởi động lại máy chủ Mosquitto để triển khai thay đổi.
Bước tiếp theo là đăng ký một chủ đề. Trong giao thức MQTT, chủ đề đề cập đến một chuỗi được máy chủ/người môi giới sử dụng để lọc tin nhắn cho các máy khách được kết nối. Sau đây là một số chủ đề mẫu mà bạn có thể sử dụng trong ứng dụng tự động hóa nhà.
Không đóng cửa sổ hiện tại. Mở một cửa sổ terminal mới để đăng tin nhắn lên chủ đề home/lights/kitchen bằng lệnh sau.
Quay lại cửa sổ terminal đầu tiên và bạn sẽ nhận được tải trọng ON.
Tiếp theo, gửi tin nhắn OFF về cùng chủ đề từ terminal thứ hai.
Terminal đầu tiên sẽ hiển thị tin nhắn mới được xuất bản.
Nếu bạn cố gắng gửi bình luận chưa xác thực, bình luận đó sẽ không thành công. Ví dụ, hãy thử lệnh sau.
Không khuyến khích, nhưng bạn cần thêm dòng sau vào tệp /etc/mosquitto/conf.d/default.conf nếu bạn muốn chạy lệnh mà không cần xác thực.
Cài đặt trình cài đặt Snap.
Đảm bảo rằng phiên bản Snapd của bạn được cập nhật.
Cài đặt Certbot.
Sử dụng lệnh sau để đảm bảo rằng lệnh Certbot chạy bằng cách tạo liên kết tượng trưng đến thư mục /usr/bin.
Tạo chứng chỉ SSL.
Lệnh trên sẽ tải xuống chứng chỉ vào thư mục /etc/letsencrypt/live/mqtt.example.com trên máy chủ của bạn.
Tạo chứng chỉ nhóm Diffie-Hellman.
Tạo thư mục gốc web thử thách để tự động gia hạn Let's Encrypt.
Tạo Cron Job để gia hạn SSL. Nó sẽ chạy hàng ngày để kiểm tra chứng chỉ và gia hạn nếu cần. Để thực hiện việc đó, trước tiên, hãy tạo tệp /etc/cron.daily/certbot-renew và mở tệp đó để chỉnh sửa.
Dán mã sau.
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.
Thay đổi quyền trên tệp tác vụ để làm cho tệp đó có thể thực thi được.
Thay đổi quyền sở hữu thư mục /etc/mosquitto/certs thành người dùng mosquitto được tạo trong quá trình cài đặt.
Bước tiếp theo để bật mã hóa SSL cho Mosquitto là chỉ định vị trí của các chứng chỉ SSL. Mở tệp cấu hình để chỉnh sửa.
Dán mã sau vào cuối tệp.
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc. Đảm bảo để lại một dòng mới ở cuối tệp.
Phần listener 8883 thiết lập trình nghe được mã hóa. Đây là cổng chuẩn cho MQTT + SSL, được gọi là MQTTS. Bốn dòng tiếp theo chỉ định vị trí của các tệp SSL.
Khởi động lại Mosquitto để cập nhật cài đặt.
Bạn sẽ cần cập nhật tường lửa để cho phép kết nối đến cổng 8883.
Tiếp theo, chúng ta cần kiểm tra chức năng bằng lệnh mosquitto_pub.
Như bạn thấy, chúng tôi đã bao gồm một số tham số bổ sung, bao gồm số cổng và đường dẫn đến chứng chỉ SSL. Bất cứ khi nào bạn cần sử dụng SSL, bạn sẽ luôn phải chỉ định tên máy chủ đầy đủ, tức là mqtt.example.com thay vì localhost nếu không, nó sẽ báo lỗi.
Bạn cũng sẽ cần thêm chỉ thị --capath mỗi lần. Nó yêu cầu máy khách Mosquitto tìm kiếm các chứng chỉ gốc do hệ điều hành cài đặt.
Chúng ta sẽ thực hiện điều đó bằng cách tạo một tập lệnh shell. Tạo một tệp mosquitto-copy.sh trong thư mục /etc/letsencrypt/renewal-hooks/deploy.
Dán mã sau vào đó. Thay thế giá trị của biến MY_DOMAIN bằng tên miền của bạn. Biến ${RENEWED_LINEAGE} trỏ đến thư mục /etc/letsencrypt/live/mqtt.example.com trong quá trình gia hạn.
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.
Làm cho tệp có thể thực thi được.
Tập lệnh này sẽ tự động chạy sau mỗi lần gia hạn chứng chỉ thành công.
Nếu bạn đang chạy Mosquitto và máy chủ web như Nginx, bạn cần hướng dẫn Certbot dừng máy chủ trước khi gia hạn và khởi động lại sau khi hoàn tất. Để thực hiện việc đó, hãy mở tệp etc/letsencrypt/renewal/mqtt.example.com.conf.
Thêm các dòng sau vào cuối tệp. Thay đổi các lệnh cho phù hợp với máy chủ web bạn đang sử dụng.
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.
Chạy thử Certbot để xác minh.
Nếu bạn không thấy lỗi, nghĩa là mọi thứ đã được thiết lập.
Dán các dòng sau vào cuối tệp.
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.
Nếu bạn để ý, đây là cùng một khối với khối chúng ta đã sử dụng để bật SSL ngoại trừ trường số cổng và giao thức. 8083 là cổng phổ biến nhất được MQTT sử dụng để giao tiếp bằng WebSockets.
Khởi động lại dịch vụ Mosquitto.
Mở cổng 8083.
Chúng ta cần sử dụng một máy khách MQTT dựa trên trình duyệt để kiểm tra chức năng WebSockets. Có rất nhiều máy khách khả dụng, nhưng chúng ta sẽ sử dụng Máy khách HiveMQ Websocket cho mục đích của mình. Khởi chạy máy khách trong trình duyệt của bạn và bạn sẽ thấy thông tin sau.
Như được hiển thị trong ảnh chụp màn hình ở trên, hãy điền vào các trường như được hiển thị.
Sau khi kết nối, hãy nhập home/lights/kitchen làm chủ đề, nhập bất kỳ thông báo nào và nhấn Xuất bản.
Thông báo sẽ hiển thị trong cửa sổ thiết bị đầu cuối mosquitto_sub của bạn để xác nhận kết nối thành công.
Điều này cho thấy triển khai Websockets là thành công.
Giao thức MQTT chạy trên mô hình TCP/IP. Nhẹ, dấu chân mã nhỏ của giao thức này cho phép bạn tạo ứng dụng cho các thiết bị có tài nguyên tối thiểu. Giao thức này dựa trên mô hình xuất bản/đăng ký. Trong mô hình này, máy khách kết nối với máy chủ Mosquitto, hoạt động như một môi giới để gửi thông tin đến các máy khách khác đã đăng ký kênh.
Trong hướng dẫn này, bạn sẽ cài đặt Mosquitto và thiết lập môi giới để sử dụng SSL nhằm bảo vệ thông tin liên lạc.
Điều kiện tiên quyết
- Máy chủ Ubuntu 20.04 với người dùng không phải root có quyền sudo.
- Tên miền (myqtt.example.com) trỏ đến máy chủ của bạn.
Bước 1 - Cài đặt máy chủ và máy khách Mosquitto
Ubuntu đi kèm với phiên bản 1.6 cũ hơn của Mosquitto. Để cài đặt phiên bản mới nhất, hãy thêm kho lưu trữ Mosquitto chính thức.
Mã:
$ sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppa
Mã:
$ sudo apt install mosquitto mosquitto-clients
Mã:
$ sudo systemctl status mosquitto? mosquitto.service - Mosquitto MQTT Broker Đã tải: đã tải (/lib/systemd/system/mosquitto.service; đã bật; cài đặt trước của nhà cung cấp: đã bật) Đang hoạt động: đang hoạt động (đang chạy) kể từ Thứ Ba 2022-01-25 09:18:40 UTC; 25 giây trước Tài liệu: man:mosquitto.conf(5) man:mosquitto(8) PID chính: 119694 (mosquitto) Nhiệm vụ: 1 (giới hạn: 2274) Bộ nhớ: 1,0M CGroup: /system.slice/mosquitto.service ??119694 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf25 tháng 1 09:18:39 systemd[1]: Đang khởi động Mosquitto MQTT Broker...25 tháng 1 09:18:40 systemd[1]: Đã khởi động Mosquitto MQTT Broker.
Bước 2 - Cấu hình Xác thực mật khẩu MQTT
Mosquitto đi kèm với một tiện ích để tạo tệp mật khẩu có tên là mosquitto_passwd. Mosquitto lưu trữ tất cả các cấu hình trong thư mục /etc/mosquitto.Chạy lệnh sau để tạo tệp mật khẩu được mã hóa tại /etc/mosquitto/passwd cho tên người dùng username. Nhập mật khẩu theo lựa chọn của bạn.
Mã:
$ sudo mosquitto_passwd -c /etc/mosquitto/passwd usernameMật khẩu:Nhập lại mật khẩu:
Mã:
$ sudo nano /etc/mosquitto/conf.d/default.conf
Mã:
listener 1883password_file /etc/mosquitto/passwd
Khởi động lại máy chủ Mosquitto để triển khai thay đổi.
Mã:
$ sudo systemctl restart mosquitto
Bước 3 - Kiểm tra máy khách Mosquitto
Tùy thuộc vào trường hợp sử dụng, bạn có thể sử dụng máy khách Mosquitto để gửi và nhận tin nhắn về các chủ đề khác nhau. Máy khách có thể là người đăng ký hoặc người xuất bản.Bước tiếp theo là đăng ký một chủ đề. Trong giao thức MQTT, chủ đề đề cập đến một chuỗi được máy chủ/người môi giới sử dụng để lọc tin nhắn cho các máy khách được kết nối. Sau đây là một số chủ đề mẫu mà bạn có thể sử dụng trong ứng dụng tự động hóa nhà.
- home/lights/sitting_room
- home/lights/kitchen
- home/lights/master_bedroom
- home/lights/kids_bedroom
Mã:
$ mosquitto_sub -u username -P YOUR_PASSWORD -t "home/lights/kitchen"
Mã:
$ mosquitto_pub -u username -P YOUR_PASSWORD -m "ON" -t "home/lights/kitchen"
Mã:
ON
Mã:
$ mosquitto_pub -u username -P YOUR_PASSWORD -m "OFF" -t "home/lights/kitchen"
Mã:
ONOFF
Mã:
$ mosquitto_sub -t "home/lights/sitting_room"Lỗi kết nối: Kết nối bị từ chối: không được phép.
Mã:
allow_anonymous true
Bước 4 - Cài đặt SSL
Để cài đặt chứng chỉ SSL bằng Let's Encrypt, chúng ta cần tải xuống công cụ Certbot. Chúng tôi sẽ sử dụng trình cài đặt gói Snapd cho mục đích đó.Cài đặt trình cài đặt Snap.
Mã:
$ sudo apt install snapd
Mã:
$ sudo snap install core$ sudo snap refresh core
Mã:
$ sudo snap install --classic certbot
Mã:
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Mã:
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [emailprotected] -d mqtt.example.com
Tạo chứng chỉ nhóm Diffie-Hellman.
Mã:
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Mã:
$ sudo mkdir -p /var/lib/letsencrypt
Mã:
$ sudo nano /etc/cron.daily/certbot-renew
Mã:
#!/bin/shcertbot renew --cert-name mqtt.example.com --webroot -w /var/lib/letsencrypt/
Thay đổi quyền trên tệp tác vụ để làm cho tệp đó có thể thực thi được.
Mã:
$ sudo chmod +x /etc/cron.daily/certbot-renew
Bước 5 - Cấu hình MQTT SSL
Bây giờ chúng ta đã có chứng chỉ SSL, chúng ta cần cấp cho Mosquitto quyền truy cập vào chúng. Để thực hiện việc này, chúng ta cần sao chép các chứng chỉ vào một vị trí mà Mosquitto có thể truy cập chúng.
Mã:
$ 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
Mã:
$ sudo chown mosquitto: /etc/mosquitto/certs
Mã:
$ sudo nano /etc/mosquitto/conf.d/default.conf
Mã:
. . .listener 8883certfile /etc/mosquitto/certs/server.pemcafile /etc/ssl/certs/ISRG_Root_X1.pemkeyfile /etc/mosquitto/certs/server.keydhparamfile /etc/ssl/certs/dhparam.pem
Phần listener 8883 thiết lập trình nghe được mã hóa. Đây là cổng chuẩn cho MQTT + SSL, được gọi là MQTTS. Bốn dòng tiếp theo chỉ định vị trí của các tệp SSL.
Khởi động lại Mosquitto để cập nhật cài đặt.
Mã:
$ sudo systemctl restart mosquitto
Mã:
$ sudo ufw allow 8883
Mã:
$ mosquitto_pub -h mqtt.example.com -t "home/lights/kitchen" -m "hello" -p 8883 --capath /etc/ssl/certs/ -u username -P YOUR_PASSWORD
Bạn cũng sẽ cần thêm chỉ thị --capath mỗi lần. Nó yêu cầu máy khách Mosquitto tìm kiếm các chứng chỉ gốc do hệ điều hành cài đặt.
Bước 6 - Cấu hình gia hạn SSL
Certbot sẽ tự động gia hạn chứng chỉ của bạn trước khi hết hạn. Nhưng cần phải yêu cầu nó sao chép các chứng chỉ đã gia hạn vào thư mục /etc/mosquitto/certs và khởi động lại dịch vụ Mosquitto.Chúng ta sẽ thực hiện điều đó bằng cách tạo một tập lệnh shell. Tạo một tệp mosquitto-copy.sh trong thư mục /etc/letsencrypt/renewal-hooks/deploy.
Mã:
$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh
Mã:
# Đặt tên miền mà tập lệnh này sẽ chạy choMY_DOMAIN=mqtt.example.com# Đặt thư mục mà chứng chỉ sẽ được sao chép vào.CERTIFICATE_DIR=/etc/mosquitto/certsif [ "${RENEWED_DOMAINS}" = "${MY_DOMAIN}" ]; sau đó # Sao chép chứng chỉ mới vào thư mục Mosquitto cp ${RENEWED_LINEAGE}/fullchain.pem ${CERTIFICATE_DIR}/server.pem cp ${RENEWED_LINEAGE}/privkey.pem ${CERTIFICATE_DIR}/server.key # Đặt quyền sở hữu cho Mosquitto chown mosquitto: ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key # Đảm bảo quyền bị hạn chế chmod 0600 ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key # Yêu cầu Mosquitto tải lại chứng chỉ và cấu hình pkill -HUP -x mosquittofi
Làm cho tệp có thể thực thi được.
Mã:
$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh
Nếu bạn đang chạy Mosquitto và máy chủ web như Nginx, bạn cần hướng dẫn Certbot dừng máy chủ trước khi gia hạn và khởi động lại sau khi hoàn tất. Để thực hiện việc đó, hãy mở tệp etc/letsencrypt/renewal/mqtt.example.com.conf.
Mã:
$ sudo nano /etc/letsencrypt/renewal/mqtt.example.com.conf
Mã:
pre_hook = systemctl stop nginxpost_hook = systemctl start nginx
Chạy thử Certbot để xác minh.
Mã:
$ sudo certbot renew --dry-run
Bước 7 - Cấu hình Websockets
Bạn có thể cấu hình Mosquitto để sử dụng giao thức MQTT từ trong trình duyệt bằng Javascript bằng chức năng Websockets. Để bật tính năng này, hãy mở tệp cấu hình.
Mã:
$ sudo nano /etc/mosquitto/conf.d/default.conf
Mã:
. . .listener 8083protocol websocketscertfile /etc/mosquitto/certs/server.pemcafile /etc/ssl/certs/ISRG_Root_X1.pemkeyfile /etc/mosquitto/certs/server.keydhparamfile /etc/ssl/certs/dhparam.pem
Nếu bạn để ý, đây là cùng một khối với khối chúng ta đã sử dụng để bật SSL ngoại trừ trường số cổng và giao thức. 8083 là cổng phổ biến nhất được MQTT sử dụng để giao tiếp bằng WebSockets.
Khởi động lại dịch vụ Mosquitto.
Mã:
$ sudo systemctl restart mosquitto
Mã:
$ sudo ufw allow 8083
Như được hiển thị trong ảnh chụp màn hình ở trên, hãy điền vào các trường như được hiển thị.
- Máy chủ phải là tên miền của máy chủ Mosquitto của bạn, mqtt.example.com.
- Cổng phải là 8083.
- Trường ClientID có thể để nguyên.
- Tên người dùng phải là tên người dùng Mosquitto của bạn.
- Mật khẩu phải là mật khẩu bạn đã tạo ở trên.
- Đánh dấu vào ô SSL.
Sau khi kết nối, hãy nhập home/lights/kitchen làm chủ đề, nhập bất kỳ thông báo nào và nhấn Xuất bản.
Thông báo sẽ hiển thị trong cửa sổ thiết bị đầu cuối mosquitto_sub của bạn để xác nhận kết nối thành công.
Điều này cho thấy triển khai Websockets là thành công.