node.js клиент mqtt, использующий TLS

#node.js #ssl #mqtt #tls1.2 #mosca

#node.js #ssl #mqtt #tls1.2 #mosca

Вопрос:

Я пытаюсь реализовать node.js клиент mqtt с TLS, использующий приведенный ниже пакет;

https://www.npmjs.com/package/mqtt#client

Код для запуска клиента mqtt без TLS выглядит следующим образом;

 var mqtt = require('mqtt')
var client  = mqtt.connect('mqtt://test.mosquitto.org')

client.on('connect', function () {
  client.subscribe('presence')
  client.publish('presence', 'Hello mqtt')
})

client.on('message', function (topic, message) {
  // message is Buffer 
  console.log(message.toString())
  client.end()
})
  

Как следует изменить приведенный выше код, чтобы использовать TLS на клиенте mqtt?

Брокер mosca MQTT был запущен как автономный с помощью приведенной ниже команды;

 mosca --key ./tls-key.pem --cert ./tls-cert.pem --http-port 3000 --http-bundle --http-static ./ | pino
  

Ответ №1:

Должно быть достаточно, чтобы изменить protocol часть URL на mqtts://

mqtts://test.mosquitto.org .

Самозаверяющие сертификаты

connect При использовании самозаверяющих сертификатов (только для целей тестирования) вы можете передать функции следующую опцию:

 mqtt.connect('mqtts://test.mosquitto.org', {
    rejectUnauthorized: false
});
  

Комментарии:

1. Это не сработает, потому что брокер использует самозаверяющий сертификат, поэтому клиент не будет знать, что ему можно доверять.

2. @user91579631 При использовании самозаверяющих сертификатов вы можете передать rejectUnauthorized: false в качестве опции. Редактировать: я добавил информацию к ответу.

3. Кажется, клиенту не нужно знать сертификат и ключ, используемые брокером. Спасибо.

4. @user91579631 клиент должен знать сертификат того, что когда-либо подписывало сертификат брокеров (то же самое, когда подписано самостоятельно), иначе невозможно узнать, выдает ли его за себя кто-то другой.

Ответ №2:

Вам необходимо предоставить mqtt.connect() функции объект options, который включает сертификат CA, используемый для проверки соединения.

Объект options должен включать ca ключ, который указывает на сертификат, используемый для подписи сертификата брокеров. Поскольку похоже, что вы используете самозаверяющий сертификат, это будет тот же сертификат, который используется брокером.

ca Ключ описан здесь

Или вы можете разрешить любой сертификат с rejectUnauthorized ключом, как указано в ответе @notion. Но это делает невозможным определить, выдает ли кто-то себя за вашего брокера

Комментарии:

1. Как я могу указать ca ключ в опции? Я не смог найти ca здесь вариант

2. Но в нем говорится, что объект options также передается, tls.connect() поэтому он также может содержать любой из этих параметров.

3. Спасибо. Я попробую.