如何使用 MQTT 连接到 wss?
Posted
技术标签:
【中文标题】如何使用 MQTT 连接到 wss?【英文标题】:How to connect to wss using the MQTT? 【发布时间】:2019-12-06 12:50:29 【问题描述】:我正在尝试使用生成自签名证书的 javascript(mqttws31.js) 客户端建立 wss 连接,但无法创建连接并出现以下错误。
-
“Firefox 无法与位于 wss://localhost:8883/mqtt 的服务器建立连接。”
“错误:AMQJS0011E 无效状态未连接。”
我已包含 MQTT 代理配置详细信息和 JavaScript 脚本代码以供参考。
MQTT 代理配置(mosquitto.conf)。
port 8084
persistence true
persistence_file mosquitto.db
listener 1883 localhost
protocol mqtt
listener 8883
protocol websockets
allow_anonymous true
require_certificate false
cafile C:/Program Files/mosquitto/certs/certs/ca.crt
certfile C:/Program Files/mosquitto/certs/certs/server.crt
keyfile C:/Program Files/mosquitto/certs/certs/server.key
tls_version tlsv1.2
Javascript 客户端代码:
下面是传递给函数的输入。
主机:localhost,端口:8883 和 clientID:1234。
function()
that.client = new Paho.MQTT.Client(host, Number(port), clientId);
console.log("Connecting to " + host);
that.client.onConnectionLost = onConnectionLost;
that.client.onMessageArrived = onMessageArrived;
that.client.connect(
onSuccess : onConnect,
userName: 'user',
password:'password',
useSSL: true,
cleanSession : false
);
function onConnect()
console.log('onConnect:');
that.client.subscribe("mgtl/#",
qos : 2,
onSuccess : function()
console.log('Acknowldgement recieved by sender');
,
onFailure : function()
console.log('Subscribe request has failed or timed out');
);
that.client.subscribe("local/ack", qos : 0);
console.log('mqtt connected');
谁能给我解决办法。
【问题讨论】:
你检查过代理/windows机器上没有防火墙吗? 还有证书中的CN
是什么,是否包括localhost?
是的,CN 是本地主机
您是否已将 CA 证书导入浏览器?
我已经在 firefox 和 chrome 浏览器上手动导入了 CA 证书,但它在 chrome 中不工作,但在 firefox 中工作正常(我想知道)。
【参考方案1】:
正如 cmets 中所述,听起来您的浏览器不信任您用来签署代理证书的 CA。
浏览器不会像 HTTPS 连接那样弹出关于不受信任证书的相同对话框,因为它们希望代码决定如何处理连接失败(但我认为它们实际上并没有提供原因错误消息)
追踪此类事件的最佳方法通常是确保检查浏览器开发者工具中的network
标签。
至于为什么 Chrome 不喜欢导入的 CA 证书,这可能取决于您使用的操作系统,因为 Chrome 使用系统证书存储,而不是 Firefox 维护自己的 iirc。
【讨论】:
是否有任何步骤来验证 wss://127.0.0.1:8883/ 在 localhost 中是否正常工作(已更改端口号) 您不应该在证书中使用 IP 地址,您应该只使用证书的 CN 或 SAN 中列出的域名(根据问题,端口也是 8883) 当我通过 Chrome 浏览器发出请求时出现以下错误,mqttws31.js:979 WebSocket 连接到 'wss://localhost:8883/mqtt' 失败:连接建立错误:net:: ERR_CERT_INVALID, 说明你没有正确导入CA证书以上是关于如何使用 MQTT 连接到 wss?的主要内容,如果未能解决你的问题,请参考以下文章
无法从 https 客户端通过 wss 连接到 emqx mqtt 代理