Как подключиться к MQTT-серверу, подписанному CA, с помощью mqtt. js - PullRequest
0 голосов
/ 17 июня 2020

Я искал несколько часов, чтобы попытаться найти ответ на этот вопрос.

Я хочу использовать nodejs (используя пакет mqtt. js) для подключиться к серверу MQTT. На сервере есть сертификат, подписанный ЦС. Я не контролирую сервер, но он используется несколькими другими клиентами. Когда я использую приложение windows MQTTBox, я могу нормально подключиться, используя следующие настройки:

MQTTBox Settings

Когда я пытаюсь сделать это, используя nodejs ( mqtt. js) однако я получаю ошибки, связанные с сертификатом, который кажется.

Вот упрощенный код, который я пытаюсь использовать для подключения с nodejs:

import mqtt from 'mqtt';
import tls from 'tls';

const options = tls.connect({
  host: 'mqtt.<domain>',
  port: 9883,
  username: '<username>',
  password: '<password>',
});

const client = mqtt.connect('mqtts://mqtt.<domain>:9883', options);
client.on('connected', () => {
  console.log('Connected!');
});
client.on('error', (error) => {
  console.log('Error:', error);
});

Что дает мне:

> Error: unable to verify the first certificate
>     at TLSSocket.onConnectSecure (_tls_wrap.js:1473:34)
>     at TLSSocket.emit (events.js:311:20)
>     at TLSSocket.EventEmitter.emit (domain.js:482:12)
>     at TLSSocket._finishInit (_tls_wrap.js:916:8)
>     at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:686:12)
> Emitted 'error' event on TLSSocket instance at:
>     at emitErrorNT (internal/streams/destroy.js:92:8)
>     at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
>     at processTicksAndRejections (internal/process/task_queues.js:84:21) {
>   code: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE'
> }

Есть ли другой параметр, который я должен использовать, чтобы указать, что сервер имеет сертификат, подписанный ЦС? Я думал, что это будет довольно просто, если у сервера есть сертификат, возможно, мне не хватает чего-то очевидного.

Обновление

Слушатель должен называться «подключиться», а не «соединиться» . Как указывал hardillb в своем комментарии выше, объект параметров не следует вручную передавать через tls.connect (), это делается с помощью mqtt. js (это было просто то, что я пытался и забыл удалить).

Эти изменения оставляют нас с:

import mqtt from 'mqtt';

const options = {
  host: 'mqtt.<domain>',
  port: 9883,
  username: '<username>',
  password: '<password>',
};

const client = mqtt.connect('mqtts://mqtt.<domain>:9883', options);
client.on('connect', () => {
  console.log('Connected!');
});
client.on('error', (error) => {
  console.log('Error:', error);
});

Что также неоднократно дает следующую ошибку:

> Error: Error: unable to verify the first certificate
>     at TLSSocket.onConnectSecure (_tls_wrap.js:1473:34)
>     at TLSSocket.emit (events.js:311:20)
>     at TLSSocket.EventEmitter.emit (domain.js:482:12)
>     at TLSSocket._finishInit (_tls_wrap.js:916:8)
>     at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:686:12) {
>   code: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE'
> }
> Error: Error: unable to verify the first certificate
>     at TLSSocket.onConnectSecure (_tls_wrap.js:1473:34)
>     at TLSSocket.emit (events.js:311:20)
>     at TLSSocket.EventEmitter.emit (domain.js:482:12)
>     at TLSSocket._finishInit (_tls_wrap.js:916:8)
>     at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:686:12) {
>   code: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE'
> }
...

Если я добавлю rejectUnauthorized: false к параметрам, он будет работать, как задумано . Я совершенно уверен, что серверный CA - это letsencrypt, разве это не считается безопасным для узла?

Я сижу на машине windows 10 изначально с nodejs v12.16.1, обновленным до v12. 18.0, что дало такой же результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...