Mosquitto MQTT 安裝
2016年8月17日MQTT 的全名為 Message Queuing Telemetry Transport,為 IBM 和 Eurotech 共同製定出來的協定,MQTT 是為了物聯網設計的協定,透過Publish/Subscribe 的方式來做訊息傳送。
Publish/Subscribe 有三種主要的組成元件,分別為Publisher、Subscriber 以及 Topic。
mosquitto 為 Eclipse 所開發的開源 MQTT broker 和給用戶端使用C語言的API介面,目前最新版本為 V1.4.9。
Prerequisites
|
Install Mosquitto Broker
|
Install Mosquitto Client
|
測試
開啟兩個終端機分別輸入
終端機1(Subscribe)
|
-d :debug 模式 , -t :訂閱的主題名稱 , -h :Broker's IP , -p :Broker's port
終端機2(Publish)
|
-m :發送的文字內容
當兩個command line 都輸入完後終端機分別會看到
終端機1(Subscribe)
|
終端機2(Publish)
|
mosquitto.conf 參數說明
設定檔設置於 /etc/mosquitto/mosquitto.conf
詳細的參數說明如下:
|
參考來源 :
認證方式
Broker的認證方式,Mosquitto端提供了四種認證方法分別為
- 無認證
- 帳號/密碼
- 預先共享密鑰(Pre-shared Key)加密
- 憑證加密
無認證
要打開 /etc/mosquitto/mosquitto.conf
設定檔將allow_anonymous設定為true即可。此時我們可以利用mosquitto_sub來測試
Subscribe
|
Publish
|
-t :訂閱的主題,-v :連主題名稱也列印在銀幕上。
帳號/密碼
新增帳號密碼
使用此方式需利用上述的
mosquitto_passwd
產生密碼,並將密碼檔案名稱設定到password_file此欄位。mosquitto_passwd -c "<passwordfile>" "<username>"如果passwordfile檔案已經存在,則下次新增使用者則不需要加 -c
下列命令將新產生一個密碼檔案/etc/mosquitto/passwd,並建立一個帳號名稱為easy,使用者輸入密碼後即可建立帳號與密碼
sudo mosquitto_passwd -c /etc/mosquitto/passwd easyPassword: xxxxReenter password: xxxx設定ACL(Access Control List)
Path :
/etc/mosquitto/acl
內容如下:# 用戶easy 對於主題hello/world 能夠進行寫入user easytopic write hello/world# 用戶easy 對於主題hello/world 能夠進行讀取user easytopic read hello/world最後更改
/etc/mosquitto/mosquitto.conf
設定檔allow_anonymous false #不允許匿名傳輸password_file /etc/mosquitto/passwd #配置用戶(username)密碼acl_file /etc/mosquitto/acl #設置用戶與主題(topic)存取權限測試
Subscribe
mosquitto_sub -h "<IP address>" -v -d -t "<topic's name'>" -u "<User>" -P "<Possword>"Publish
mosquitto_pub -h "<IP address>" -v -t "<Topic's name>" -m "<Message>" -u "<User>" -P "<Possword>"
預先共享密鑰(Pre-shared Key)加密
這個認證方式需要使用到OpenSSL中的預先共享密鑰加密方式,而在OpenBSD開發的LibreSSL專案中,因為SSL/TLS安全性的問題,預先共享密鑰加密方式暫時被移除了。
未移除之前的修改方式如下:
設定PSK(Pre-Shared Key)
Path :
/etc/mosquitto/psk
內容如下:每一行有兩個欄位以':'隔開,第一個欄位為帳號而第二個欄位即為密鑰
#帳號:密鑰easy:b7ecaa34a9dbd7bfb8e9ee707427176d04d19eb3修改
/etc/mosquitto/mosquitto.conf
設定檔#不允許匿名傳輸allow_anonymous false# 取消 MQTT username for accessrequire_certificate true# 開啟 pre-shared-key based encryptionuse_identity_as_username true# 設置 psk_filepsk_file /mosquitto/psk
測試
Subscribe
mosquitto_sub -h "<IP address>" -v -d -t "<topic's name'>" --psk-identity "<id>" -psk "<key>"Publish
mosquitto_pub -h "<IP address>" -v -t "<Topic's name>" --psk-identity "<id>" -psk "<key>" -m "<Message>"
憑證加密
TLS是非常成熟的安全協議,在握手的時候便可以創建安全連接,使得駭客無法竊聽或者篡改內容。使用TLS的時候有以下注意點:
- 盡可能使用高版本的TLS。
- 驗證X509憑證連結防止中間人攻擊。
- 儘量使用有CA發佈的證書。
產生憑證的方法可以參考如下
產生憑證
建立CA(Certificate Authority)所需的證書及密鑰
openssl req -new -x509 -days 365 -extensions v3_ca -keyout ca.key -out ca.crt系統端的憑證
# 產生不加密的金鑰openssl genrsa -out server.key 2048# 產生憑證簽發請求檔案(Certificate Signing Request)openssl req -new -key server.key -out server.csr# 憑證簽發openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365修改
/etc/mosquitto/mosquitto.conf
設定檔listener 8883cafile /etc/mosquitto/ca.crtcertfile /etc/mosquitto/server.crtkeyfile /etc/mosquitto/server.key測試
Subscribe
mosquitto_sub -d -h "<IP address>" -p 8883 -t topic --cafile ca.crtPublish
mosquitto_pub -d -h "<IP address>" -p 8883 -t topic -m "Hello World!" --cafile ca.crt
參考來源:
沒有留言:
張貼留言