小程序接入mqtt并需要启动第三方机构的证书认证配置案例

发布于:2025-03-05 ⋅ 阅读:(19) ⋅ 点赞:(0)

在小程序中接入 MQTT 并启用第三方机构(如 CA 证书)的认证,需结合小程序网络限制和 MQTT 协议特性进行配置。以下是完整案例:


前置条件

  1. MQTT Broker 支持 TLS
    确保 MQTT Broker 已配置由受信任的 CA 机构签发的 SSL 证书(如 Let’s Encrypt、DigiCert 等)。
  2. 小程序域名白名单
    将 MQTT Broker 的域名添加到小程序后台的 request 合法域名 中(需 HTTPS/WSS 协议)。
  3. 使用支持 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

常见问题排查

  1. 证书链不完整
    使用工具检查证书链是否完整:

    openssl s_client -connect your-mqtt-broker.com:8884 -showcerts
    
  2. 域名不匹配
    确保证书中的域名与连接地址的域名完全一致。

  3. 小程序未配置合法域名
    登录微信公众平台,在 开发管理 > 开发设置 中添加 wss://your-mqtt-broker.com 到合法域名。

  4. TLS 版本不兼容
    确保 Broker 支持 TLS 1.2 或更高版本(小程序可能禁用旧版本)。


安全建议

  • 优先使用公共 CA 签发的证书,避免自签名证书。
  • 通过 Token(用户名/密码)而非客户端证书认证。
  • 限制 MQTT Broker 的访问 IP 和端口。

通过以上配置,小程序可安全接入支持第三方 CA 证书的 MQTT 服务。微信小程序mqtt暂不支持自签名认证以及双向TLS认证