如何在CentOS 7上安裝和保護Mosquitto MQTT消息傳遞代理

MQTT是一種機器到機器消息協議,旨在為“物聯網”設備提供輕量級發布/訂閱通信。 Mosquitto是一個受歡迎的MQTT服務器(或代理,在MQTT中的用法),具有良好的社區支持,易于安裝和配置。在本教程中,我們將安裝Mosquitto,從Let's Encrypt檢索SSL證書,并設置我們的代理使用SSL來保護受密碼保護的MQTT通信。

介紹

MQTT是一種機器到機器消息協議,旨在為“物聯網”設備提供輕量級發布/訂閱通信。它通常用于車輛的地理跟蹤車隊,家庭自動化,環境傳感器網絡和公用事業規模的數據收集。 Mosquitto是一個受歡迎的MQTT服務器(或代理 ,在MQTT中的用法),具有良好的社區支持,易于安裝和配置。 在本教程中,我們將安裝Mosquitto,從Let's Encrypt檢索SSL證書,并設置我們的代理使用SSL來保護受密碼保護的MQTT通信。

先決條件

在開始本教程之前,您需要:

  • 具有非root,啟用sudo的用戶和基本防火墻的CentOS 7服務器。這個(和更多)在新的CentOS 7服務器清單中有所有。

  • 指向您的服務器的域名,按照如何使用DigitalOcean設置主機名 。本教程將使用mqtt.example.com。

  • 可選, nano文本編輯器。 安裝您喜歡的文本編輯器。 本教程將使用nano整個,你可以隨時安裝它與sudo yum -y install nano

第1步 - 安裝Mosquitto

默認情況下,CentOS 7沒有mosquitto包。要安裝它,我們將首先安裝一個名為Extra Packages for Enterprise Linux或EPEL的額外軟件存儲庫。這個存儲庫包含了在CentOS,Red Hat和其他面向企業的Linux發行版上安裝的附加軟件。 使用非root用戶登錄,并使用yum軟件包管理器安裝epel-release軟件包。

sudo yum -y install epel-release

這將EPEL存儲庫信息添加到我們的系統。-y選項會在整個過程中自動為yes回答幾個提示。 現在我們可以安裝mosquitto包。

sudo yum -y install mosquitto

該包有一個簡單的默認配置,所以讓我們運行它來測試我們的安裝。

sudo systemctl start mosquitto

我們還需要啟用服務,以確保它啟動時,我們重新啟動系統:

sudo systemctl enable mosquitto

現在讓我們測試默認配置。mosquitto包附帶一些命令行MQTT客戶端。我們將使用其中一個訂閱我們的經紀人的主題。 主題是您向其發布消息和訂閱的標簽。 它們被布置為層次結構,因此,例如,您可以具有sensors/outside/temp和sensors/outside/humidity 。如何安排主題取決于你和你的需要。在本教程中,我們將使用一個簡單的測試主題來測試我們的配置更改。 第二次登錄到您的服務器,因此您有兩個端子并排。在新終端中,使用mosquitto_sub訂閱測試主題:

mosquitto_sub -h localhost -t test

-h用于指定MQTT服務器的主機名, -t是主題名。 由于mosquitto_sub正在等待消息到達,因此在按ENTER后沒有輸出。切換回您的其他終端并發布消息:

mosquitto_pub -h localhost -t test -m "hello world"

mosquitto_pub的選項與mosquitto_pub相同,但是這次我們使用附加的-m選項來指定我們的消息。 按ENTER ,你應該看到hello world彈出在另一個終端。您發送了第一個MQTT消息! 在第二個終端中輸入CTRL+C ,退出mosquitto_sub ,但保持與服務器的連接打開。我們將在第5步中再次使用它進行另一個測試。 接下來,我們將使用Certbot(新的Let's Encrypt客戶端)使用SSL保護我們的安裝。

第2步 - 安裝并運行Certbot讓我們加密證書
Let's Encrypt是一項新服務,通過自動API提供免費的SSL證書。官方Let's Encrypt客戶端稱為Certbot,它包含在我們在上一步中安裝的EPEL存儲庫中。 用yum安裝Certbot。

sudo yum -y install certbot

Certbot需要回答Let's Encrypt API發出的加密挑戰,以證明我們控制我們的域。它使用端口80 (HTTP)和/或443 (HTTPS)來完成此操作。 我們只使用端口80 ,所以讓我們允許在該端口上的傳入流量。 使用firewall-cmd添加HTTP服務。

sudo firewall-cmd --permanent --add-service=http

重新加載防火墻,以使更改生效。

sudo firewall-cmd --reload

我們現在可以運行Certbot獲取我們的證書。我們將使用--standalone選項告訴Certbot自己處理HTTP質詢請求,以及--standalone-supported-challenges http-01將通信限制為端口80-d用于指定您想要證書的域,并且certonly告知Certbot只是檢索證書,而不執行任何其他配置步驟。

sudo certbot certonly --standalone --standalone-supported-challenges http-01 -d mqtt.example.com

運行命令時,系統將提示您輸入電子郵件地址并同意服務條款。這樣做后,您應該會看到一條消息,告訴您進程成功以及您的證書存儲在何處。 我們有我們的證書。現在我們需要確保Certbot在它們即將到期時自動更新它們。

第3步 - 設置Certbot自動續訂

讓我們加密的證書只有九十天有效。這是為了鼓勵用戶自動執行證書續訂過程。我們需要設置一個定期運行的命令來檢查到期的證書并自動更新。 為了每天運行更新檢查,我們將使用cron作為運行周期性作業的標準系統服務。 我們通過打開和編輯名為crontab的文件告訴cron要做什么。

sudo EDITOR=nano crontab -e

EDITOR=nano將使nano編輯器中的crontab文件打開。 如果您希望使用默認vi編輯器,請將其關閉。 您現在應該看到默認的crontab ,一個空白文件。粘貼到以下行,然后保存并關閉文件。

crontab

15 3 * * * certbot renew --noninteractive --post-hook "systemctl restart mosquitto"

該行的15 3 * * *部分表示“每天上午3:15運行以下命令”。 Certbot的renew命令將檢查系統上安裝的所有證書,并更新任何設置為在三十天內到期的證書。 --noninteractive告知Certbot不要等待用戶輸入。 --post-hook "systemctl restart mosquitto"將重新啟動Mosquitto以獲取新證書,但前提是證書已更新。 現在,自動證書更新已設置,我們將回到配置Mosquitto更安全。

第4步 - 配置MQTT密碼

讓我們配置Mosquitto使用密碼。 Mosquitto包含一個實用程序來生成一個名為mosquitto_passwd的特殊密碼文件。 此命令將提示您輸入指定用戶名的密碼,并將結果放在/etc/mosquitto/passwd

sudo mosquitto_passwd -c /etc/mosquitto/passwd sammy

現在我們將替換默認配置文件,并告訴Mosquitto使用此密碼文件要求所有連接登錄。首先,刪除現有的mosquitto.conf

sudo rm /etc/mosquitto/mosquitto.conf

現在打開一個新的,空白的配置。

sudo nano /etc/mosquitto/mosquitto.conf

粘貼在以下。

/etc/mosquitto/mosquitto.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.

在我們再次嘗試使用密碼,再次切換到您的第二個終端窗口,并訂閱'測試'主題,使用用戶名和密碼這次:

mosquitto_sub -h localhost -t test -u "sammy" -P "password"

它應該連接和坐,等待消息。您可以將此終端保持打開并連接到本教程的其余部分,因為我們將定期發送測試消息。 現在與您的其他終端發布消息,再次使用用戶名和密碼:

mosquitto_pub -h localhost -t "test" -m "hello world" -u "sammy" -P "password"

消息應該通過,如第1步中所示。我們已成功添加密碼保護Mosquitto。不幸的是,我們通過互聯網發送密碼未加密。我們將通過添加SSL加密到Mosquitto來解決。

第5步 - 配置MQTT SSL

要啟用SSL加密,我們需要告訴Mosquitto我們的加密證書存儲在哪里。打開我們以前啟動的配置文件。

sudo nano /etc/mosquitto/mosquitto.conf

粘貼到文件末尾的下面,留下我們已經添加的兩行:

/etc/mosquitto/mosquitto.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更新端口1883上的默認MQTT監聽器,這是我們一直連接到目前為止。 1883是標準的未加密MQTT端口。 該行的localhost部分指示Mosquitto僅將此端口綁定到localhost接口,因此無法從外部訪問。外部請求將被我們的防火墻阻止,但是很好明確。 listener 8883在端口8883上設置加密的監聽器。 這是MQTT + SSL的標準端口,通常稱為MQTTS。 接下來的三行, certfilecafilekeyfile ,都將Mosquitto指向相應的Let's Encrypt文件來設置加密連接。 保存并退出文件。 在我們重新啟動Mosquitto加載新的配置之前,我們需要修復默認mosquitto服務文件中的一件事。 這是systemd用來確定如何運行mosquitto 。在您喜歡的編輯器中打開它。

sudo nano /etc/systemd/system/multi-user.target.wants/mosquitto.service

查找一條表示User=mosquitto并將其刪除的行,然后保存并退出該文件。 Mosquitto仍將作為mosquitto用戶運行,但是當它首次啟動時,它將具有root權限,并且將能夠加載我們的Let's Encrypt證書(出于安全原因,它被限制為root訪問權限)。 加載證書后,它將下載到蚊子用戶。 我們需要重新加載systemd本身,所以它注意到我們對服務文件所做的更改。

sudo systemctl daemon-reload

現在我們可以重新啟動Mosquitto更新設置。

sudo systemctl restart mosquitto

更新防火墻以允許連接到端口8883

sudo firewall-cmd --permanent --add-port=8883/tcp

并重新加載防火墻。

sudo firewall-cmd --reload

現在我們再次使用mosquitto_pub測試,有幾個不同的SSL選項。

mosquitto_pub -h mqtt.example.com -t test -m "hello again" -p 8883 --cafile /etc/ssl/certs/ca-bundle.crt -u "sammy" -P "password"

請注意,我們使用完整的主機名而不是localhost 。 因為我們的SSL證書是針對mqtt.example.com發出的,如果我們嘗試到localhost的安全連接,我們會收到一個錯誤,指出主機名與證書主機名不匹配(即使它們都指向同一個Mosquitto服務器)。 --cafile /etc/ssl/certs/ca-bundle.crt--cafile /etc/ssl/certs/ca-bundle.crt啟用S??SL,并告知它在哪里查找根證書。 這些通常由操作系統安裝,因此對于Mac OS,Windows等, mosquitto_pub使用根證書來驗證Mosquitto服務器的證書是否由Let's Encrypt證書頒發機構正確簽名。 請注意,即使您連接到8883的標準安全端口, mosquitto_pubmosquitto_sub也不會嘗試使用此選項(或類似的--capath選項)的SSL連接。 如果一切順利的測試,我們會看到你好再次出現在另一個mosquitto_sub終端。這意味著您的服務器已完全設置!如果你想擴展MQTT協議來使用websockets,你可以按照最后一步。

第6步 - 通過WebSocket配置MQTT(可選)

為了使用Web瀏覽器中的JavaScript來講MQTT,協議適用于在標準websockets上工作。如果您不需要此功能,則可以跳過此步驟。 我們需要添加一個listener塊到我們的Mosquitto配置。

sudo nano /etc/mosquitto/mosquitto.conf

在文件的末尾,添加以下內容:

/etc/mosquitto/mosquitto.conf

. . .
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

protocol websockets與上一個塊相同,除了端口號和protocol websockets行。 沒有用于MQTT的官方標準化端口通過websockets,但8083是最常見的。 保存并退出文件,然后重新啟動Mosquitto。

sudo systemctl restart mosquitto

現在,打開防火墻中的端口8083

sudo firewall-cmd --permanent --add-port=8083/tcp

并且最后一次重新加載防火墻。

sudo firewall-cmd --reload

為了測試這個功能,我們將使用一個基于瀏覽器的公共MQTT客戶端。有幾個,但是mqtt-admin是簡單和直接。 在瀏覽器中打開mqtt-admin 。您將看到以下內容:

mqtt-admin的初始屏幕

按如下所示填寫連接信息:

  • 協議應該是wss (這代表web的ocket s ecure)。
  • 主機應該是您的Mosquitto服務器的域, mqtt.example.com
  • 端口應為8083
  • 用戶應該是您的Mosquitto用戶名; 在這里,我們使用sammy
  • 密碼應該是您選擇的密碼。
  • ClientId可以保留默認值mqtt-admin

按下保存設置后mqtt-admin將連接到您的Mosquitto服務器。 在下一個屏幕中,填寫Topic作為測試 ,輸入任何有關Payload的消息,然后按發布 。 該消息將顯示在mosquitto_sub終端中。

結論

我們現在已經設置了一個安全的,密碼保護的MQTT服務器,使用來自Let's Encrypt服務的自動更新SSL證書。這將作為一個強大和安全的消息平臺,用于任何項目你夢想。一些流行的軟件和硬件與MQTT協議工作良好包括:

  • OwnTracks是一個開源的地理跟蹤應用,您可以在手機上安裝。 OwnTracks將定期向MQTT服務器報告位置信息,然后您可以將其存儲和顯示在地圖上,或根據您的位置創建警報并激活物聯網硬件。
  • Node-RED是一個基于瀏覽器的圖形界面,用于將物聯網“布線”在一起。您將一個節點的輸出拖動到另一個節點的輸入,并可以通過過濾器,在各種協議之間將信息路由到數據庫等。 MQTT得到了Node-RED的很好的支持。
  • ESP8266是一個具有MQTT功能的便宜的wifi微控制器。你可以連接一個發布溫度數據到一個主題,或者訂閱氣壓壓力主題,并在暴風雨來臨時發出蜂鳴聲!

這些只是MQTT生態系統中的幾個流行示例。有更多的硬件和軟件在那里說的協議。如果你已經有一個喜歡的硬件平臺或軟件語言,它可能有MQTT功能。有樂趣讓你的“東西”彼此交談!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,505評論 2 379

推薦閱讀更多精彩內容