溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MQTT的安全怎么實現(xiàn)

發(fā)布時間:2021-12-07 09:48:23 來源:億速云 閱讀:338 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇文章主要介紹“MQTT的安全怎么實現(xiàn)”,在日常操作中,相信很多人在MQTT的安全怎么實現(xiàn)問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MQTT的安全怎么實現(xiàn)”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

三、MQTT的安全

由于MQTT運行于TCP層之上并以明文方式傳輸,這就相當于HTTP的明文傳輸,使用Wireshark可以完全看到MQTT發(fā)送的所有消息,消息指令一覽無遺,如圖1所示。

MQTT的安全怎么實現(xiàn)

圖1 Wireshark抓取MQTT數(shù)據(jù)包

這樣可能會產(chǎn)生以下風(fēng)險:

  • 設(shè)備可能會被盜用;

  • 客戶端和服務(wù)端的靜態(tài)數(shù)據(jù)可能是可訪問的(可能會被修改);

  • 協(xié)議行為可能有副作用;

  • 通信可能會被攔截、修改、重定向或者泄露;

  • 虛假控制報文注入。

作為傳輸協(xié)議,MQTT僅關(guān)注消息傳輸,提供合適的安全功能是開發(fā)者的責任。安全功能可以從三個層次來考慮——應(yīng)用層、傳輸層、網(wǎng)絡(luò)層。

  • 應(yīng)用層:在應(yīng)用層上,MQTT提供了客戶標識(Client Identifier)以及用戶名和密碼,可以在應(yīng)用層驗證設(shè)備。

  • 傳輸層:類似于HTTPS,MQTT基于TCP連接,也可以加上一層TLS,傳輸層使用TLS加密是確保安全的一個好手段,可以防止中間人攻擊??蛻舳俗C書不但可以作為設(shè)備的身份憑證,還可以用來驗證設(shè)備。

  • 網(wǎng)絡(luò)層:如果有條件的話,可以通過拉專線來連接設(shè)備與MQTT代理,以提高網(wǎng)絡(luò)傳輸?shù)陌踩浴?/p>

1. 認證

MQTT支持兩種層次的認證:

  • 應(yīng)用層:MQTT支持客戶標識、用戶名和密碼認證;

  • 傳輸層:傳輸層可以使用TLS,除了加密通訊,還可以使用X509證書來認證設(shè)備。

2. 客戶標識

MQTT客戶端可以發(fā)送最多65535個字符作為客戶標識(Client  Identifier),一般來說可以使用嵌入式芯片的MAC地址或者芯片序列號。雖然使用客戶標識來認證可能不可靠,但是在某些封閉環(huán)境或許已經(jīng)足夠了。

3. 用戶名和密碼

MQTT協(xié)議支持通過CONNECT消息的username和password字段發(fā)送用戶名和密碼。

用戶名及密碼的認證使用起來非常方便,不過由于它們是以明文形式傳輸,所以使用抓包工具就可以輕易的獲取。

一般來說,使用客戶標識、用戶名和密碼已經(jīng)足夠了,比如支持MQTT協(xié)議連接的OneNET云平臺,就是使用了這三個字段作為認證。如果感覺還不夠安全,還可以在傳輸層進行認證。

4. 在傳輸層認證

在傳輸層認證是這樣的:MQTT代理在TLS握手成功之后可以繼續(xù)發(fā)送客戶端的X509證書來認證設(shè)備,如果設(shè)備不合法便可以中斷連接。使用X509認證的好處是,在傳輸層就可以驗證設(shè)備的合法性,在發(fā)送CONNECT消息之前便可以阻隔非法設(shè)備的連接,以節(jié)省后續(xù)不必要的資源浪費。而且,MQTT協(xié)議運行在使用TLS時,除了提供身份認證,還可以確保消息的完整性和保密性。

5. 選擇用戶數(shù)據(jù)格式

MQTT協(xié)議只實現(xiàn)了傳送消息的格式,并沒有限制用戶協(xié)議需要按照一定的風(fēng)格,因此在MQTT協(xié)議之上,我們需要定義一套自己的通信協(xié)議。比如說,發(fā)布者向設(shè)備發(fā)布一條打開消息,設(shè)備可以回復(fù)一個消息并攜帶返回碼,這樣的消息格式是使用二進制、字符串還是JSON格式呢?下面就簡單做個選型參考。

6. 十六進制/二進制

MQTT原本就是基于二進制實現(xiàn)的,所以用戶協(xié)議使用二進制實現(xiàn)是一個不錯的選擇。雖然失去了直觀的可讀性,但可以將流量控制在非常小。其實對于單片機開發(fā)者來說十六進制并不陌生,因為單片機寄存器都是以位來操作的,芯片間通信也會使用十六進制/二進制。而對于沒有單片機開發(fā)經(jīng)驗的工程師來說,十六進制/二進制可能就太原始了。下面我們繼續(xù)看看還有沒有其他方案。

7. 字符串

對單片機開發(fā)者來說,字符串也是一個選擇。比如通過串口傳輸?shù)腁T指令就是基于字符串通信的。使用字符串方便了人閱讀,但是對高級語言開發(fā)者來說,鍵值對(Key-Value)才更受歡迎。

四、MQTT拍檔

1. JSON

JSON中文全稱是JavaScript對象標記語言,在這門語言中,一切都是對象。因此,任何支持的類型都可以通過JSON來表示,例如字符串、數(shù)字、對象、數(shù)組等。其語法規(guī)則是:

  • 對象表示為鍵值對;

  • 數(shù)據(jù)由逗號分隔;

  • 花括號保存對象;

  • 方括號保存數(shù)組。

JSON層次結(jié)構(gòu)簡潔清晰,易于閱讀和編寫,同時也易于機器解析和生成,有效提升網(wǎng)絡(luò)傳輸效率。

對于單片機開發(fā)者,主流的微控制器軟件開發(fā)工具Keil有提供JSON庫,可以用于STC、STM32等微控制器開發(fā),所以在微控制器上解析JSON不需要自己寫一個JSON解析器或者移植了。

如果實在懶得使用JSON庫生成或解析,也可以直接使用C語言中的sprintf生成JSON字符串,比如:

sprintf(buf, "{"String":"%s", "Value":%d}", "Hello World!", 12345);

這樣就可以生成一個{“String”:”Hello World!”, “Value”:12345}JSON字符串了。

2. XML

MQTT協(xié)議只負責通信部分,用戶協(xié)議可以自己選擇,當然也可以選擇復(fù)雜又冗長的XML格式??墒羌热灰x擇MQTT+XML,為什么不考慮換為XMPP呢?

3. 小結(jié)

綜上所述,MQTT+JSON協(xié)議簡潔清晰、易于閱讀、解析和生成等,也考慮了服務(wù)器端開發(fā)者和設(shè)備端開發(fā)者的開發(fā)成本。

五、有關(guān)MQTT的云平臺和工具

1. 支持MQTT的云平臺

目前,百度、阿里、騰訊的云平臺都逐漸有了物聯(lián)網(wǎng)開發(fā)套件:騰訊QQ物聯(lián)平臺內(nèi)測中,阿里云物聯(lián)網(wǎng)套件公測中,兩者都需要進行申請試用,而百度云物聯(lián)網(wǎng)套件已經(jīng)支持MQTT并且可以免費試用一段時間。除了BAT三大家,下面再介紹一些其他支持MQTT的物聯(lián)網(wǎng)云平臺。

  • OneNET云平臺:OneNET是由中國移動打造的PaaS物聯(lián)網(wǎng)開放平臺。平臺能夠幫助開發(fā)者輕松實現(xiàn)設(shè)備接入與設(shè)備連接,快速完成產(chǎn)品開發(fā)部署,為智能硬件、智能家居產(chǎn)品提供完善的物聯(lián)網(wǎng)解決方案。OneNET云平臺已經(jīng)于2014年10月正式上線。

  • 云巴:云巴(Cloud  Bus)是一個跨平臺的雙向?qū)崟r通信系統(tǒng),為物聯(lián)網(wǎng)、App和Web提供實時通信服務(wù)。云巴基于MQTT,支持Socket.IO協(xié)議,支持RESTful  API。

2. MQTT服務(wù)器

如果不想使用云平臺,只是純粹地玩一下MQTT,或者只想在內(nèi)網(wǎng)對設(shè)備進行監(jiān)控,那么可以自己本地部署一個MQTT服務(wù)器。下面介紹幾款MQTT服務(wù)器:

  • Apache-Apollo:一個代理服務(wù)器,在ActiveMQ基礎(chǔ)上發(fā)展而來,可以支持STOMP、AMQP、MQTT、Openwire、SSL和WebSockets等多種協(xié)議,并且Apollo提供后臺管理頁面,方便開發(fā)者管理和調(diào)試。

  • EMQ:EMQ  2.0,基于Erlang/OTP語言平臺開發(fā),支持大規(guī)模連接和分布式集群,發(fā)布訂閱模式的開源MQTT消息服務(wù)器。

  • HiveMQ:一個企業(yè)級的MQTT代理,主要用于企業(yè)和新興的機器到機器M2M通訊和內(nèi)部傳輸,滿足可伸縮性、易管理和安全特性,提供免費的個人版。HiveMQ提供了開源的插件開發(fā)包。

  • Mosquitto:一款實現(xiàn)了消息推送協(xié)議MQTT v3.1的開源消息代理軟件,提供輕量級的、支持可發(fā)布/可訂閱的消息推送模式。

3. MQTT調(diào)試工具

知道了各大平臺的MQTT,同時自己也可以在內(nèi)網(wǎng)部署MQTT服務(wù)器,那接下來沒有調(diào)試工具怎么行呢,難道要用自己喜歡的語言編寫一個?當然不需要。MQTT調(diào)試工具可以考慮使用HiveMQ的MQTT客戶端——HiveMQ  Websockets Client,這是一款基于WebSocket的瀏覽器MQTT客戶端,支持主題訂閱和發(fā)布。

4. MQTT與其他協(xié)議

目前各大平臺都開始支持MQTT協(xié)議,MQTT相比其他協(xié)議有什么優(yōu)勢呢?物聯(lián)網(wǎng)設(shè)備能不能用其他的協(xié)議呢?下面是MQTT與其他部分協(xié)議的比較,給大家作為參考。

5. MQTT與TCP Socket

雖然MQTT運行于TCP層之上,看起來這兩者之間根本沒有比較性,但筆者覺得還是有必要敘述一番,因為大多數(shù)從事硬件或嵌入式開發(fā)的工程師,都是直接在TCP層上通信的。從事嵌入式開發(fā)工作的人都應(yīng)該知道LwIP,LwIP是一套用于嵌入式系統(tǒng)的開放源代碼TCP/IP協(xié)議棧,LwIP在保證嵌入式產(chǎn)品擁有完整的TCP/IP功能的同時,又能保證協(xié)議棧對處理器資源的有限消耗,其運行一般僅需要幾十KB的RAM和40KB左右的ROM。

也就是說,只要是嵌入式產(chǎn)品使用了LwIP,就支持TCP/IP協(xié)議棧,進而可以使用MQTT協(xié)議。

由于TCP協(xié)議有粘包和分包問題,所以傳輸數(shù)據(jù)時需要自定義協(xié)議,如果傳輸?shù)臄?shù)據(jù)報超過MSS(報文段長度),一定要給協(xié)議定義一個消息長度字段,確保接收端能通過緩沖完整收取消息。一個簡單的協(xié)議定義:消息頭部+消息長度+消息正文。

當然,使用MQTT協(xié)議則不需要考慮這個問題,這些MQTT都已經(jīng)處理好了,MQTT最長可以一次性發(fā)送256MB數(shù)據(jù),不用考慮粘包分包的問題。

總之,TCP和MQTT本身并不矛盾,只不過基于Socket開發(fā)需要處理更多的事情,而且大多數(shù)嵌入式開發(fā)模塊本身也只會提供Socket接口供廠家自定義協(xié)議。

6. MQTT與HTTP

HTTP最初的目的是提供一種發(fā)布和接收HTML頁面的方法,主要用于Web。HTTP是典型的C/S通訊模式:請求從客戶端發(fā)出,服務(wù)端只能被動接收,一條連接只能發(fā)送一次請求,獲取響應(yīng)后就斷開連接。該協(xié)議最早是為了適用Web瀏覽器的上網(wǎng)瀏覽場景而設(shè)計的,目前在PC、手機、Pad等終端上都應(yīng)用廣泛。由于這樣的通信特點,HTTP技術(shù)在物聯(lián)網(wǎng)設(shè)備中很難實現(xiàn)設(shè)備的反向控制,不過非要實現(xiàn)也不是不行,下面看一下Web端的例子。

目前,在微博等SNS網(wǎng)站上有海量用戶公開發(fā)布的內(nèi)容,當發(fā)布者發(fā)布消息,數(shù)據(jù)傳到服務(wù)器更新時,就需要給關(guān)注者盡可能的實時更新內(nèi)容。Web網(wǎng)站基于HTTP協(xié)議,使用HTTP協(xié)議探測服務(wù)器上是否有內(nèi)容更新,就必須頻繁地讓客戶端請求服務(wù)器進行確認。在瀏覽器中要實現(xiàn)這種效果,可以使用Comet技術(shù),Comet是基于HTTP長連接的“服務(wù)器推”技術(shù),主要有兩種實現(xiàn)模型:基于AJAX的長輪詢(long-polling)方式和基于Iframe及htmlfile的流(streaming)方式。這兩種技術(shù)模型在這里不詳細展開,有興趣的讀者可以查閱相關(guān)資料。

如果要實現(xiàn)設(shè)備的反向控制,可能就要用到前面提到的Comet技術(shù)。由于需要不斷的請求服務(wù)器,會導(dǎo)致通信開銷非常大,加上HTTP冗長的報文頭,在節(jié)省流量上實在沒有優(yōu)勢。

當然,如果只是單純地讓設(shè)備定時上報數(shù)據(jù)而不做控制,也是可以使用HTTP協(xié)議的。

7. MQTT與XMPP

最有可能與MQTT競爭的是XMPP協(xié)議。XMPP(可擴展通訊與表示協(xié)議)是一項用于實時通訊的開放技術(shù),它使用可擴展標記語言(XML)作為交換信息的基本格式。其優(yōu)點是協(xié)議成熟、強大、可擴展性強。目前主要應(yīng)用于許多聊天系統(tǒng)中,在消息推送領(lǐng)域,MQTT和XMPP互相競爭。下面列舉MQTT與XMPP各自的特性:

  • XMPP協(xié)議基于繁重的XML,報文體積大且交互繁瑣;而MQTT協(xié)議固定報頭只有兩個字節(jié),報文體積小、編解碼容易;

  • XMPP基于JID的點對點消息傳輸;MQTT協(xié)議基于主題(Topic)發(fā)布訂閱模式,消息路由更為靈活;

  • XMPP協(xié)議采用XML承載報文,二進制必須進行Base64編碼或其他方式處理;MQTT協(xié)議未定義報文內(nèi)容格式,可以承載JSON、二進制等不同類型報文,開發(fā)者可以針對性的定義報文格式;

  • MQTT協(xié)議支持消息收發(fā)確認和QoS保證,有更好的消息可靠性保證;而XMPP主協(xié)議并未定義類似機制;

  • 在嵌入式設(shè)備開發(fā)中大多使用的是C語言開發(fā),C語言解析XML是非常困難的。MQTT基于二進制實現(xiàn)且未定義報文內(nèi)容格式,可以很好的兼顧嵌入式C語言開發(fā)者;而XMPP基于XML,開發(fā)者需要配合協(xié)議格式,不能靈活開發(fā)。

綜上所述,在嵌入式設(shè)備中,由于需要一個靈巧簡潔,對設(shè)備開發(fā)者和服務(wù)端開發(fā)者都友好的協(xié)議,MQTT比XMPP更具有優(yōu)勢。

8. MQTT與CoAP

CoAP也是一個能與MQTT競爭的協(xié)議。其模仿HTTP的REST模型,服務(wù)端以URI方式創(chuàng)建資源,客戶端可以通過GET、PUT、POST、DELETE方式訪問這些資源,并且協(xié)議風(fēng)格也和HTTP極為相似,例如一個設(shè)備有溫度數(shù)據(jù),那么這個溫度可以被描述為:

CoAP://:/sensors/temperature

其中為設(shè)備的IP,為端口。

不過,如果使用CoAP可能會讓物聯(lián)網(wǎng)后臺的情況變得復(fù)雜,比如MQTT可以實現(xiàn)一個最簡單的IoT架構(gòu):Device + MQTT服務(wù)器 +  APP,手機端或Web端可以直接從MQTT服務(wù)器訂閱想要的主題。而CoAP可能需要這樣的架構(gòu):CoAP + Web + DataBase +  App,使用CoAP必須經(jīng)過DataBase才能轉(zhuǎn)給第三方。

至于CoAP和MQTT孰優(yōu)孰劣,這里不作定論。不過目前來說,CoAP資料還是略少。而且,MQTT除了可以應(yīng)用于物聯(lián)網(wǎng)領(lǐng)域,在手機消息推送、在線聊天等領(lǐng)域都可以有所作為。

到此,關(guān)于“MQTT的安全怎么實現(xiàn)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI