EMQ配置SSL訪問的一個坑

抉擇

最近在做android方面的項目,需要用到mqtt,一開始使用超輕量的mosquitto,後來發現權限配置和集羣配置比較麻煩,於是決定重新選用一款重一點的mqtt broker,看來看去看中了國產的EMQ http://www.emqtt.com 看功能介紹,那是相當的強大,全中文文檔看起來也非常容易,二話不說下載安裝試用,還自帶WEB後臺,相當舒服,於是準備在產品服務器上部署

踩坑

安裝部署配置一切都順利,下載deb包dpkg -i 安裝就可以了,產品服務器,通信加密是必須的,於是配置SSL,從8883端口訪問emq。
根據官方文檔說明配置SSL證書http://www.emqtt.com/docs/v2/config.html#mqtt-ssl-8883

## SSL Options
listener.ssl.external.handshake_timeout = 15
listener.ssl.external.keyfile = etc/certs/key.pem
listener.ssl.external.certfile = etc/certs/cert.pem
## 開啓雙向認證
## listener.ssl.external.cacertfile = etc/certs/cacert.pem
## listener.ssl.external.verify = verify_peer
## listener.ssl.external.fail_if_no_peer_cert = true

我並不需要雙向驗證,所以根據說明,只配置了listener.ssl.external.keyfile和listener.ssl.external.certfile兩個參數

listener.ssl.external.keyfile = etc/certs/xxx.com.key
listener.ssl.external.certfile = etc/certs/xxx.com.crt

分別指向了SSL證書和私鑰文件,SSL證書和私鑰是放在nginx一直在用的,不會有什麼問題,配置後重啓emq
sudo systemctl restart emqttd
嘗試使用域名從8883端口訪問,結果客戶端拋出異常,emq服務端錯誤日誌顯示
SSL: certify: ssl_alert.erl:88:Fatal error: certificate unknown
開始還以爲是證書格式不對,使用openssl進行了各種轉換,依舊是這個錯誤,以此爲關鍵詞在網上搜索也找不到什麼有用的信息

脫坑

一開始就想會不會是listener.ssl.external.cacertfile這個參數沒有配置,因爲文檔裏說要開雙向驗證才需要配置,另一方面我的SSL證書是花錢買的,並非自簽證書,那麼CA證書應該是ubuntu系統已經預置了,配置nginx之類的其它服務端,也沒有遇到需要配置CA證書的情況(自簽證書除外),所以一直沒有去碰這個參數,最後搞了大半天才發現是這參數的問題
emq並不會自己去系統裏面找CA證書,一定要手動配置纔行,關鍵是文檔裏也沒具體說明這一點,網上的例子也是隻配置了listener.ssl.external.keyfile和listener.ssl.external.certfile這兩個參數
由於我的證書文件xxx.com.crt內已經包含包括CA在內的證書鏈,所以這樣配置即可

listener.ssl.external.keyfile = etc/certs/xxx.com.key
listener.ssl.external.certfile = etc/certs/xxx.com.crt
listener.ssl.external.cacertfile =etc/certs/xxx.com.crt

即listener.ssl.external.certfile和listener.ssl.external.cacertfile指向同一個文件
sudo systemctl restart emqttd後終於成功連接上了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章