Проблемы с подключением к брокеру mosquitto с клиентом mqtt узла через SSL / TLS - PullRequest
1 голос
/ 29 февраля 2020

Черт, я создал брокера от комаров через изображение eclipse docker и недавно следовал этому руководству, чтобы добавить поддержку SSL / TLS: http://www.steves-internet-guide.com/mosquitto-tls/.

Когда я в sshed VPS, на котором работает брокер, я могу использовать команду:

mosquitto_pub -h VPS_NAME -t test/topic -p 8883 --cafile ca.crt -m message -u BROKER_USERNAME -P BROKER_PASSWORD

, и он публикует все отлично и денди. Однако, когда я запускаю ту же команду на локальном компьютере, я получаю сообщение об ошибке:

'Unable to connect (Lookup error.).

Я не получаю никаких новых журналов из контейнера посредника, поэтому я думаю, что он даже не достигает контейнера. Однако, когда я запускаю:

mosquitto_pub -h BROKER_IP_ADRESS -t test/topic -p 8883 --cafile ca.crt -m message -u BROKER_USERNAME -P BROKER_PASSWORD

я получаю ответ, который является ошибкой: произошла ошибка TLS, и в моих docker журналах я получаю:

1583004287: New connection from LOCAL_IP_ADDRESS on port 8883.
1583004287: OpenSSL Error: error:14037438:SSL routines:ACCEPT_SR_KEY_EXCH:tlsv1 alert internal error
1583004287: OpenSSL Error: error:140370E5:SSL routines:ACCEPT_SR_KEY_EXCH:ssl handshake failure
1583004287: Socket error on client <unknown>, disconnecting.

Я только в состоянии получить успешную публикацию publi sh, когда я добавляю команду --insecure к publi sh, однако я хочу убедиться, что клиент знает, что он обращается к нужному серверу, поэтому я не думаю, что это правильно решение.

В конце я хочу запустить клиент mqtt в приложении узла, я попробовал этот кусок кода:


const fs = require('fs');

const optionsz = {
  ca: [ fs.readFileSync(__dirname + '/ca.pem') ],
  host: 'BROKER_IP_ADDRESS',
  servername: 'VPS_NAME',
  port: 8883,
  rejectUnauthorized : false,
  username : 'BROKER_USERNAME', // mqtt credentials if these are needed to connect
  password : 'BROKER_PASSWORD',
  clientId : 'test',
  // Necessary only if the server's cert isn't for "localhost".
  checkServerIdentity: () => { return null; },
};


class MqttHandler {
  constructor() {
    this.mqttClient = null;

  };


  connect() {
    // Connect mqtt with credentials (in case of needed, otherwise we can omit 2nd param)
    this.mqttClient = mqtt.connect(this.host, optionsz);
...

, когда я запускаю это, я продолжаю получать события отключения и в моих docker журналах я получаю:

1583004505: New connection from LOCAL_IP_ADDRESS on port 8883.
1583004505: OpenSSL Error: error:140260FC:SSL routines:ACCEPT_SR_CLNT_HELLO:unknown protocol
1583004505: Socket error on client <unknown>, disconnecting.

Я действительно не понимаю, как решить эту проблему, я смог подключиться к брокеру без защиты SSL / TLS, но я хотел сделать связь моего устройства более безопасной. Спасибо за ваше время!

1 Ответ

0 голосов
/ 01 марта 2020

2 отдельных проблемы здесь.

  1. Похоже, у вас нет действительной записи DNS для вашего VPS. mosquitto_pub терпит неудачу, потому что не может преобразовать имя в IP-адрес. Он работает с --insecure и IP-адресом, потому что вы говорите mosquitto_pub игнорировать тот факт, что CN или SAN в сертификате брокера не включают в себя IP-адрес только имя.

  2. Вы пытаетесь соединиться с необработанным MQTT, а не MQTT через TLS, вам нужно использовать URL, а не просто имя хоста или первый аргумент функции connect(). например,

    this.mqttClient = mqtt.connect("mqtts://" + this.host, optionsz);
    

Чтобы быть честным, вам нужно исправить оба этих фактора, чтобы все работало правильно.

Чтобы исправить 1, вам нужно отсортировать записи DNS так, чтобы у вас есть действительное полное имя хоста, которое указывает на ваш VPS и соответствует сертификату, который вы там развернули.

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