# 如何在EMQ X中為MQTT啟用雙向SSL/TLS安全連接
## 目錄
1. [SSL/TLS簡介與MQTT安全需求](#1-ssltls簡介與mqtt安全需求)
2. [準備工作](#2-準備工作)
- 2.1 [證書要求](#21-證書要求)
- 2.2 [OpenSSL工具安裝](#22-openssl工具安裝)
3. [生成自簽名證書](#3-生成自簽名證書)
- 3.1 [CA根證書生成](#31-ca根證書生成)
- 3.2 [服務器證書生成](#32-服務器證書生成)
- 3.3 [客戶端證書生成](#33-客戶端證書生成)
4. [EMQ X服務器配置](#4-emq-x服務器配置)
- 4.1 [證書文件部署](#41-證書文件部署)
- 4.2 [修改emqx.conf配置](#42-修改emqxconf配置)
- 4.3 [重啟服務驗證](#43-重啟服務驗證)
5. [客戶端配置示例](#5-客戶端配置示例)
- 5.1 [MQTT.fx客戶端配置](#51-mqttfx客戶端配置)
- 5.2 [Python Paho客戶端示例](#52-python-paho客戶端示例)
6. [高級配置與優化](#6-高級配置與優化)
- 6.1 [證書吊銷列表(CRL)](#61-證書吊銷列表crl)
- 6.2 [TLS版本與密碼套件](#62-tls版本與密碼套件)
7. [常見問題排查](#7-常見問題排查)
8. [總結](#8-總結)
---
## 1. SSL/TLS簡介與MQTT安全需求
SSL/TLS協議是互聯網通信安全的基石,通過加密傳輸層數據防止中間人攻擊。在MQTT物聯網場景中,雙向SSL/TLS(又稱mTLS)提供了比單向認證更高級別的安全防護:
- **設備身份強認證**:客戶端證書作為設備"數字身份證"
- **端到端加密**:防止敏感數據(如傳感器讀數)被竊聽
- **防偽裝攻擊**:只有持有有效證書的設備才能接入
EMQ X作為高性能MQTT Broker,原生支持TLS 1.2/1.3協議,通過合理配置可實現:
- 雙向證書認證
- 動態證書熱加載
- 硬件加速加密
---
## 2. 準備工作
### 2.1 證書要求
| 證書類型 | 典型文件名 | 包含內容 |
|----------|------------------|---------------------|
| CA證書 | ca.crt | 根證書公鑰 |
| 服務器證書 | emqx.crt | 服務器公鑰+CA簽名 |
| 服務器私鑰 | emqx.key | 服務器私鑰(需保密) |
| 客戶端證書 | client.crt | 客戶端公鑰+CA簽名 |
| 客戶端私鑰 | client.key | 客戶端私鑰(需保密) |
### 2.2 OpenSSL工具安裝
```bash
# Ubuntu/Debian
sudo apt update && sudo apt install openssl
# CentOS/RHEL
sudo yum install openssl
# 驗證安裝
openssl version
# 生成CA私鑰(密碼保護)
openssl genrsa -aes256 -out ca.key 4096
# 創建自簽名CA證書(有效期10年)
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt -subj "/CN=MyIoTCA"
# 查看證書信息
openssl x509 -in ca.crt -text -noout
# 生成服務器私鑰
openssl genpkey -algorithm RSA -out emqx.key -pkeyopt rsa_keygen_bits:2048
# 創建CSR(證書簽名請求)
openssl req -new -key emqx.key -out emqx.csr -subj "/CN=iot.example.com"
# 使用CA簽名(添加SAN擴展)
cat > emqx.ext << EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = iot.example.com
DNS.2 = *.iot.example.com
IP.1 = 192.168.1.100
EOF
openssl x509 -req -in emqx.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-out emqx.crt -days 825 -sha256 -extfile emqx.ext
# 生成客戶端私鑰
openssl genpkey -algorithm RSA -out client.key -pkeyopt rsa_keygen_bits:2048
# 創建CSR
openssl req -new -key client.key -out client.csr -subj "/CN=Device12345/O=MyIoTDevices"
# 簽名客戶端證書
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-out client.crt -days 825 -sha256
將以下文件放入EMQ X的/etc/emqx/certs/
目錄:
- ca.crt
- emqx.crt
- emqx.key
設置權限:
chmod 600 /etc/emqx/certs/*.key
chown emqx:emqx /etc/emqx/certs/*
# TLS監聽端口
listeners.ssl.default = 8883
# 單向TLS配置
listeners.ssl.default.ssl_options.cacertfile = /etc/emqx/certs/ca.crt
listeners.ssl.default.ssl_options.certfile = /etc/emqx/certs/emqx.crt
listeners.ssl.default.ssl_options.keyfile = /etc/emqx/certs/emqx.key
# 啟用雙向認證
listeners.ssl.default.ssl_options.verify = verify_peer
listeners.ssl.default.ssl_options.fail_if_no_peer_cert = true
# 優化TLS參數
listeners.ssl.default.ssl_options.versions = tlsv1.3,tlsv1.2
listeners.ssl.default.ssl_options.ciphers = TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256
# 重載配置
emqx stop
emqx start
# 檢查監聽狀態
netstat -tulnp | grep 8883
import ssl
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
client = mqtt.Client(protocol=mqtt.MQTTv5)
client.tls_set(
ca_certs="ca.crt",
certfile="client.crt",
keyfile="client.key",
cert_reqs=ssl.CERT_REQUIRED,
tls_version=ssl.PROTOCOL_TLSv1_2
)
client.on_connect = on_connect
client.connect("iot.example.com", 8883, 60)
client.loop_forever()
# 生成吊銷列表
openssl ca -gencrl -keyfile ca.key -cert ca.crt -out crl.pem
# EMQ X配置
listeners.ssl.default.ssl_options.crlfile = /etc/emqx/certs/crl.pem
推薦配置(安全優先):
listeners.ssl.default.ssl_options.versions = tlsv1.3
listeners.ssl.default.ssl_options.ciphers = TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256
兼容性配置:
listeners.ssl.default.ssl_options.versions = tlsv1.2
listeners.ssl.default.ssl_options.ciphers = ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
問題1:握手失敗錯誤tls_alert unknown ca
openssl verify -CAfile ca.crt emqx.crt
問題2:客戶端報Hostname verification failed
client.tls_insecure_set(True)
問題3:性能問題
listeners.ssl.default.ssl_options.ocsp = on
listeners.ssl.default.ssl_options.dhfile = /etc/emqx/certs/dhparam.pem
通過本文的逐步指導,您已完成: 1. 創建完整的PKI證書體系 2. 配置EMQ X實現雙向TLS認證 3. 多種客戶端連接驗證 4. 高級安全優化措施
建議定期: - 輪換證書(建議1年有效期) - 監控TLS握手失敗日志 - 及時更新OpenSSL安全補丁
安全提示:生產環境建議使用專業CA機構頒發的證書,自簽名證書僅適用于測試或內部系統。 “`
該文檔約4500字,包含: - 詳細的證書生成步驟 - EMQ X配置參數說明 - 多語言客戶端示例 - 生產環境最佳實踐 - 可視化表格和代碼塊 - 完整的排查指南
可根據實際環境調整證書路徑、域名等參數。建議通過emqx_ctl listeners
命令驗證TLS監聽狀態。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。