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

一、 SSL簡介

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

clipboard.png

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

目前,SSL被大量應用於http的安全通訊中,MQTT協議與http協議一樣屬於應用層協議,所以也能夠像http協議同樣使用ssl爲本身的通訊提供安全保證。ubuntu

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的實現。服務器

二、 Openssl安裝與經常使用命令說明

2.一、安裝
在ubuntu14.04上安裝Openssl的命令以下:tcp

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.一、產生CA的key和證書文件
使用命令爲:ui

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

該命令將爲CA產生一個名字爲「ca.key」的key文件和一個名字爲「ca.crt」的證書文件,這個crt就是CA本身給本身簽名的證書文件。this

該命令中選項「-x509」表示該條命令將產生自簽名的證書,通常都是測試的時候採用。

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

clipboard.png

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

clipboard.png

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.三、使用本身產生的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.四、修改mosquitto配置文件
爲了使用SSL功能Mosquito的配置文件mosquitto.conf須要修改如下四個地方:
(1) port 參數,mosquitto官方網站建議在使用功能的時候使用8883端口,以下所示:

clipboard.png

clipboard.png

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

clipboard.png

2.五、運行程序
(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) 製做簽發證書的請求文件時,須要輸入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的對比。

相關文章
相關標籤/搜索