如何在EMQ X中为MQTT启用双向SSL/TLS安全连接

发布时间:2021-12-07 09:07:31 作者:iii
来源:亿速云 阅读:342
# 如何在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

3. 生成自签名证书

3.1 CA根证书生成

# 生成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

3.2 服务器证书生成

# 生成服务器私钥
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

3.3 客户端证书生成

# 生成客户端私钥
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

4. EMQ X服务器配置

4.1 证书文件部署

将以下文件放入EMQ X的/etc/emqx/certs/目录: - ca.crt - emqx.crt - emqx.key

设置权限:

chmod 600 /etc/emqx/certs/*.key
chown emqx:emqx /etc/emqx/certs/*

4.2 修改emqx.conf配置

# 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

4.3 重启服务验证

# 重载配置
emqx stop
emqx start

# 检查监听状态
netstat -tulnp | grep 8883

5. 客户端配置示例

5.1 MQTT.fx客户端配置

  1. 在Connection Profile中:
    • Broker Address: iot.example.com
    • Port: 8883
    • SSL/TLS: 勾选Enable
    • Protocol: TLSv1.3
  2. 证书配置:
    • CA File: 选择ca.crt
    • Client Certificate File: 选择client.crt
    • Client Key File: 选择client.key

5.2 Python Paho客户端示例

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()

6. 高级配置与优化

6.1 证书吊销列表(CRL)

# 生成吊销列表
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

6.2 TLS版本与密码套件

推荐配置(安全优先):

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

7. 常见问题排查

问题1:握手失败错误tls_alert unknown ca

问题2:客户端报Hostname verification failed

问题3:性能问题


8. 总结

通过本文的逐步指导,您已完成: 1. 创建完整的PKI证书体系 2. 配置EMQ X实现双向TLS认证 3. 多种客户端连接验证 4. 高级安全优化措施

建议定期: - 轮换证书(建议1年有效期) - 监控TLS握手失败日志 - 及时更新OpenSSL安全补丁

安全提示:生产环境建议使用专业CA机构颁发的证书,自签名证书仅适用于测试或内部系统。 “`

该文档约4500字,包含: - 详细的证书生成步骤 - EMQ X配置参数说明 - 多语言客户端示例 - 生产环境最佳实践 - 可视化表格和代码块 - 完整的排查指南

可根据实际环境调整证书路径、域名等参数。建议通过emqx_ctl listeners命令验证TLS监听状态。

推荐阅读:
  1. 如何从零开始建立EMQ X MQTT服务器的K8S集群
  2. 怎么在html中跳转到指定位置

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

emq x mqtt ssl/tls

上一篇:Perl控制结构有哪些

下一篇:Hyperledger fabric Chaincode开发的示例分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》