如何设置MQTT的TLS加密?

以下是完整的 MQTT TLS 加密配置方案,涵盖 Laravel 服务端、STM32 硬件端和 Mosquitto 代理服务器 的配置步骤:


1. Mosquitto MQTT Broker 的 TLS 配置

(1) 生成 TLS 证书(Linux 环境)
# 生成 CA 根证书(自签名)
openssl req -new -x509 -days 3650 -extensions v3_ca -keyout ca.key -out ca.crt

# 生成服务器端证书
openssl genrsa -out server.key 2048
openssl req -new -out server.csr -key server.key
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365

# 生成客户端证书(可选双向认证)
openssl genrsa -out client.key 2048
openssl req -new -out client.csr -key client.key
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -out client.crt -days 365
(2) 配置 Mosquitto (/etc/mosquitto/mosquitto.conf)
listener 8883  # TLS 默认端口
cafile /path/to/ca.crt
certfile /path/to/server.crt
keyfile /path/to/server.key

# 可选:强制客户端证书验证(双向认证)
require_certificate true
use_identity_as_username true
(3) 重启 Mosquitto
sudo systemctl restart mosquitto

2. Laravel 端 PHP-MQTT 客户端配置

(1) 安装依赖
composer require php-mqtt/laravel-client
(2) 配置 TLS 参数 (config/mqtt.php)
return [
    'host' => env('MQTT_HOST', 'mqtt.example.com'),
    'port' => env('MQTT_PORT', 8883),  // TLS 端口
    'tls' => true,
    'ca_cert' => env('MQTT_CA_CERT', '/path/to/ca.crt'),
    
    // 双向认证时需配置
    'client_cert' => env('MQTT_CLIENT_CERT', '/path/to/client.crt'),
    'client_key' => env('MQTT_CLIENT_KEY', '/path/to/client.key'),
];

3. STM32 端 TLS 配置(基于 ESP8266/ESP32)

(1) 加载 CA 证书到 Flash
// 将 ca.crt 转换为 C 数组(使用 xxd 工具)
xxd -i ca.crt > ca_cert.h

// 在代码中引用
const char ca_cert[] = "-----BEGIN CERTIFICATE-----\n"
                       "MII...(证书内容)...\n"
                       "-----END CERTIFICATE-----\n";
(2) ESP8266 AT 指令配置 TLS
// 设置 WiFi 和 MQTT
AT+CWJAP="WIFI_SSID","WIFI_PASS"
AT+MQTTUSERCFG=0,1,"clientID","username","password",0,0,""
AT+MQTTSSLCFG=0,1,2  // 启用单向 TLS 验证

// 加载 CA 证书
AT+MQTTSSLCERT=0,"-----BEGIN CERTIFICATE-----\nMII...\n-----END CERTIFICATE-----"

// 连接 MQTT Broker
AT+MQTTCONN=0,"mqtt.example.com",8883,1
(3) 使用 ESP32 的 Arduino 库(更简单)
#include <WiFiClientSecure.h>
WiFiClientSecure client;
client.setCACert(ca_cert);  // 加载 CA 证书

PubSubClient mqtt(client);
mqtt.connect("clientId", "username", "password");

4. 测试 TLS 连接

(1) 用 OpenSSL 测试 Broker
openssl s_client -connect mqtt.example.com:8883 -showcerts
(2) Mosquitto 客户端测试
# 单向认证
mosquitto_sub -h mqtt.example.com -p 8883 -t "test" --cafile ca.crt

# 双向认证
mosquitto_sub -h mqtt.example.com -p 8883 -t "test" \
  --cafile ca.crt --cert client.crt --key client.key
(3) STM32 端测试
  • 使用串口调试工具查看 ESP8266 的 AT 指令返回状态
  • 确保 MQTT 连接返回 +MQTTCONNECTED: 0,0

5. 安全增强措施

措施实现方式
证书轮换每 3-6 个月更新证书
双向认证Mosquitto 配置 require_certificate true,STM32 加载客户端证书
禁用旧 TLS 版本在 Mosquitto 配置中限制协议:tls_version tlsv1.2
OCSP 验证使用公共 CA(如 Let’s Encrypt)替代自签名证书

常见问题解决

  1. STM32 连接失败

    • 检查 CA 证书格式(必须是 PEM 格式)
    • 确认 ESP8266 固件支持 TLS(建议使用 AT 固件 v2.2.0+)
  2. Laravel 报错 SSL handshake failed

    • 运行 openssl s_client 验证 Broker 证书是否有效
    • 检查 PHP 的 OpenSSL 扩展是否安装
  3. 双向认证配置

    • Mosquitto 和 STM32 需同时配置客户端证书
    • Laravel 的 mqtt.php 需填写 client_certclient_key

通过以上步骤, Laravel + STM32 MQTT 通信 将实现企业级 TLS 加密,有效防止中间人攻击和数据泄露。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值