Linux主機部署MQTT服務器
MQTT是一種機器到機器的消息傳遞協議,旨在為“物聯網”設備提供輕量級的發布/訂閱通信。Mosquitto是一種流行的MQTT服務器(或MQTT中的代理),具有出色的社區支持,易於安裝和配置。
在本篇教程中,我們將安裝和配置Mosquitto,並使用Let的加密SSL證書來保護我們的MQTT流量。
安裝軟件
首先,我們將安裝一個自定義軟件存儲庫以獲取最新版本的Certbot,即Let的加密客戶端:
sudo add-apt-repository ppa:certbot/certbot
按ENTER了
接受,然后安裝Mosquitto和Certbot的軟件包:
sudo apt install certbot mosquitto mosquitto-clients
接下來我們將獲取SSL證書。
下載SSL證書
打開防火牆中的端口80
:
# Ubuntu
sudo ufw allow 80
#Centos7
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
# iptables防火牆
iptables -I INPUT 1 -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
service iptables save
然后運行Certbot以獲取證書。請務必在此處替換您服務器的域名:
sudo certbot certonly --standalone --preferred-challenges http -d mqtt.example.com
系統將提示您輸入電子郵件地址並同意服務條款。執行此操作后,您應該會看到一條消息,告訴您進程是否成功以及您的證書存儲在何處。
我們接下來將Mosquitto配置為使用這些證書。
配置Mosquitto
首先,我們將創建一個Mosquitto將用於驗證連接的密碼文件。使用mosquitto_passwd
來創建這個文件,請確保使用你喜歡的用戶名替換它:
sudo mosquitto_passwd -c /etc/mosquitto/passwd your-username
系統將提示您輸入兩次密碼。
現在為Mosquitto打開一個新的配置文件:
sudo nano /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
。完成后保存並關閉文件。
該文件執行以下操作:
- 禁用匿名登錄
- 使用我們的密碼文件啟用密碼驗證
- 僅在端口1883上為localhost設置不安全的偵聽器
- 在端口
8883
上設置安全偵聽器 - 在端口
8083
上設置基於websocket的安全偵聽器
重啟Mosquitto以獲取配置更改:
sudo systemctl restart mosquitto
檢查以確保服務再次運行:
sudo systemctl status mosquitto
● 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
允許兩個新端口通過防火牆:
sudo ufw allow 8883
sudo ufw allow 8083
現在已經建立了Mosquitto,我們將在續訂證書后配置Certbot以重啟Mosquitto。
配置Certbot續訂
Certbot會在它們到期之前自動續訂我們的SSL證書,但需要告知它在重新啟動之后重啟Mosquitto服務。
打開域名的Certbot續訂配置文件:
sudo nano /etc/letsencrypt/renewal/mqtt.example.com.conf
在最后一行添加以下renew_hook
選項:
renew_hook = systemctl restart mosquitto
保存並關閉該文件,然后運行Certbot dry run以確保語法正常:
sudo certbot renew --dry-run
如果您沒有看到任何錯誤,那么您已經完成了設置。讓我們接下來測試我們的MQTT服務器。
測試Mosquitto
我們在步驟1中安裝了一些命令行MQTT客戶端。我們可以在localhost監聽器上訂閱主題測試,如下所示:
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
。因為我們為mqtt.example.com
發布了SSL證書,如果我們嘗試安全連接到localhost
,我們會收到一條錯誤消息,指出主機名與證書主機名不匹配。
要測試websocket功能,我們將使用基於瀏覽器的公共MQTT客戶端。在瀏覽器中打開Eclipse Paho javascript客戶端實用程序並填寫連接信息,如下所示:
- 主機是您的Mosquitto服務器的域,
mqtt.example.com
- 端口是
8083
- ClientId可以保留為默認的隨機值
- 路徑可以保留為/ ws的默認值
- 用戶名是步驟3中的Mosquitto用戶名
- 密碼是您在步驟3中選擇的密碼
其余字段可以保留其默認值。
按Connect后,客戶端將連接到您的服務器。您可以使用連接窗格下的訂閱和 發布消息窗格進行發布和訂閱。