如何使用 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 代理

如何配置 mqtt.js 通过 websockets 连接到 iot.eclipse.org

如何通过javascript 使用 MQTT

如何通过javascript 使用 MQTT

无法使用 Flutter 连接到 wss

如何通过javascript 使用 MQTT