Mosquitto服務器的搭建以及SSL/TLS安全通信配置


Mosquitto服務器的搭建以及SSL/TLS安全通信配置

摘自:https://segmentfault.com/a/1190000005079300

0

1、 SSL簡介

SSL(SecureSocket Layer)安全套接層,是網景公司提出的用於保證Server與client之間安全通信的一種協議,該協議位於TCP/IP協議與各應用層協議之間,即SSL獨立於各應用層協議,因此各應用層協議可以透明地調用SSL來保證自身傳輸的安全性,SSL與TCP/IP協議及其其他應用層協議之間的關系如圖1所示。

clipboard.png

圖1 SSL/TLS協議與應用層協議及tcp/ip層協議的關系

目前,SSL被大量應用於http的安全通信中,MQTT協議與http協議同樣屬於應用層協議,因此也可以像http協議一樣使用ssl為自己的通信提供安全保證。

SSL與TLS(Transport LayerSecurity Protocol)之間的關系:
TLS(TransportLayer Security,傳輸層安全協議)是IETF(InternetEngineering Task Force,Internet工程任務組)制定的一種新的協議,它建立在SSL 3.0協議規范之上,是SSL 3.0的后續版本。在TLS與SSL3.0之間存在着顯著的差別,主要是它們所支持的加密算法不同,所以TLS與SSL3.0不能互操作。

開源的算法Openssl對SSL以及TLS1.0都能提供較好的支持,因此,后面使用mosquitto時也采用Openssl作為SSL的實現。

2、 Openssl安裝與常用命令說明

2.1、安裝
在ubuntu14.04上安裝Openssl的命令如下:

apt-get install openssl-devel 

注意在安裝的時候要安裝“openssl-devel”,而不是“openssl”。
安裝成功之后可以使用如下命令查看openssl的版本:

w@w:~$ openssl version OpenSSL 1.0.1f 6 Jan 2014 

2 Mosquito使用ssl功能的具體操作方法

clipboard.png

將使用:A【cddserver2】(172.18.206.221)B【cddserver3】(172.18.195.182)C【cddserver1】(172.18.205.63)這三台機子,其中使用A制作CA證書B作為服務器端上運行mosquitto實例在C上運行一個訂閱端,一個發布端。

2.1、產生CA的key和證書文件
使用命令為:

openssl req -new -x509 -days 36500-extensions v3_ca -keyout ca.key -out ca.crt 

該命令將為CA產生一個名字為“ca.key”的key文件和一個名字為“ca.crt”的證書文件,這個crt就是CA自己給自己簽名的證書文件。

該命令中選項“-x509”表示該條命令將產生自簽名的證書,一般都是測試的時候采用。

命令執行過程中將需要輸入國別、省份(或州)、市、Common Name等參數,其中最需要注意的是” Common Name”這個參數,它必須是當前機子的IP地址,使用主機名不行。如下截圖所示

clipboard.png

特別要注意的是Common Name參數需要填寫主機的IP地址,使用主機名不行。
本步結束即產生自己的CA,它有兩個文件“ca.key“和”ca.crt“:

clipboard.png

2.2、使用自己產生的CA為server簽發證書
將3.1中產生的CA文件拷貝mosquitto server所在機子上(其主機名字為cddserver3)的某個位置,例如:/home/lvhao/w/ssl,然后使用該CA為server產生證書文件。如下截圖所示:

clipboard.png
圖2-3

(1)產生密鑰文件server.key,為了減少測試過程中總是提出輸入密碼的麻煩,這里將為server產生一個不加密的密鑰文件。過程如下截圖所示:
該命令將產生一個不加密的RSA私鑰,其中參數“2048”表示私鑰的長度,這里產生的私鑰文件“server.key”將在下一步使用,同時在mosquitto程序的配置文件中也需要使用。
opensslgenrsa -out server.key 2048
clipboard.png
圖2-4

如果需要為產生的RSA私鑰加密,則需加上選項“-des3”,對私鑰文件加密之后,后續使用該密鑰的時候都要求輸入密碼。產生加密RSA私鑰文件的命令如下:

opensslgenrsa -des3 -out server.key 2048 

如果為RSA私鑰文件加密了,則一定要記好密碼,后面產生csr文件時以及后續使用該私鑰文件都會用到該密碼。

(2)產生證書簽發的請求文件server.csr。過程如下截圖所示:
該命令將使用上一步產生的“server.key”文件為server產生一個簽發證書所需要的請求文件:server.csr,使用該文件向CA發送請求才會得到CA簽發的證書。

opensslreq -out server.csr -key server.key -new
clipboard.png
圖2-5

同樣該過程需要注意Common Name參數需要填寫當前主機的IP地址。

(3)為mosquitto server產生證書文件:server.crt,這一步將需要輸入CA的密碼,同樣,這里也可以看到剛才為CA輸入的參數國別、省份等參數,過程如下截圖所示:

openssl x509 -req -in server.csr -CA ca.crt-CAkey ca.key -CAcreateserial -out server.crt -days 36500 

該命令將使用CA的密鑰文件ca.key,CA的證書文件ca.crt和上一步為mosquitto server產生證書請求文件server.csr文件這三個文件向CA請求產生一個證書文件,證書文件的名字為:server.crt。該命令中的36500可以修改為自己定義的時間值。

圖2-6

2.3、使用自己產生的CA為client簽發證書該過程與3.2類似。
首先,將3.1中產生的CA文件拷貝mosquittoclient所在機子C(其主機名字為cddserver1)上的某個位置,例如:/home/lvhao/w/ssl,然后使用該CA為server產生證書文件。如下截圖所示:

clipboard.png
圖2-7
(1) 產生密鑰文件client.key,過程如下截圖所示:

openssl genrsa-out client.key 2048 

clipboard.png

(2) 產生一個簽發證書的請求文件"client.csr "

openssl req-out client.csr -key client.key-new 

產生證書請求文件時需要第一步產生的私鑰文件client.key作為輸入。

clipboard.png

(3) CA為mosquitto客戶端產生一個證書文件”client.crt”

opensslx509 -req -in client.csr-CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 36500 

clipboard.png

2.4、修改mosquitto配置文件
為了使用SSL功能Mosquito的配置文件mosquitto.conf需要修改以下四個地方:
(1) port 參數,mosquitto官方網站建議在使用功能的時候使用8883端口,如下所示:

clipboard.png

clipboard.png

(2) 修改cafile參數,該參數表示CA的證書文件的位置,需將其設置為正確的位置,例如下圖所示

clipboard.png

2.5、運行程序
(1)啟動mosquitto server端【機器B】
使用修改后的配置文件啟動mosquitto程序,上面修改的配置文件的路徑,在mosquitto目錄下,因此需要用-c參數指定其位置,如下圖所示:

clipboard.png

(2)啟動訂閱端【機器C】:
訂閱端所在ssl文件的路徑為:/home/jason.hou/ssl,啟動時所使用的命令為:

./mosquitto_sub -h 172.18.195.182 -i 111 -p 8883 -t "111" --cafile /home/lvhao/w/ssl/ca.crt --cert /home/lvhao/w/ssl/client.crt --key /home/lvhao/w/ssl/client.key 

如下圖所示:

clipboard.png

(4)啟動發布端【機器C】
啟動時所使用的命令為:

./mosquitto_pub -h 172.18.195.182 -p 8883 -t "111" -m "this is w show"--cafile /home/lvhao/w/ssl/ca.crt --cert /home/lvhao/w/ssl/client.crt --key /home/lvhao/w/ssl/client.key 

如下圖所示:

clipboard.png

(5) 發布消息之后,mosquitto、訂閱端、發布端的截圖如下:
Mosquito:

clipboard.png

發布端【機器C】:

clipboard.png

訂閱端【機器C】:

clipboard.png

1、 注意事項
(1) 制作簽發證書的請求文件時,需要輸入Common Name參數,此參數一定為當前主機的IP地址,否則將會顯示證書錯誤。
(2) 如果不想SSL在身份認證的時候檢查主機名(也即上面不檢查第1條中Common Name參數),則需要在啟動訂閱端的時候,加上“--insecure”參數,例如:
./mosquitto_sub-h 192.168.4.223 -i 111 -p 8883 -t "111" --cafile/home/jason.hou/ssl/ca.crt --cert /home/jason.hou/ssl/client.crt --key/home/jason.hou/ssl/client.key --insecure
(3) 自測過程中,server端與所有客戶端所使用的證書必須由一個CA簽發,否則,將會提示CA不識別的問題。

3 Mosquitto的安裝:

見網址:
http://blog.csdn.net/xukai871...

3.1 安裝
下載源代碼包

wget http://mosquitto.org/files/source/mosquitto-1.4.10.tar.gz 

解壓

tar zxfv mosquitto-1.4.5.tar.gz 

進入目錄

cd mosquitto-1.4.10 

編譯

make 

安裝

sudo make install 

3.2 安裝注意點

【1】編譯找不到openssl/ssl.h
【解決方法】——安裝openssl

sudo apt-get install libssl-dev 

【2】編譯過程找不到ares.h

sudo apt-get install libc-ares-dev 

【3】編譯過程找不到uuid/uuid.h

sudo apt-get install uuid-dev 

【4】使用過程中找不到libmosquitto.so.1

error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory

【解決方法】——修改libmosquitto.so位置
創建鏈接

sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1 

更新動態鏈接庫

sudo ldconfig 

【5】make: g++:命令未找到 
【解決方法】安裝g++編譯器

sudo apt-get install g++ 

3.2 簡單測試

一個完整的MQTT示例包括一個代理器,一個發布者和一個訂閱者。測試分為以下幾個步驟:

【1】啟動服務mosquitto。
【2】訂閱者通過mosquitto_sub訂閱指定主題的消息。
【3】發布者通過mosquitto_pub發布指定主題的消息。
【4】代理服務器把該主題的消息推送到訂閱者。

【測試說明】
測試環境:ubuntu 14.04 虛擬機
在本例中,發布者、代理和訂閱者均為localhsot,但是在實際的情況下三種並不是同一個設備,在mosquitto中可通過-h(--host)設置主機名稱(hostname)。為了實現這個簡單的測試案例,需要在linux中打開三個控制台,分別代表代理服務器、發布者和訂閱者。

clipboard.png

3.2.1 啟動代理服務

mosquitto -v

【-v】打印更多的調試信息

3.2.2 訂閱主題

mosquitto_sub -v -t sensor

【-t】指定主題,此處為sensor
【-v】打印更多的調試信息

3.2.3 發布內容

mosquitto_pub -t sensor -m 12

【-t】指定主題
【-m】指定消息內容

3.2.4 運行結果
當發布者推送消息之后,訂閱者獲得以下內容

sensor 12

而代理服務器控制台中會出現——連接、消息發布和心跳等調試信息。通過代理服務器的調試輸出可以對MQTT協議的相關過程有所了解。

clipboard.png

4 總結

服務器Apollo與Mosquitto的對比。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM