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

Когда я пытаюсь сделать это, используя 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, что дало такой же результат.