mqtt使用WebSocket over TLS(wss)握手失败

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mqtt使用WebSocket over TLS(wss)握手失败相关的知识,希望对你有一定的参考价值。

参考技术A 由于网页运行在https上,所以连接mqtt只能用wss,但是使用自签证书一直显示 1015 TLS_HANDSHAKE ,可以判断为认证阶段不通过。在MQTT.fx上面则提示证书非法。后面找了很多资料,终于在一个回到里面找到答案,就记录下来。

如何在 Reactjs 中通过 websocket 使用 MQTT?

【中文标题】如何在 Reactjs 中通过 websocket 使用 MQTT?【英文标题】:How to use MQTT over websocket in Reactjs? 【发布时间】:2021-05-18 04:02:30 【问题描述】:

我使用 aedes 创建服务器是这样的:

const aedes = require('aedes')()
const httpServer = require('http').createServer()
const ws = require('websocket-stream')
const port = 8888

ws.createServer( server: httpServer , aedes.handle)

httpServer.listen(port, function () 
  console.log('websocket server listening on port ', port)
)

这段代码在 8888 端口运行正常。之后在 Reactjs 中使用 mqtt-react-hooks,我创建了文件:

import React from 'react';

import  Connector  from 'mqtt-react-hooks';
import  useMqttState  from 'mqtt-react-hooks';

export default function App() 
const  connectionStatus  = useMqttState();
  return (
    <Connector brokerUrl="mqtt://domain.com:8888">
        <h1>`Status: $connectionStatus`</h1>
    </Connector>
  );

发生错误:它显示状态:未定义。网络损坏和超载。我尝试在网络浏览器上通过 websocket 使用 MQTT,所以需要另外设置吗?

更新: 我使用 tls,所以它必须与密钥、证书、ca 一起使用。使用上面的代码,浏览器发送状态强制使用 wss。我更改服务器文件如下:

const fs = require('fs');
const aedes = require('aedes')();
var wsSslPort = 8888;
var ws = require('websocket-stream');
// WsSsl server
var wsSslServer = require('https').createServer(
    key: fs.readFileSync("cert/key.pem"),
    cert: fs.readFileSync("cert/crt.pem"),
    requestCert: false, // client send their certificate
    rejectUnauthorized: false,
    ca: [ fs.readFileSync("cert/ca.ca") ]
, aedes.handle);

wsSslServer.listen(wsSslPort, "domain.com", function () 
  console.log('MQTT websocket tls server listening on port', wsSslPort)
);

这段代码运行正常。

我还更改了客户端文件:

    import React from 'react'; 
    var optionsMqtt=
      clientId: uuidv4(),
      rejectUnauthorized : false,
      ca: cert_mqtt.ca_mqtt,
      key: cert_mqtt.key_mqtt,
      cert: cert_mqtt.crt_mqtt
    
    const websocketUrl = "wss://domain.com:8888";
    export default function App() 
      const client = mqtt.connect(websocketUrl,optionsMqtt);
      client.stream.on("error", (err) => 
        console.log(`Connection to $websocketUrl failed`);
        client.end();
      );
    client.on('connect', function () 
      console.log('Connected');
    );
    return (
        <>
            <h1>TEST</h1>
        <>
      );
    

还是报错:

ws.js:108 WebSocket 连接到“wss://domain.com:8888/”失败: 连接建立错误:net::ERR_CONNECTION_REFUSED

我也关闭了防火墙,打开8888端口。

【问题讨论】:

【参考方案1】:

您已通过在 URL 中使用 mqtt:// 架构明确告诉客户端使用本机 MQTT。

改成ws://

【讨论】:

谢谢您,先生。我在上面更新了一点

以上是关于mqtt使用WebSocket over TLS(wss)握手失败的主要内容,如果未能解决你的问题,请参考以下文章

在 MQTT 和 MQTT over websocket 的情况下会发生啥?

[mqqt vs mqtt over web native in react native

MQTT over QUIC:下一代物联网标准协议为消息传输场景注入新动力

MQTT图形化客户端比较

MQTT 无法通过 TLS 连接

如何在 tls 中使用 STM32 lwip/mqtt api?