為什么要使用ssl加密通訊
隨著互聯網快速發展,網絡安全越來越得到人們的關注。誰都不想自己的數據被人竊聽或利用,而當我們直接使用TCP連接一個服務器通訊時,此時是明文傳輸的,很容易使用抓包工具(如wireshark)抓取我們的數據包,從而分析出相關的數據。比如我們直接登陸mqtt服務器,數據報文中就包括了登陸賬號,密碼,ClientID等等信息,如果“壞人”捕捉到這些信息,那他就可以連接我們的服務器,顯然這不是我們想要的結果。
SSL就是解決其問題的一種方案。即我們可以在我們的應用程(HTTP, MQTT, FTP)與傳輸層(這里主要是TCP)之間加一級SSL加密傳輸。細心的小伙伴可以發現現在絕大多數的網站都已經采用了這種方式加密通信,從以前的http悄悄的變成了https咯~
證書和SSL的關系
證書其實是SSL中通訊過程基本保障,用來驗證服務器或客戶端是否是可信任的(這里大家可以聯想下我們在銀行辦理網上銀行時,通常銀行會給我們一個類似“K寶”的小東西,其作用就是客戶端證書,當我們登陸銀行網站交易時,網站會驗證我們是否可信任,否則不允許登陸或后續交易操作)。且公證的證書(證書機構頒發的,如CA機構)有效的防止他人仿造,保障了通訊過程的安全。而這里我們自己制作的自簽證書,僅供自己使用,并不是公認的。好了,暫時先說這么多。OK,開始進入我們的主題。
實踐操作
這里需要我們的測試環境的Ubuntu系統,已經默認安裝Openssl了,如果大家沒裝的話,可以使用apt-get install openssl相關命令安裝即可。
1. 生成CA私鑰。 這里我們自己“假裝”是CA機構,當然需要CA證書,私鑰拉,不然咋給其他人辦理業務勒~
openssl genrsa -out ca-key.pem 1024
2. 創建證書請求。 證書請求是生成證書必要過程,請求中就包含了所屬城市,單位,機構,組織,公共名等等信息。
openssl req -new -out ca-req.csr -key ca-key.pem
3. 自簽署(CA)證書,也叫根證書。之后就可以給“其他人”辦理業務咯。
openssl x509 -req -in ca-req.csr -out ca-cert.pem -signkey ca-key.pem -days 3650
以下是生成服務器證書過程,其實過程和以上生成CA證書完全一樣。
4. 生成服務器私鑰
openssl genrsa -out server-key.pem 1024
5. 生成服務器證書請求文件
openssl req -new -out server-req.csr -key server-key.pem
注意: 在Common Name必須填寫自己的服務器IP地址(或域名)。
- 將請求文件給CA 機構(這里是俺們自己~)生成服務器證書
openssl x509 -req -in server-req.csr -out server-cert.pem -signkey server-key.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -days 3650
以下是生成客戶端證書過程:
7. 生成客戶端私鑰
openssl genrsa -out client-key.pem 1024
8. 生成證書請求
openssl req -new -out client-req.csr -key client-key.pem
9. 自簽署證書
openssl x509 -req -in client-req.csr -out client-cert.pem -signkey client-key.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -days 3650
OK, 到這里我們已經完成了服務器和客戶端的證書(完全是個體力活 - -!), 接下來我們就利用我們生成的證書應用于實踐中,這里我們采用EMQ(MQTT服務器,如果小伙伴不清楚如何搭建自己MQTT客戶端的話,可以我參考我前幾篇的文章的介紹,這里就不再贅述) + mqttfx(MQTT客戶端)方式來測試。
10. 拷貝生成服務器證書(server-cert.pem)和私鑰(server-key.pem),到emq工作目錄下的/emqx/etc/certs/中,
cp server-cert.pem server-key.pem ../emqx/etc/certs/
11. 打開emqx/etc中的emqx.conf配置文件
找到
listerner.ssl.external.keyfile 和
listener.ssl.external.certfile這2個參數:
這里我們可以看到默認值與我們生成的名字對不上,我們可以直接更改emqx.conf配置文件中的值與我們的一致, 另外我們也可以保持emqx.conf文件不變,修改我們制作的證書和私鑰名字,與之一樣(這里我們采用該種方式,盡量保持emqx原生文件不變)。使用mv命令修改:
mv server-cert.pem cert.pem
mv server-key.pem key.pem
12. 將Ubuntu中制作的CA和客戶端相關證書,密鑰拷貝到windows中(這是因為之后我們要利用Windows中的mqttfx客戶端測試)。
cp c* /mnt/hgfs/winshare/my_cert/ //winshare是我的Ubuntu和Windows共享文件夾
13. 打開mqttfx客戶端
首先點擊“User Creentials”設置服務器地址,端口號(emq加密ssl端口默認為8883),登陸用戶名,密碼(如果emq關閉匿名登陸則必須填寫正確的用戶名和密碼,如果打開匿名登陸,則可以不管)等信息。
然后點擊1)“SSL/TLS”, 進行相關配置:
2)勾選"Enable SSL/TLS"
3) 勾選“Self signed certificates”
4)分別加載我們之前生成的CA證書,客戶端證書,客戶端私鑰
5)勾選“PEM Formatted”
設置完以上,點擊“Apply”或OK,回到主界面,點擊“Connect”連接我們Ubuntu中emq服務器
之后,我們就可以放心與服務器加密通訊咯。
最后
至此我們已經實現了搭建自己的MQTT服務器,以及加密通訊,為我們之后智能設備對接服務器,進行遠程控制做好準備工作。如果小伙伴對如何搭建MQTT服務器不熟悉的話,可以參考我的這篇文章物聯網之MQTT服務器搭建。因為考慮篇幅,今天很籠統說了下ssl和證書,并沒有很詳細的鋪開講述, 這篇文章注重實踐操作,如果小伙伴對證書的產生的原由感興趣,歡迎留言,后續我可以補一篇理論文章。 好了,今天的分享至此,歡迎小伙伴關注,收藏,轉發喲~