您好,登录后才能下订单哦!
# 如何在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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。