Mosquitto服务器的搭建以及SSL/TLS安全通信配置
Mosquitto服務(wù)器的搭建以及SSL/TLS安全通信配置
摘自:https://segmentfault.com/a/1190000005079300
openhab
8k 次閱讀 · 讀完需要 22 分鐘
0
1、 SSL簡(jiǎn)介
SSL(SecureSocket Layer)安全套接層,是網(wǎng)景公司提出的用于保證Server與client之間安全通信的一種協(xié)議,該協(xié)議位于TCP/IP協(xié)議與各應(yīng)用層協(xié)議之間,即SSL獨(dú)立于各應(yīng)用層協(xié)議,因此各應(yīng)用層協(xié)議可以透明地調(diào)用SSL來(lái)保證自身傳輸?shù)陌踩裕琒SL與TCP/IP協(xié)議及其其他應(yīng)用層協(xié)議之間的關(guān)系如圖1所示。
圖1 SSL/TLS協(xié)議與應(yīng)用層協(xié)議及tcp/ip層協(xié)議的關(guān)系
目前,SSL被大量應(yīng)用于http的安全通信中,MQTT協(xié)議與http協(xié)議同樣屬于應(yīng)用層協(xié)議,因此也可以像http協(xié)議一樣使用ssl為自己的通信提供安全保證。
SSL與TLS(Transport LayerSecurity Protocol)之間的關(guān)系:
TLS(TransportLayer Security,傳輸層安全協(xié)議)是IETF(InternetEngineering Task Force,Internet工程任務(wù)組)制定的一種新的協(xié)議,它建立在SSL 3.0協(xié)議規(guī)范之上,是SSL 3.0的后續(xù)版本。在TLS與SSL3.0之間存在著顯著的差別,主要是它們所支持的加密算法不同,所以TLS與SSL3.0不能互操作。
開(kāi)源的算法Openssl對(duì)SSL以及TLS1.0都能提供較好的支持,因此,后面使用mosquitto時(shí)也采用Openssl作為SSL的實(shí)現(xiàn)。
2、 Openssl安裝與常用命令說(shuō)明
2.1、安裝
在ubuntu14.04上安裝Openssl的命令如下:
apt-get install openssl-devel
注意在安裝的時(shí)候要安裝“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)這三臺(tái)機(jī)子,其中使用A制作CA證書(shū);B作為服務(wù)器端上運(yùn)行mosquitto實(shí)例,在C上運(yùn)行一個(gè)訂閱端,一個(gè)發(fā)布端。
2.1、產(chǎn)生CA的key和證書(shū)文件
使用命令為:
openssl req -new -x509 -days 36500-extensions v3_ca -keyout ca.key -out ca.crt
該命令將為CA產(chǎn)生一個(gè)名字為“ca.key”的key文件和一個(gè)名字為“ca.crt”的證書(shū)文件,這個(gè)crt就是CA自己給自己簽名的證書(shū)文件。
該命令中選項(xiàng)“-x509”表示該條命令將產(chǎn)生自簽名的證書(shū),一般都是測(cè)試的時(shí)候采用。
命令執(zhí)行過(guò)程中將需要輸入國(guó)別、省份(或州)、市、Common Name等參數(shù),其中最需要注意的是” Common Name”這個(gè)參數(shù),它必須是當(dāng)前機(jī)子的IP地址,使用主機(jī)名不行。如下截圖所示
特別要注意的是Common Name參數(shù)需要填寫(xiě)主機(jī)的IP地址,使用主機(jī)名不行。
本步結(jié)束即產(chǎn)生自己的CA,它有兩個(gè)文件“ca.key“和”ca.crt“:
2.2、使用自己產(chǎn)生的CA為server簽發(fā)證書(shū)
將3.1中產(chǎn)生的CA文件拷貝mosquitto server所在機(jī)子上(其主機(jī)名字為cddserver3)的某個(gè)位置,例如:/home/lvhao/w/ssl,然后使用該CA為server產(chǎn)生證書(shū)文件。如下截圖所示:
圖2-3
(1)產(chǎn)生密鑰文件server.key,為了減少測(cè)試過(guò)程中總是提出輸入密碼的麻煩,這里將為server產(chǎn)生一個(gè)不加密的密鑰文件。過(guò)程如下截圖所示:
該命令將產(chǎn)生一個(gè)不加密的RSA私鑰,其中參數(shù)“2048”表示私鑰的長(zhǎng)度,這里產(chǎn)生的私鑰文件“server.key”將在下一步使用,同時(shí)在mosquitto程序的配置文件中也需要使用。opensslgenrsa -out server.key 2048
圖2-4
如果需要為產(chǎn)生的RSA私鑰加密,則需加上選項(xiàng)“-des3”,對(duì)私鑰文件加密之后,后續(xù)使用該密鑰的時(shí)候都要求輸入密碼。產(chǎn)生加密RSA私鑰文件的命令如下:
opensslgenrsa -des3 -out server.key 2048
如果為RSA私鑰文件加密了,則一定要記好密碼,后面產(chǎn)生csr文件時(shí)以及后續(xù)使用該私鑰文件都會(huì)用到該密碼。
(2)產(chǎn)生證書(shū)簽發(fā)的請(qǐng)求文件server.csr。過(guò)程如下截圖所示:
該命令將使用上一步產(chǎn)生的“server.key”文件為server產(chǎn)生一個(gè)簽發(fā)證書(shū)所需要的請(qǐng)求文件:server.csr,使用該文件向CA發(fā)送請(qǐng)求才會(huì)得到CA簽發(fā)的證書(shū)。
opensslreq -out server.csr -key server.key -new
圖2-5
同樣該過(guò)程需要注意Common Name參數(shù)需要填寫(xiě)當(dāng)前主機(jī)的IP地址。
(3)為mosquitto server產(chǎn)生證書(shū)文件:server.crt,這一步將需要輸入CA的密碼,同樣,這里也可以看到剛才為CA輸入的參數(shù)國(guó)別、省份等參數(shù),過(guò)程如下截圖所示:
openssl x509 -req -in server.csr -CA ca.crt-CAkey ca.key -CAcreateserial -out server.crt -days 36500
該命令將使用CA的密鑰文件ca.key,CA的證書(shū)文件ca.crt和上一步為mosquitto server產(chǎn)生證書(shū)請(qǐng)求文件server.csr文件這三個(gè)文件向CA請(qǐng)求產(chǎn)生一個(gè)證書(shū)文件,證書(shū)文件的名字為:server.crt。該命令中的36500可以修改為自己定義的時(shí)間值。
圖2-6
2.3、使用自己產(chǎn)生的CA為client簽發(fā)證書(shū)該過(guò)程與3.2類(lèi)似。
首先,將3.1中產(chǎn)生的CA文件拷貝mosquittoclient所在機(jī)子C(其主機(jī)名字為cddserver1)上的某個(gè)位置,例如:/home/lvhao/w/ssl,然后使用該CA為server產(chǎn)生證書(shū)文件。如下截圖所示:
圖2-7
(1)產(chǎn)生密鑰文件client.key,過(guò)程如下截圖所示:
openssl genrsa-out client.key 2048
(2)產(chǎn)生一個(gè)簽發(fā)證書(shū)的請(qǐng)求文件"client.csr "
openssl req-out client.csr -key client.key-new
產(chǎn)生證書(shū)請(qǐng)求文件時(shí)需要第一步產(chǎn)生的私鑰文件client.key作為輸入。
(3) CA為mosquitto客戶(hù)端產(chǎn)生一個(gè)證書(shū)文件”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需要修改以下四個(gè)地方:
(1)port 參數(shù),mosquitto官方網(wǎng)站建議在使用功能的時(shí)候使用8883端口,如下所示:
(2)修改cafile參數(shù),該參數(shù)表示CA的證書(shū)文件的位置,需將其設(shè)置為正確的位置,例如下圖所示
2.5、運(yùn)行程序
(1)啟動(dòng)mosquitto server端【機(jī)器B】
使用修改后的配置文件啟動(dòng)mosquitto程序,上面修改的配置文件的路徑,在mosquitto目錄下,因此需要用-c參數(shù)指定其位置,如下圖所示:
(2)啟動(dòng)訂閱端【機(jī)器C】:
訂閱端所在ssl文件的路徑為:/home/jason.hou/ssl,啟動(dòng)時(shí)所使用的命令為:
./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)啟動(dòng)發(fā)布端【機(jī)器C】
啟動(dòng)時(shí)所使用的命令為:
./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) 發(fā)布消息之后,mosquitto、訂閱端、發(fā)布端的截圖如下:
Mosquito:
發(fā)布端【機(jī)器C】:
訂閱端【機(jī)器C】:
1、 注意事項(xiàng)
(1) 制作簽發(fā)證書(shū)的請(qǐng)求文件時(shí),需要輸入Common Name參數(shù),此參數(shù)一定為當(dāng)前主機(jī)的IP地址,否則將會(huì)顯示證書(shū)錯(cuò)誤。
(2) 如果不想SSL在身份認(rèn)證的時(shí)候檢查主機(jī)名(也即上面不檢查第1條中Common Name參數(shù)),則需要在啟動(dòng)訂閱端的時(shí)候,加上“--insecure”參數(shù),例如:
./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) 自測(cè)過(guò)程中,server端與所有客戶(hù)端所使用的證書(shū)必須由一個(gè)CA簽發(fā),否則,將會(huì)提示CA不識(shí)別的問(wèn)題。
3 Mosquitto的安裝:
見(jiàn)網(wǎng)址:
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
進(jìn)入目錄
cd mosquitto-1.4.10
編譯
make
安裝
sudo make install
3.2 安裝注意點(diǎn)
【1】編譯找不到openssl/ssl.h
【解決方法】——安裝openssl
sudo apt-get install libssl-dev
【2】編譯過(guò)程找不到ares.h
sudo apt-get install libc-ares-dev
【3】編譯過(guò)程找不到uuid/uuid.h
sudo apt-get install uuid-dev
【4】使用過(guò)程中找不到libmosquitto.so.1
errorwhileloading shared libraries: libmosquitto.so.1: cannotopenshared object file: No such fileordirectory
【解決方法】——修改libmosquitto.so位置
創(chuàng)建鏈接
sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
更新動(dòng)態(tài)鏈接庫(kù)
sudo ldconfig
【5】make: g++:命令未找到
【解決方法】安裝g++編譯器
sudo apt-get install g++
3.2 簡(jiǎn)單測(cè)試
一個(gè)完整的MQTT示例包括一個(gè)代理器,一個(gè)發(fā)布者和一個(gè)訂閱者。測(cè)試分為以下幾個(gè)步驟:
【1】啟動(dòng)服務(wù)mosquitto。
【2】訂閱者通過(guò)mosquitto_sub訂閱指定主題的消息。
【3】發(fā)布者通過(guò)mosquitto_pub發(fā)布指定主題的消息。
【4】代理服務(wù)器把該主題的消息推送到訂閱者。
【測(cè)試說(shuō)明】
測(cè)試環(huán)境:ubuntu 14.04 虛擬機(jī)
在本例中,發(fā)布者、代理和訂閱者均為localhsot,但是在實(shí)際的情況下三種并不是同一個(gè)設(shè)備,在mosquitto中可通過(guò)-h(--host)設(shè)置主機(jī)名稱(chēng)(hostname)。為了實(shí)現(xiàn)這個(gè)簡(jiǎn)單的測(cè)試案例,需要在linux中打開(kāi)三個(gè)控制臺(tái),分別代表代理服務(wù)器、發(fā)布者和訂閱者。
3.2.1 啟動(dòng)代理服務(wù)
mosquitto-v
【-v】打印更多的調(diào)試信息
3.2.2 訂閱主題
mosquitto_sub-v -t sensor
【-t】指定主題,此處為sensor
【-v】打印更多的調(diào)試信息
3.2.3 發(fā)布內(nèi)容
mosquitto_pub-t sensor -m12
【-t】指定主題
【-m】指定消息內(nèi)容
3.2.4 運(yùn)行結(jié)果
當(dāng)發(fā)布者推送消息之后,訂閱者獲得以下內(nèi)容
sensor12
而代理服務(wù)器控制臺(tái)中會(huì)出現(xiàn)——連接、消息發(fā)布和心跳等調(diào)試信息。通過(guò)代理服務(wù)器的調(diào)試輸出可以對(duì)MQTT協(xié)議的相關(guān)過(guò)程有所了解。
4 總結(jié)
服務(wù)器Apollo與Mosquitto的對(duì)比。
總結(jié)
以上是生活随笔為你收集整理的Mosquitto服务器的搭建以及SSL/TLS安全通信配置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 玖富万卡帮你还放款中会拒吗?放款失败是怎
- 下一篇: EC+VO+SCOPE for ES3