Mosquitto服務器的搭建以及SSL/TLS安全通信配置
摘自:https://segmentfault.com/a/1190000005079300
1、 SSL簡介
SSL(SecureSocket Layer)安全套接層,是網景公司提出的用於保證Server與client之間安全通信的一種協議,該協議位於TCP/IP協議與各應用層協議之間,即SSL獨立於各應用層協議,因此各應用層協議可以透明地調用SSL來保證自身傳輸的安全性,SSL與TCP/IP協議及其其他應用層協議之間的關系如圖1所示。
圖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功能的具體操作方法
將使用: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地址,使用主機名不行。如下截圖所示
特別要注意的是Common Name參數需要填寫主機的IP地址,使用主機名不行。
本步結束即產生自己的CA,它有兩個文件“ca.key“和”ca.crt“:
2.2、使用自己產生的CA為server簽發證書
將3.1中產生的CA文件拷貝mosquitto server所在機子上(其主機名字為cddserver3)的某個位置,例如:/home/lvhao/w/ssl,然后使用該CA為server產生證書文件。如下截圖所示:
圖2-3
(1)產生密鑰文件server.key,為了減少測試過程中總是提出輸入密碼的麻煩,這里將為server產生一個不加密的密鑰文件。過程如下截圖所示:
該命令將產生一個不加密的RSA私鑰,其中參數“2048”表示私鑰的長度,這里產生的私鑰文件“server.key”將在下一步使用,同時在mosquitto程序的配置文件中也需要使用。opensslgenrsa -out server.key 2048
圖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
圖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產生證書文件。如下截圖所示:
圖2-7
(1) 產生密鑰文件client.key,過程如下截圖所示:
openssl genrsa-out client.key 2048
(2) 產生一個簽發證書的請求文件"client.csr "
openssl req-out client.csr -key client.key-new
產生證書請求文件時需要第一步產生的私鑰文件client.key作為輸入。
(3) CA為mosquitto客戶端產生一個證書文件”client.crt”
opensslx509 -req -in client.csr-CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 36500
2.4、修改mosquitto配置文件
為了使用SSL功能Mosquito的配置文件mosquitto.conf需要修改以下四個地方:
(1) port 參數,mosquitto官方網站建議在使用功能的時候使用8883端口,如下所示:
(2) 修改cafile參數,該參數表示CA的證書文件的位置,需將其設置為正確的位置,例如下圖所示
2.5、運行程序
(1)啟動mosquitto server端【機器B】
使用修改后的配置文件啟動mosquitto程序,上面修改的配置文件的路徑,在mosquitto目錄下,因此需要用-c參數指定其位置,如下圖所示:
(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
如下圖所示:
(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
如下圖所示:
(5) 發布消息之后,mosquitto、訂閱端、發布端的截圖如下:
Mosquito:
發布端【機器C】:
訂閱端【機器C】:
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中打開三個控制台,分別代表代理服務器、發布者和訂閱者。
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協議的相關過程有所了解。
4 總結
服務器Apollo與Mosquitto的對比。