EMQ X MQTT 服務器啓用 SSL/TLS 安全鏈接

做爲基於現代密碼學公鑰算法的安全協議,TLS/SSL 能在計算機通信網絡上保證傳輸安全,EMQ X 內置對 TLS/SSL 的支持,包括支持單/雙向認證、X.509 證書、負載均衡 SSL 等多種安全認證。你能夠爲 EMQ X 支持的全部協議啓用 SSL/TLS,也能夠將 EMQ X 提供的 HTTP API 配置爲使用 TLS。本文將介紹如何在 EMQ X 中爲 MQTT 啓用 TLS。node

SSL/TLS 帶來的安全優點

  • 強認證。 用 TLS 創建鏈接的時候,通信雙方能夠互相檢查對方的身份。在實踐中,很常見的一種身份檢查方式是檢查對方持有的 X.509 數字證書。這樣的數字證書一般是由一個受信機構頒發的,不可僞造。
  • 保證機密性。TLS 通信的每次會話都會由會話密鑰加密,會話密鑰由通信雙方協商產生。任何第三方都沒法知曉通信內容。即便一次會話的密鑰泄露,並不影響其餘會話的安全性。
  • 完整性。 加密通信中的數據很難被篡改而不被發現。

SSL/TLS 協議

TLS/SSL 協議下的通信過程分爲兩部分,第一部分是握手協議。握手協議的目的是鑑別對方身份並創建一個安全的通信通道。握手完成以後雙方會協商出接下來使用的密碼套件和會話密鑰;第二部分是 record 協議,record 和其餘數據傳輸協議很是相似,會攜帶內容類型,版本,長度和荷載等信息,不一樣的是它所攜帶的信息是加密了的。算法

下面的圖片描述了 TLS/SSL 握手協議的過程,從客戶端的 "hello" 一直到服務器的 "finished" 完成握手。有興趣的同窗能夠找更詳細的資料看。對這個過程不瞭解也並不影響咱們在 EMQ X 中啓用這個功能。shell

1.gif

SSL/TLS 證書準備

一般來講,咱們會須要數字證書來保證 TLS 通信的強認證。數字證書的使用自己是一個三方協議,除了通信雙方,還有一個頒發證書的受信第三方,有時候這個受信第三方就是一個 CA。和 CA 的通信,通常是以預先發行證書的方式進行的。也就是在開始 TLS 通信的時候,咱們須要至少有 2 個證書,一個 CA 的,一個 EMQ X 的,EMQ X 的證書由 CA 頒發,並用 CA 的證書驗證。安全

得到一個真正受外界信任的證書須要到證書服務提供商進行購買。在實驗室環境,咱們也能夠用本身生成的證書來模擬這個過程。下面咱們分別以這兩種方式來講明 EMQ X 服務器的 SSL/TLS 啓用過程。服務器

注意: 購買證書與自簽名證書的配置,讀者根據自身狀況只需選擇其中一種進行測試。

購買證書

若是有購買證書的話,就不須要自簽名證書。網絡

爲方便 EMQ X 配置,請將購買的證書文件重命名爲 emqx.crt,證書密鑰重命名爲 emqx.keyapp

自簽名證書

在這裏,咱們假設您的系統已經安裝了 OpenSSL。使用 OpenSSL 附帶的工具集就能夠生成咱們須要的證書了。負載均衡

首先,咱們須要一個自簽名的 CA 證書。生成這個證書須要有一個私鑰爲它簽名,能夠執行如下命令來生成私鑰:ide

openssl genrsa -out my_root_ca.key 2048

這個命令將生成一個密鑰長度爲 2048 的密鑰並保存在 my_root_ca.key 中。有了這個密鑰,就能夠用它來生成 EMQ X 的根證書了:工具

openssl req -x509 -new -nodes -key my_root_ca.key -sha256 -days 3650 -out my_root_ca.pem

根證書是整個信任鏈的起點,若是一個證書的每一級簽發者向上一直到根證書都是可信的,那個咱們就能夠認爲這個證書也是可信的。有了這個根證書,咱們就能夠用它來給其餘實體簽發實體證書了。

實體(在這裏指的是 EMQ X)也須要一個本身的私鑰對來保證它對本身證書的控制權。生成這個密鑰的過程和上面相似:

openssl genrsa -out emqx.key 2048

新建 openssl.cnf 文件,

  • req_distinguished_name :根據狀況進行修改,
  • alt_names: BROKER_ADDRESS 修改成 EMQ X 服務器實際的 IP 或 DNS 地址,例如:IP.1 = 127.0.0.1,或 DNS.1 = broker.xxx.com
[req]
default_bits  = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
countryName = CN
stateOrProvinceName = Zhejiang
localityName = Hangzhou
organizationName = EMQX
commonName = Server certificate
[req_ext]
subjectAltName = @alt_names
[v3_req]
subjectAltName = @alt_names
[alt_names]
IP.1 = BROKER_ADDRESS
DNS.1 = BROKER_ADDRESS

而後以這個密鑰和配置簽發一個證書請求:

openssl req -new -key ./emqx.key -config openssl.cnf -out emqx.csr

而後以根證書來簽發 EMQ X 的實體證書:

openssl x509 -req -in ./emqx.csr -CA my_root_ca.pem -CAkey my_root_ca.key -CAcreateserial -out emqx.pem -days 3650 -sha256 -extensions v3_req -extfile openssl.cnf

準備好證書後,咱們就能夠啓用 EMQ X 的 TLS/SSL 功能了。

SSL/TLS 啓用及驗證

在 EMQ X 中 mqtt:ssl 的默認監聽端口爲 8883。

購買證書方式

EMQ X 配置

將前文重命名後的 emqx.key 文件及 emqx.crt 文件拷貝到 EMQ X 的 etc/certs/ 目錄下,並參考以下配置修改 emqx.conf

## listener.ssl.$name is the IP address and port that the MQTT/SSL
## Value: IP:Port | Port
listener.ssl.external = 8883

## Path to the file containing the user's private PEM-encoded key.
## Value: File
listener.ssl.external.keyfile = etc/certs/emqx.key

## Path to a file containing the user certificate.
## Value: File
listener.ssl.external.certfile = etc/certs/emqx.crt

MQTT 鏈接測試

當配置完成並重啓 EMQ X 後,咱們使用 MQTT 客戶端工具 - MQTT X(該工具跨平臺且支持 MQTT 5.0),來驗證 TLS 服務是否正常運行。

MQTT X 版本要求:v1.3.2 及以上版本
  • 參照下圖在 MQTT X 中建立 MQTT 客戶端(Host 輸入框裏的 mqttx.app 需替換爲實際的域名)

2.png

注意:在 Certificate 一欄只需選擇 CA signed server 便可,使用購買證書在進行單向認證鏈接時不須要攜帶任何證書文件(CA 文件也不須要攜帶)。

  • 點擊 Connect 按鈕,鏈接成功後,若是能正常執行 MQTT 發佈/訂閱 操做,則購買證書的 SSL 單向認證配置成功。

    3.png

自簽名證書方式

EMQ X 配置

將前文中經過 OpenSSL 工具生成的 emqx.pememqx.keymy_root_ca.pem 文件拷貝到 EMQ X 的 etc/certs/ 目錄下,並參考以下配置修改 emqx.conf

## listener.ssl.$name is the IP address and port that the MQTT/SSL
## Value: IP:Port | Port
listener.ssl.external = 8883

## Path to the file containing the user's private PEM-encoded key.
## Value: File
listener.ssl.external.keyfile = etc/certs/emqx.key

## Path to a file containing the user certificate.
## Value: File
listener.ssl.external.certfile = etc/certs/emqx.pem

## Path to the file containing PEM-encoded CA certificates. The CA certificates
## Value: File
listener.ssl.external.cacertfile = etc/certs/my_root_ca.pem

MQTT 鏈接測試

當配置完成並重啓 EMQ X 後,咱們使用 MQTT 客戶端工具 - MQTT X(該工具跨平臺且支持 MQTT 5.0),來驗證 TLS 服務是否正常運行。

MQTT X 版本要求:v1.3.2 及以上版本
  • 參照下圖在 MQTT X 中建立 MQTT 客戶端(Host 輸入框裏的 127.0.0.1 需替換爲實際的 EMQ X 服務器 IP)

4.jpg

此時 Certificate 一欄須要選擇 Self signed ,並攜帶自簽名證書中生成的 my_root_ca.pem 文件。

  • 點擊 Connect 按鈕,鏈接成功後,若是能正常執行 MQTT 發佈/訂閱 操做,則自簽名證書的 SSL 單向認證配置成功。

5.png

EMQ X Dashboard 驗證

最後,打開 EMQ X 的 Dashboard 在 Listeners 頁面能夠看到在 8883 端口上有一個 mqtt:ssl 鏈接。

emqx-dashboard.png

至此,咱們成功的完成了 EMQ X 服務器的 SSL/TLS 配置及單向認證鏈接測試。EMQ X SSL/TLS 雙向認證配置文檔請關注咱們的後續文章。

版權聲明: 本文爲 EMQ 原創,轉載請註明出處。

原文連接:https://www.emqx.io/cn/blog/e...

相關文章
相關標籤/搜索