在小程序中接入 MQTT 并启用第三方机构(如 CA 证书)的认证,需结合小程序网络限制和 MQTT 协议特性进行配置。以下是完整案例:
前置条件
- MQTT Broker 支持 TLS
确保 MQTT Broker 已配置由受信任的 CA 机构签发的 SSL 证书(如 Let’s Encrypt、DigiCert 等)。 - 小程序域名白名单
将 MQTT Broker 的域名添加到小程序后台的 request 合法域名 中(需 HTTPS/WSS 协议)。 - 使用支持 WebSocket 的 MQTT 客户端
小程序中需通过 WebSocket 连接 MQTT,推荐库:mqtt.js
(使用 WebSocket 适配器)- 或封装好的小程序 MQTT 库(如
wx-mqtt
)。
配置步骤
1. 安装 MQTT 客户端库
使用 mqtt.js
的 WebSocket 版本:
npm install mqtt --save
2. 在小程序中引入并初始化
已适配好的微信小程序端可以的demo链接:https://github.com/emqx/MQTT-Client-Examples/tree/master/mqtt-client-wechat-miniprogram
// 在小程序页面或 utils 中引入
const mqtt = require('mqtt/dist/mqtt');
// 配置 MQTT 连接参数
const clientId = 'miniProgram_' + Math.random().toString(16).substr(2, 8);
const options = {
clientId: clientId,
protocol: 'wss', // 必须使用 WSS
rejectUnauthorized: true, // 强制验证服务器证书
ca: '-----BEGIN CERTIFICATE-----\n...CA证书内容...\n-----END CERTIFICATE-----', // CA 证书(可选,小程序可能依赖系统信任链)
// 如果 Broker 要求双向 TLS,需添加客户端证书(需确认小程序是否支持)
// key: '...客户端私钥...',
// cert: '...客户端证书...',
username: 'your_username', // 若需认证
password: 'your_password'
};
const client = mqtt.connect('wss://your-mqtt-broker.com:8884/mqtt', options);
// 监听连接事件
client.on('connect', () => {
console.log('MQTT 连接成功');
client.subscribe('your/topic');
});
client.on('error', (err) => {
console.error('MQTT 连接错误:', err);
});
3. 证书处理注意事项
CA 证书配置
如果 MQTT Broker 的证书由公共 CA(如 Let’s Encrypt)签发,通常无需手动配置ca
参数,小程序的底层网络库会自动信任。自签名证书
若使用自签名证书,需将 CA 证书内容硬编码到代码中(不推荐,安全性低),或通过小程序后台配置受信证书。双向 TLS(mTLS)
小程序默认不支持客户端证书(key
/cert
)的直接配置。如需双向认证,需改为 Token 认证(如username
/password
)。
4. 微信小程序网络适配
由于小程序 WebSocket
API 限制,可能需要封装适配器:
// 使用 wx.connectSocket 适配 MQTT.js
const wsUrl = 'wss://your-mqtt-broker.com:8884/mqtt';
const socketTask = wx.connectSocket({
url: wsUrl,
header: {
'Content-Type': 'application/json'
},
protocols: ['mqtt'] // 指定子协议
});
// 将 socketTask 传递给 MQTT 客户端
const client = mqtt(wsUrl, {
wsOptions: {
webSocket: socketTask
},
// ...其他配置
});
5. 服务端配置示例(Mosquitto Broker)
确保 MQTT Broker 启用 TLS 并配置 CA 证书:
# mosquitto.conf
listener 8884
protocol websockets
cafile /path/to/ca_certificate.pem
certfile /path/to/server_certificate.pem
keyfile /path/to/server_key.pem
require_certificate false # 小程序不支持双向 TLS,设为 false
常见问题排查
证书链不完整
使用工具检查证书链是否完整:openssl s_client -connect your-mqtt-broker.com:8884 -showcerts
域名不匹配
确保证书中的域名与连接地址的域名完全一致。小程序未配置合法域名
登录微信公众平台,在 开发管理 > 开发设置 中添加wss://your-mqtt-broker.com
到合法域名。TLS 版本不兼容
确保 Broker 支持 TLS 1.2 或更高版本(小程序可能禁用旧版本)。
安全建议
- 优先使用公共 CA 签发的证书,避免自签名证书。
- 通过 Token(用户名/密码)而非客户端证书认证。
- 限制 MQTT Broker 的访问 IP 和端口。
通过以上配置,小程序可安全接入支持第三方 CA 证书的 MQTT 服务。微信小程序mqtt暂不支持自签名认证以及双向TLS认证