如何在EMQ X中为MQTT启用TLS

发布时间:2021-12-07 09:08:14 作者:iii
来源:亿速云 阅读:508
# 如何在EMQ X中为MQTT启用TLS

## 目录
1. [TLS/SSL简介](#tlsssl简介)
2. [为什么需要在MQTT中使用TLS](#为什么需要在mqtt中使用tls)
3. [EMQ X中的TLS配置概述](#emq-x中的tls配置概述)
4. [准备证书文件](#准备证书文件)
   - [自签名证书](#自签名证书)
   - [CA签名证书](#ca签名证书)
5. [配置EMQ X启用TLS](#配置emq-x启用tls)
   - [基础配置](#基础配置)
   - [高级配置选项](#高级配置选项)
6. [客户端连接配置](#客户端连接配置)
   - [MQTT.fx示例](#mqttfx示例)
   - [Python Paho示例](#python-paho示例)
7. [性能优化建议](#性能优化建议)
8. [常见问题排查](#常见问题排查)
9. [证书轮换与更新](#证书轮换与更新)
10. [总结](#总结)

## TLS/SSL简介

传输层安全协议(Transport Layer Security,TLS)及其前身安全套接层(Secure Sockets Layer,SSL)是用于在计算机网络中提供安全通信的加密协议。TLS通过以下机制保障通信安全:

1. **加密**:使用对称加密算法(如AES)加密传输数据
2. **认证**:通过数字证书验证服务器/客户端身份
3. **完整性**:使用消息认证码(MAC)防止数据篡改

现代TLS协议(1.2/1.3版本)已修复早期SSL协议中的安全漏洞,成为物联网通信安全的事实标准。

## 为什么需要在MQTT中使用TLS

MQTT协议默认使用明文传输,存在以下安全风险:

- 消息内容可被中间人窃听
- 设备身份可被伪造
- 消息可被篡改或重放

启用TLS后可解决:
1. **设备认证**:通过客户端证书实现双向认证
2. **数据保密**:加密所有MQTT报文
3. **完整性保护**:防止消息被篡改
4. **合规要求**:满足GDPR、等保2.0等法规要求

特别在以下场景必须启用TLS:
- 传输敏感数据(如医疗、金融)
- 设备部署在公共网络
- 需要满足行业合规认证

## EMQ X中的TLS配置概述

EMQ X支持多种TLS配置方式:

| 配置方式 | 说明 | 适用场景 |
|---------|------|----------|
| 单向认证 | 仅服务端提供证书 | 普通物联网场景 |
| 双向认证 | 要求客户端也提供证书 | 高安全要求场景 |
| PSK认证 | 使用预共享密钥 | 资源受限设备 |

核心配置文件通常位于`etc/emqx.conf`,主要配置项包括:

```properties
listener.ssl.external.keyfile = etc/certs/key.pem
listener.ssl.external.certfile = etc/certs/cert.pem
listener.ssl.external.cacertfile = etc/certs/cacert.pem

准备证书文件

自签名证书

适用于测试环境,使用OpenSSL生成:

# 生成CA私钥和证书
openssl req -x509 -newkey rsa:2048 -days 3650 -nodes \
    -keyout ca-key.pem -out ca-cert.pem -subj "/CN=MQTT CA"

# 生成服务器私钥和CSR
openssl req -newkey rsa:2048 -nodes \
    -keyout server-key.pem -out server-req.pem \
    -subj "/CN=broker.emqx.io"

# 用CA签名服务器证书
openssl x509 -req -in server-req.pem -days 3650 \
    -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial \
    -out server-cert.pem -extfile server-ext.cnf

CA签名证书

生产环境建议使用受信任CA颁发的证书:

  1. 向CA机构(如DigiCert、Let’s Encrypt)申请证书
  2. 验证域名所有权
  3. 获取证书链文件(通常包含服务器证书和中间CA证书)
# Let's Encrypt示例(使用certbot)
sudo certbot certonly --standalone -d broker.yourdomain.com

配置EMQ X启用TLS

基础配置

修改etc/emqx.conf

# 启用8883端口
listener.ssl.external = 8883

# 证书路径配置
listener.ssl.external.keyfile = etc/certs/server-key.pem
listener.ssl.external.certfile = etc/certs/server-cert.pem
listener.ssl.external.cacertfile = etc/certs/ca-cert.pem

# TLS版本控制
listener.ssl.external.tls_versions = tlsv1.2,tlsv1.3

# 加密套件配置
listener.ssl.external.ciphers = TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256

重启EMQ X生效:

./bin/emqx restart

高级配置选项

  1. 双向认证配置
listener.ssl.external.verify = verify_peer
listener.ssl.external.fail_if_no_peer_cert = true
  1. 会话重用优化
listener.ssl.external.honor_cipher_order = true
listener.ssl.external.reuse_sessions = true
  1. OCSP装订配置
listener.ssl.external.ocsp = on
listener.ssl.external.ocsp_responder_timeout = 5s

客户端连接配置

MQTT.fx示例

  1. 在Connection Profile设置中:

    • Broker Address填写服务器域名
    • Port设置为8883
    • SSL/TLS选项选择”CA signed server certificate”
    • 上传CA证书文件
  2. 双向认证时还需:

    • 选择”Client certificate based”
    • 上传客户端证书和私钥

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()
client.on_connect = on_connect

# 单向认证配置
client.tls_set(
    ca_certs="path/to/ca-cert.pem",
    tls_version=ssl.PROTOCOL_TLSv1_2
)

# 双向认证配置
# client.tls_set(
#     ca_certs="path/to/ca-cert.pem",
#     certfile="path/to/client-cert.pem",
#     keyfile="path/to/client-key.pem",
#     tls_version=ssl.PROTOCOL_TLSv1_2
# )

client.connect("broker.emqx.io", 8883, 60)
client.loop_forever()

性能优化建议

  1. 硬件加速

    • 启用OpenSSL硬件加速
    export OPENSSL_ENGINES=/usr/lib/engines-1.1
    
  2. 会话复用

    listener.ssl.external.session_lifetime = 24h
    listener.ssl.external.session_tickets = on
    
  3. 密码套件优化

    • 优先使用AES-GCM等高效算法
    • 禁用已淘汰算法(如RC4、SHA1)
  4. 连接复用

    • 客户端使用持久连接
    • 合理设置keepalive时间

常见问题排查

  1. 证书验证失败

    TLS error: unknown ca
    

    解决方案:

    • 确保证书链完整
    • 检查系统时间是否正确
  2. 协议版本不匹配

    TLS protocol version mismatch
    

    解决方案:

    • 检查tls_versions配置
    • 客户端和服务端使用相同TLS版本
  3. 性能问题

    • 监控CPU使用率
    • 考虑使用ECDSA证书替代RSA

证书轮换与更新

  1. 无缝轮换方案: “`bash

    先加载新证书

    ./bin/emqx_ctl listeners reload ssl 8883

# 然后终止旧连接 ./bin/emqx_ctl listeners restart ssl 8883


2. **证书监控**:
   - 设置证书过期提醒
   - 使用OCSP检查证书状态

3. **自动化更新**(Let's Encrypt):
   ```bash
   # 使用certbot自动续期
   certbot renew --pre-hook "systemctl stop emqx" \
                --post-hook "systemctl start emqx"

总结

在EMQ X中启用TLS是保障MQTT通信安全的关键步骤。通过合理配置:

  1. 实现端到端加密通信
  2. 满足各类合规要求
  3. 在安全和性能间取得平衡

生产环境建议: - 使用受信任CA颁发的证书 - 启用双向认证 - 定期轮换证书 - 监控TLS连接状态

通过本文的详细指导,您应该能够完成从证书生成到完整TLS配置的全流程,为物联网系统构建可靠的安全通信基础。 “`

注:实际字数为约4500字(包含配置示例和格式标记)。如需进一步扩展,可以增加: 1. 更多客户端语言示例(Java、C++等) 2. 详细的性能测试数据 3. 特定行业合规要求详解 4. EMQ X集群环境下的TLS配置

推荐阅读:
  1. EMQ X Cloud - MQTT 5.0 公有云服务正式发布
  2. MQTT和CoAP在EMQ X里怎么实现连接

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

emq x mqtt tls

上一篇:Perl基本数据类型有哪些

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

相关阅读

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

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