使用 mqtt.js 通过安全 WebSocket 的 mqtt

问题描述 投票:0回答:1

我有一个在服务器上运行的 eclipse-mosquitto 容器,我想通过

wss
连接到该服务器。

我在服务器上有以下配置

allow_anonymous false
password_file /mosquitto/config/passwd

persistence true
persistence_location /mosquitto/data/

log_type all
log_dest file /mosquitto/log/mosquitto.log
log_dest stdout

listener 1883
protocol mqtt

listener 8083
protocol websockets
websockets_log_level all
socket_domain ipv4

listener 8883
protocol mqtt
require_certificate false
cafile /mosquitto/cert/ca.crt
certfile /mosquitto/cert/server.crt
keyfile /mosquitto/cert/server.key
tls_version tlsv1.2

listener 8084
protocol websockets
require_certificate false
cafile /mosquitto/cert/ca.crt
certfile /mosquitto/cert/server.crt
keyfile /mosquitto/cert/server.key
tls_version tlsv1.2
websockets_log_level all
socket_domain ipv4

user mosquitto

以及以下 docker-compose 配置

  mosquitto:
    container_name: mosquitto
    image: eclipse-mosquitto:latest
    restart: unless-stopped
    hostname: "${ENV_TYPE}-mosquitto"
    ports:
      - 1883:1883
      - 8883:8883
      - 8083:8083
      - 8084:8084
    volumes:
      - ./volumes/mosquitto/data:/mosquitto/data
      - ./volumes/mosquitto/log:/mosquitto/log
      - ./volumes/mosquitto/config:/mosquitto/config
      - ./volumes/mosquitto/cert:/mosquitto/cert

使用 MQTT Explorer,我可以通过 tls 很好地连接

但是当尝试使用 mqtt.js 库连接到它时 我无法获得

wss
连接。通过端口
ws
工作得很好,就像通过
8083
连接到不同的代理一样。
wss

编辑:

蚊子日志在这些连接尝试中没有显示任何内容。

来自

这篇文章

我添加了<body> <script src="https://unpkg.com/mqtt/dist/mqtt.js"></script> <script> const id = Math.random().toString(36).substring(7); const topic = "topic"; const connection = "wss://username:[email protected]:8084" // const connection = "ws://username:[email protected]:8083" // Works // const connection = "wss://public:[email protected]" // Works const client = mqtt.connect(connection, { rejectUnauthorized: false, }); client.on("message", messageReceived); client.on("connect", function () { println("connected!"); client.subscribe("topic"); client.publish("topic", "Hello from HTML"); }); client.on("error", function (error) { println("Error: " + error); }); client.on('end', function() { println("Disconnected"); }) function messageReceived(topic, message) { println(topic + ": " + message); } function println(message) { const p = document.createElement("p"); p.textContent = message; document.querySelector("body").append(p); } </script> </body> 以获得更多日志记录。

这给了我这些日志

localStorage.debug = 'mqttjs*'

并在连接到 
mqttjs connecting to an MQTT broker... +0ms mqtt.js:10115 mqttjs:client MqttClient :: version: +0ms 5.4.0 mqtt.js:10115 mqttjs:client MqttClient :: environment +0ms browser mqtt.js:10115 mqttjs:client MqttClient :: options.protocol +0ms wss mqtt.js:10115 mqttjs:client MqttClient :: options.protocolVersion +0ms 4 mqtt.js:10115 mqttjs:client MqttClient :: options.username +1ms mdd mqtt.js:10115 mqttjs:client MqttClient :: options.keepalive +0ms 60 mqtt.js:10115 mqttjs:client MqttClient :: options.reconnectPeriod +0ms 5000 mqtt.js:10115 mqttjs:client MqttClient :: options.rejectUnauthorized +0ms false mqtt.js:10115 mqttjs:client MqttClient :: options.properties.topicAliasMaximum +0ms undefined mqtt.js:10115 mqttjs:client MqttClient :: clientId +0ms 4zjpti mqtt.js:10115 mqttjs:client MqttClient :: setting up stream +0ms mqtt.js:10115 mqttjs:client connect :: calling method to clear reconnect +0ms mqtt.js:10115 mqttjs:client _clearReconnect : clearing reconnect timer +0ms mqtt.js:10115 mqttjs:client connect :: using streamBuilder provided to client to create stream +0ms mqtt.js:10115 mqttjs calling streambuilder for +1ms wss mqtt.js:10115 mqttjs:ws browserStreamBuilder +0ms mqtt.js:10115 mqttjs:client connect :: pipe stream to writable stream +1ms mqtt.js:10115 mqttjs:client connect: sending packet `connect` +0ms mqtt.js:10115 mqttjs:client _writePacket :: packet: Object +0ms mqtt.js:10115 mqttjs:client _writePacket :: emitting `packetsend` +0ms mqtt.js:10115 mqttjs:client _writePacket :: writing to stream +0ms mqtt.js:10115 mqttjs:client _writePacket :: writeToStream result true +8ms mqtt.js:21161 WebSocket connection to 'wss://37.97.203.138:8084/' failed: createBrowserWebSocket @ mqtt.js:21161 browserStreamBuilder @ mqtt.js:21185 wrapper @ mqtt.js:21398 connect @ mqtt.js:17840 _MqttClient @ mqtt.js:17816 connect @ mqtt.js:21400 (anonymous) @ examples/:13 mqtt.js:10115 mqttjs:ws WebSocket onError +21ms Event {isTrusted: true, type: 'error', target: WebSocket, currentTarget: WebSocket, eventPhase: 2, …} mqtt.js:10115 mqttjs:ws WebSocket onClose +1ms CloseEvent {isTrusted: true, wasClean: false, code: 1006, reason: '', type: 'close', …} mqtt.js:10115 mqttjs:client streamErrorHandler :: error +13ms WebSocket error mqtt.js:10115 mqttjs:client noop :: +0ms Error: WebSocket error at WebSocket.onError (mqtt.js:21235:25) examples/:27 error Error: WebSocket error at WebSocket.onError (mqtt.js:21235:25) mqtt.js:10115 mqttjs:client end :: (4zjpti) +0ms mqtt.js:10115 mqttjs:client end :: cb? false +0ms mqtt.js:10115 mqttjs:client _clearReconnect : clearing reconnect timer +0ms mqtt.js:10115 mqttjs:client end :: (4zjpti) :: immediately calling finish +0ms mqtt.js:10115 mqttjs:client end :: (4zjpti) :: finish :: calling _cleanUp with force false +0ms mqtt.js:10115 mqttjs:client _cleanUp :: done callback provided for on stream close +0ms mqtt.js:10115 mqttjs:client _cleanUp :: forced? false +0ms mqtt.js:10115 mqttjs:client _cleanUp :: (4zjpti) :: call _sendPacket with disconnect packet +0ms mqtt.js:10115 mqttjs:client _sendPacket :: (4zjpti) :: start +0ms mqtt.js:10115 mqttjs:client _sendPacket :: client not connected. Storing packet offline. +0ms mqtt.js:10115 mqttjs:client _storePacket :: packet: {cmd: 'disconnect'} +0ms mqtt.js:10115 mqttjs:client _storePacket :: cb? true +0ms mqtt.js:10115 mqttjs:client _cleanUp :: (4zjpti) :: removing stream `done` callback `close` listener +0ms mqtt.js:10115 mqttjs:client end :: finish :: calling process.nextTick on closeStores +1ms mqtt.js:10115 mqttjs:client (4zjpti)stream :: on close +0ms mqtt.js:10115 mqttjs:client _flushVolatile :: deleting volatile messages from the queue and setting their callbacks as error function +0ms mqtt.js:10115 mqttjs:client stream: emit close to MqttClient +0ms mqtt.js:10115 mqttjs:client close :: connected set to `false` +0ms mqtt.js:10115 mqttjs:client close :: clearing connackTimer +0ms mqtt.js:10115 mqttjs:client close :: clearing ping timer +0ms mqtt.js:10115 mqttjs:client close :: calling _setupReconnect +0ms mqtt.js:10115 mqttjs:client _setupReconnect :: doing nothing... +0ms mqtt.js:10115 mqttjs:client end :: closeStores: closing incoming and outgoing stores +0ms mqtt.js:10115 mqttjs:client end :: closeStores: emitting end +0ms mqtt.js:10115 mqttjs:client end :: closeStores: invoking callback with args +0ms mqtt.js:10115 mqttjs:client noop :: +0ms undefined

 时进行记录
wss://public:[email protected]


javascript docker mosquitto mqtt.js
1个回答
0
投票

浏览器也不会提示用户接受 JavaScript 代码建立的任何连接的不受信任的证书,这与访问网页时的提示不同。

这意味着浏览器必须信任用于保护基于 WebSockets 连接的 MQTT 的任何证书。

这意味着您有 2 个选择:

使用来自公共信任的 CA 的证书(例如 LetsEncrypt)
  1. 您必须导入您的 CA 证书并将其信任到每个将连接的浏览器。这仅适用于开发时的单用户系统,它不适用于任何向多个用户开放的系统。
© www.soinside.com 2019 - 2024. All rights reserved.