1、 SSL簡介
SSL(SecureSocket Layer)安全套接層,是網(wǎng)景公司提出的用于保證Server與client之間安全通信的一種協(xié)議,該協(xié)議位于TCP/IP協(xié)議與各應用層協(xié)議之間,即SSL獨立于各應用層協(xié)議,因此各應用層協(xié)議可以透明地調(diào)用SSL來保證自身傳輸?shù)陌踩?,SSL與TCP/IP協(xié)議及其其他應用層協(xié)議之間的關系如圖1所示。
圖1 SSL/TLS協(xié)議與應用層協(xié)議及tcp/ip層協(xié)議的關系
目前,SSL被大量應用于http的安全通信中,MQTT協(xié)議與http協(xié)議同樣屬于應用層協(xié)議,因此也可以像http協(xié)議一樣使用ssl為自己的通信提供安全保證。
SSL與TLS(Transport LayerSecurity Protocol)之間的關系:TLS(TransportLayer Security,傳輸層安全協(xié)議)是IETF(InternetEngineering Task Force,Internet工程任務組)制定的一種新的協(xié)議,它建立在SSL 3.0協(xié)議規(guī)范之上,是SSL 3.0的后續(xù)版本。在TLS與SSL3.0之間存在著顯著的差別,主要是它們所支持的加密算法不同,所以TLS與SSL3.0不能互操作。
開源的算法Openssl對SSL以及TLS1.0都能提供較好的支持,因此,后面使用mosquitto時也采用Openssl作為SSL的實現(xiàn)。
2、 Openssl安裝與常用命令說明
2.1、安裝
在CentOS6.3上安裝Openssl的命令如下:
yum install openssl-devel
注意在安裝的時候要安裝“openssl-devel”,而不是“openssl”。
安裝成功之后可以使用如下命令查看openssl的版本:
[root@cddserver1~]# openssl version
OpenSSL1.0.1e-fips 11 Feb 2013
2.2、常用命令說明
SSL在身份認證過程中需要有一個雙方都信任的CA簽發(fā)的證書,CA簽發(fā)證書是需要收費的,但是在測試過程中,可以自己產(chǎn)生一個CA,然后用自己產(chǎn)生的CA簽發(fā)證書,下面的mosquitto的ssl功能的測試過程就是采用這一方式,其過程如下:
1) 產(chǎn)生自己的CA,該過程將為CA產(chǎn)生兩個文件:ca.key和ca.crt(文件的名字可以修改),其中ca.key是我們自己產(chǎn)生的CA的“密鑰文件“,ca.crt是我們自己產(chǎn)生的CA的”證書文件“,本步結(jié)束CA將擁有兩個文件ca.key和ca.crt,然后將為CA產(chǎn)生的這兩個文件分別拷貝到mosquitto server及客戶端所在的機子上;
2) 在server所在的機子上,使用這個自己產(chǎn)生的CA為mosquitto的server端簽發(fā)證書,本步將產(chǎn)生server.key,server.csr和server.crt三個文件(文件名字可以修改),這里server.csr是簽發(fā)證書的請求文件,CA為server端產(chǎn)生證書文件時將用到它,產(chǎn)生完證書文件之后,該文件就不用了;server.key和 server.crt這兩個文件將會在后續(xù)的SSL通信過程中用到。
3) 在測試客戶端所用的機子上,使用這個自己產(chǎn)生的CA為mosquitto的客戶端簽發(fā)證書;本步將產(chǎn)生client.key,client.csr和client.crt三個文件(文件名字可以修改),各文件的含義跟server端類似。
上述三個過程將使用openssl完成,將用到如下幾條相關的命令:
l 產(chǎn)生CA的key和證書文件
openssl req -new -x509 -days 36500-extensions v3_ca -keyout ca.key -out ca.crt
該命令將為CA產(chǎn)生一個名字為“ca.key”的key文件和一個名字為“ca.crt”的證書文件,這個crt就是CA自己給自己簽名的證書文件。
該命令中選項“-x509”表示該條命令將產(chǎn)生自簽名的證書,一般都是測試的時候采用。
l 為mosquittoserver私鑰文件“server.key”和證書文件”server.crt”
(1)為mosquittoserver產(chǎn)生一個私鑰文件server.key
opensslgenrsa -out server.key 2048
該命令將產(chǎn)生一個不加密的RSA私鑰,其中參數(shù)“2048”表示私鑰的長度,這里產(chǎn)生的私鑰文件“server.key”將在下一步使用,同時在mosquitto程序的配置文件中也需要使用。
如果需要為產(chǎn)生的RSA私鑰加密,則需加上選項“-des3”,對私鑰文件加密之后,后續(xù)使用該密鑰的時候都要求輸入密碼。產(chǎn)生加密RSA私鑰文件的命令如下:
opensslgenrsa -des3 -out server.key 2048
如果為RSA私鑰文件加密了,則一定要記好密碼,后面產(chǎn)生csr文件時以及后續(xù)使用該私鑰文件都會用到該密碼。
(2)為mosquitto server產(chǎn)生一個簽發(fā)證書的請求文件“server.csr”
opensslreq -out server.csr -key server.key -new
該命令將使用上一步產(chǎn)生的“server.key”文件為server產(chǎn)生一個簽發(fā)證書所需要的請求文件:server.csr,使用該文件向CA發(fā)送請求才會得到CA簽發(fā)的證書。
(3)CA為mosquitto server產(chǎn)生一個證書文件
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產(chǎn)生證書請求文件server.csr文件這三個文件向CA請求產(chǎn)生一個證書文件,證書文件的名字為:server.crt。該命令中的36500可以修改為自己定義的時間值。
l 為mosquitto的客戶端程序產(chǎn)生私鑰文件”client.key”和證書文件“client.crt”,過程與為server端類似,這里將不再累述。
(1) 為mosquittoserver產(chǎn)生一個私鑰文件”client.key”
openssl genrsa-out client.key 2048
(2) 為mosquitto客戶端產(chǎn)生一個簽發(fā)證書的請求文件“client.csr “
openssl req-out client.csr -key client.key-new
產(chǎn)生證書請求文件時需要第一步產(chǎn)生的私鑰文件client.key作為輸入。
(3) CA為mosquitto客戶端產(chǎn)生一個證書文件”client.crt”
opensslx509 -req -in client.csr-CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 36500
3、 Mosquito使用ssl功能的具體操作方法
下面的例子中,將使用:A(192.168.4.222),B(192.168.4.223)和C(192.168.4.221)這三臺機子,其中使用A制作CA證書;在B上運行mosquitto實例,在C上運行一個訂閱端,一個發(fā)布端。
3.1、產(chǎn)生CA
測試過程中CA在主機cddserver3上;另外,測試過程中,無需采用真正的CA,使用我們自己產(chǎn)生的CA即可,使用命令為:
openssl req -new-x509 -days 36500 -extensions v3_ca -keyout ca.key -out ca.crt
命令執(zhí)行過程中將需要輸入國別、省份(或州)、市、Common Name等參數(shù),其中最需要注意的是” Common Name”這個參數(shù),它必須是當前機子的IP地址,使用主機名不行。如下截圖所示
特別要注意的是Common Name參數(shù)需要填寫主機的IP地址,使用主機名不行。
本步結(jié)束即產(chǎn)生自己的CA,它有兩個文件“ca.key“和”ca.crt“:
3.2、使用自己產(chǎn)生的CA為server簽發(fā)證書
將3.1中產(chǎn)生的CA文件拷貝mosquitto server所在機子上(其主機名字為cddserver3)的某個位置,例如:/home/jason.hou/ssl,然后使用該CA為server產(chǎn)生證書文件。如下截圖所示:
(1)產(chǎn)生密鑰文件server.key,為了減少測試過程中總是提出輸入密碼的麻煩,這里將為server產(chǎn)生一個不加密的密鑰文件。過程如下截圖所示:
圖3-4
(2)產(chǎn)生證書簽發(fā)的請求文件server.csr。過程如下截圖所示:
圖3-5
同樣該過程需要注意Common Name參數(shù)需要填寫當前主機的IP地址。
(3)為mosquitto server產(chǎn)生證書文件:server.crt,這一步將需要輸入CA的密碼,同樣,這里也可以看到剛才為CA輸入的參數(shù)國別、省份等參數(shù),過程如下截圖所示:
圖3-6
3.3、使用自己產(chǎn)生的CA為client簽發(fā)證書
該過程與3.2類似。首先,將3.1中產(chǎn)生的CA文件拷貝mosquittoclient所在機子(其主機名字為cddserver1)上的某個位置,例如:/home/jason.hou/ssl,然后使用該CA為server產(chǎn)生證書文件。如下截圖所示:
圖3-7
(1) 產(chǎn)生密鑰文件client.key,過程如下截圖所示:
圖3-8
(2) 產(chǎn)生證書請求文件client.csr,過程如下截圖所示:
圖3-9
(3) 為客戶產(chǎn)生證書文件Client.crt,過程如下截圖所示:
圖3-10
3.4、修改mosquitto配置文件
為了使用SSL功能Mosquito的配置文件mosquitto.conf需要修改以下四個地方:
(1) port 參數(shù),mosquitto官方網(wǎng)站建議在使用功能的時候使用8883端口,如下所示:
圖3-11(1)
圖3-11(2)
(2) 修改cafile參數(shù),該參數(shù)表示CA的證書文件的位置,需將其設置為正確的位置,例如下圖所示
圖3-12
(3) 修改certfile參數(shù),該參數(shù)表示CA為server端簽發(fā)的證書文件的位置,如上圖所示。
(4) 修改keyfile參數(shù),該參數(shù)表示server端使用的key文件的位置。如上圖所示。
3.5、運行程序
(1)啟動mosquitto server端
使用修改后的配置文件啟動mosquitto程序,上面修改的配置文件的路徑,在mosquitto目錄下,因此需要用-c參數(shù)指定其位置,如下圖所示:
圖3-13
(2)啟動訂閱端:
訂閱端所在ssl文件的路徑為:/home/jason.hou/ssl,啟動時所使用的命令為:
./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
如下圖所示:
圖3-14
(4) 啟動發(fā)布端
啟動時所使用的命令為:
./mosquitto_pub -h192.168.4.223 -p 8883 -t "111" -m "this is jason.hou"--cafile /home/jason.hou/ssl/ca.crt --cert /home/jason.hou/ssl/client.crt --key/home/jason.hou/ssl/client.key
如下圖所示:
圖3-15
(5) 發(fā)布消息之后,mosquitto、訂閱端、發(fā)布端的截圖如下:
Mosquito:
圖3-16
發(fā)布端:
圖3-17
訂閱端:
圖3-18
1、 注意事項
(1) 制作簽發(fā)證書的請求文件時,需要輸入Common Name參數(shù),此參數(shù)一定為當前主機的IP地址,否則將會顯示證書錯誤。
(2) 如果不想SSL在身份認證的時候檢查主機名(也即上面不檢查第1條中Common Name參數(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) 自測過程中,server端與所有客戶端所使用的證書必須由一個CA簽發(fā),否則,將會提示CA不識別的問題。
問題提示為:
1398166026:New connection from 192.168.4.221 on port 8883.
1398166026:OpenSSL Error: error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknownca
1398166026:OpenSSL Error: error:140940E5:SSL routines:SSL3_READ_BYTES:ssl handshakefailure
1398166026:Socket error on client (null), disconnecting.
如下圖所示:
圖3-19