You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Mosquitto与JS中使用安全WebSocket连接?

嘿,我刚好折腾过类似的场景,把MQTT over WebSocket从非安全的ws://升级到加密的wss://其实主要是Mosquitto配置和前端代码的两处调整,结合你已经添加的certfilekeyfile配置,给你补全整个流程和关键注意点:

1. 补全Mosquitto的WebSocket SSL监听配置

你已经在/etc/mosquitto/mosquitto.conf里加了证书相关配置,但还需要明确绑定WebSocket的SSL监听端口,不然Mosquitto不会把证书应用到WebSocket连接上。打开配置文件,添加或修改以下内容:

# 新增WebSocket SSL监听端口(常用8884,和MQTT原生SSL的8883区分开)
listener 8884
# 指定该端口使用WebSocket协议
protocol websockets
# 你的证书文件路径(替换成实际路径)
certfile /etc/mosquitto/certs/server.crt
# 你的私钥文件路径(替换成实际路径)
keyfile /etc/mosquitto/certs/server.key
# 如果你的证书是CA签发的,记得加上CA证书路径(可选但推荐)
cafile /etc/mosquitto/certs/ca.crt

配置完后重启Mosquitto服务,确保服务正常启动:

sudo systemctl restart mosquitto
# 检查日志确认没有报错
cat /var/log/mosquitto/mosquitto.log
2. 修改前端Paho JavaScript Client的连接代码

原来的非安全连接用的是ws://协议和普通WebSocket端口(比如8080),现在要改成wss://和我们刚才配置的8884端口,同时开启SSL选项:

// 替换为你的MQTT服务器域名/IP
const mqttServer = "your-mqtt-domain.com";
// 对应Mosquitto配置的WebSocket SSL端口
const mqttPort = 8884;
const clientId = "web-client-" + Math.random().toString(16).substr(2, 8);

// 初始化客户端,注意协议改成wss://
const client = new Paho.MQTT.Client(mqttServer, mqttPort, clientId);

// 连接选项开启SSL
const connectOptions = {
  useSSL: true,
  // 重要提示:如果你的证书是自签名的,浏览器会默认拦截,开发环境可以临时设置这个参数为false
  // 但**生产环境绝对不能这么做**,必须用可信CA签发的证书
  // rejectUnauthorized: false,
  onSuccess: () => {
    console.log("WSS连接成功!");
    // 这里可以继续写订阅、发布逻辑
    client.subscribe("your/topic");
  },
  onFailure: (error) => {
    console.error("WSS连接失败:", error.errorMessage);
  }
};

// 发起连接
client.connect(connectOptions);
3. 容易踩坑的关键注意事项
  • 端口放行:要确保服务器的8884端口在防火墙/安全组里开放,比如用ufw的话执行sudo ufw allow 8884/tcp
  • 证书权限:Mosquitto需要能读取证书和私钥文件,建议设置权限为chmod 600 /path/to/your/keyfile,并把文件所属组改为mosquitto:chown root:mosquitto /path/to/your/certs/*
  • 浏览器验证:如果用自签名证书,浏览器会弹出安全提示,甚至直接阻止连接,开发环境可以临时通过浏览器的高级选项放行,但生产环境一定要用Let's Encrypt这类免费可信CA签发的证书
  • 日志排查:如果连接失败,优先看Mosquitto的日志和浏览器F12控制台的错误信息,常见问题有证书路径错误、端口不通、证书不被信任等

内容的提问来源于stack exchange,提问作者WoJ

火山引擎 最新活动