環境:Ubuntu 16.04web
MQTT是一種機器到機器的消息傳遞協議,旨在爲「物聯網」設備提供輕量級的發佈/訂閱通訊。它一般用於地理跟蹤車隊,家庭自動化,環境傳感器網絡和公用事業規模數據收集。安全
Mosquitto是一種流行的MQTT服務器(或MQTT中的代理),具備出色的社區支持,易於安裝和配置的特色。服務器
在本教程中,咱們將安裝Mosquitto並設置咱們的代理以使用SSL來保護受密碼保護的MQTT通訊。websocket
MQTT 是一個輕量級即時通訊協議,使用基於 TCP/IP 協議的發佈/訂閱消息轉發模式, MQTT 協議的中心是 broker( 服務器/代理),客戶端經過訂閱消息和發佈消息進行數據交互。
若初次接觸MQTT協議,可先理解如下概念:
【MQTT協議特色】——相比於RESTful架構的物聯網系統,MQTT協議藉助消息推送功能,能夠更好地實現遠程控制。
【MQTT協議角色】——在RESTful架構的物聯網系統,包含兩個角色客戶端和服務器端,而在MQTT協議中包括髮布者,代理器(服務器)和訂閱者。
【MQTT協議消息】——MQTT中的消息可理解爲發佈者和訂閱者交換的內容(負載),這些消息包含具體的內容,能夠被訂閱者使用。
【MQTT協議主題】——MQTT中的主題可理解爲相同類型或類似類型的消息集合。網絡
Mosquitto是一款實現了 MQTT v3.1 協議的開源消息代理軟件,包括了服務器端和客戶端,能夠跨平臺部署,提供輕量級的,支持發佈/訂閱的的消息推送模式,使設備對設備之間的短消息通訊簡單易用。架構
2.1安裝mosquittosocket
1.引入mosquitto倉庫並更新測試
sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa sudo apt-get update
2.執行如下命令安裝mosquittoui
sudo apt-get install mosquitto
3.查看mosquitto服務狀態加密
sudo service mosquitto status
4.開啓/中止mosquitto服務
sudo service mosquitto start
sudo service mosquitto stop
2.2簡單的測試
一個完整的MQTT示例包括代理器,發佈者和訂閱者。
測試分爲如下幾個步驟:
(1)啓動服務mosquitto
(2)訂閱者經過mosquitto_sub訂閱指定主題的消息。
(3)發佈者經過mosquitto_pub發佈指定主題的消息。
(4)代理服務器把該主題的消息推送到訂閱者。
本機測試:
代理器,發佈者和訂閱者都在本機。
1.安裝mosquitto客戶端
sudo apt-get install mosquitto-clients
2.打開一個終端,訂閱主題
mosquitto_sub -h localhost -t "mqtt" -v
【-h】指定要鏈接的MQTT服務器
【-t】訂閱主題,此處爲mqtt
【-v】打印更多的調試信息
3.打開另外一個終端,發佈主題
mosquitto_pub -h localhost -t "mqtt" -m "Hello2 MQTT"
【-h】指定要鏈接的MQTT服務器
【-t】向指定主題推送消息
【-m】指定消息內容
網絡測試
test.mosquitto.org是一個公開可用的Mosquitto MQTT服務器/代理。
1.經過如下命令從test.mosquitto.org訂閱全部主題,任何人發佈的任何消息你均可以收到,你會看到大量有趣消息滾動在你的屏幕上。
mosquitto_sub -h test.mosquitto.org -t "#" -v
2.也能夠經過如下命令訂閱特定主題,用來接收本身的消息
mosquitto_sub -h test.mosquitto.org -t "msg_only_from_me" -v
mosquitto_pub -h test.mosquitto.org -t "msg_only_from_me" -m "My cat is Luna"
咱們配置Mosquitto使用密碼。Mosquitto包含一個實用程序來生成一個名爲mosquitto_passwd
的特殊密碼文件。此命令將提示您輸入指定用戶名的密碼,並將結果放入/etc/mosquitto/passwd
sudo mosquitto_passwd -c /etc/mosquitto/passwd sammy
如今咱們將爲Mosquitto打開一個新配置文件,並告訴它使用此密碼文件來要求全部鏈接的登陸:
sudo nano /etc/mosquitto/conf.d/default.conf
這應該打開一個空文件。粘貼以下:
allow_anonymous false password_file /etc/mosquitto/passwd
請務必在文件末尾留下尾隨換行符。
allow_anonymous false
將禁用全部未通過身份驗證的鏈接,該password_file
行告訴Mosquitto在哪裏查找用戶和密碼信息。保存並退出該文件。
如今咱們須要重啓Mosquitto並測試咱們的更改。
sudo systemctl restart mosquitto
嘗試發佈沒有密碼的郵件:
mosquitto_pub -h localhost -t "test" -m "hello world"
該郵件應被拒絕:
Connection Refused: not authorised.
Error: The connection was refused.
在咱們再次嘗試使用密碼以前,請再次切換到第二個終端窗口,並使用用戶名和密碼訂閱「test」主題:
mosquitto_pub -h localhost -t "test" -m "hello world" -u "sammy" -P "password"
mosquitto_sub -h localhost -t test -u "sammy" -P "password"
它應該鏈接並等待消息。您能夠將本終端打開並鏈接到本教程的其他部分,由於咱們會按期發送測試消息。
如今再次使用用戶名和密碼與您的其餘終端發佈消息:
要啓用SSL加密,咱們須要告訴Mosquitto存儲Let的加密證書的位置。打開咱們以前啓動的配置文件:
sudo nano /etc/mosquitto/conf.d/default.conf
在文件末尾粘貼如下內容,留下咱們已經添加的兩行:
. . . 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
塊。
第一個,listener 1883 localhost
更新端口上的默認MQTT監聽器1883
,這是咱們到目前爲止所鏈接的。1883
是標準的未加密MQTT端口。該localhost
行的部分指示Mosquitto僅將此端口綁定到localhost接口,所以沒法從外部訪問它。不管如何,咱們的防火牆都會阻止外部請求,但明確是好的。
listener 8883
在端口上設置加密偵聽器8883
。這是MQTT + SSL的標準端口,一般稱爲MQTTS。
接下來的三行: certfile
,cafile
,和keyfile
,都指向Mosquitto到適合咱們加密文件創建的加密鏈接。
保存並退出該文件,而後從新啓動Mosquitto以更新設置:
sudo systemctl restart mosquitto
更新防火牆以容許鏈接到端口8883
sudo ufw allow 8883
輸出以下所示:
Rule added Rule added (v6)
如今咱們再次使用mosquitto_pub
測試一些不一樣的SSL選項:
mosquitto_pub -h mqtt.example.com -t test -m "hello again" -p 8883 --capath /etc/ssl/certs/ -u "sammy" -P "password"
請注意,咱們使用的是完整的主機名而不是localhost
。由於咱們發出了mqtt.example.com
SSL證書,若是咱們嘗試localhost
安全鏈接,咱們會收到一個錯誤,說主機名與證書主機名不匹配(即便它們都指向同一個Mosquitto服務器)。
--capath /etc/ssl/certs/
啓用SSL mosquitto_pub
,並告訴它在哪裏查找root證書。這些一般由您的操做系統安裝,由於Mac OS,Windows等的路徑不一樣。mosquitto_pub
使用root證書驗證Mosquitto服務器的證書是否由Let的加密證書頒發機構正確簽名。須要很注意的是mosquitto_pub
並且它沒有這個選項不會嘗試(或相似的SSL鏈接--cafile
選項),即便你鏈接的標準安全端口8883
。
若是測試結果一切正常,咱們會再次看到hello出如今另外一個mosquitto_sub
終端。這意味着您的服務器已徹底設置好!若是您想擴展MQTT協議以使用websockets,您能夠按照最後一步操做。
參考連接:
https://cloud.tencent.com/developer/article/1350337