Настройка центра сертификации и TLS на устройствах с помощью Mosquitto

Первый пост здесь, так что извиняюсь, если мой этикет не совсем в точку!

У меня возникли некоторые проблемы с пониманием того, как центры сертификации работают между отдельными машинами, особенно когда речь идет о MQTT и москитном брокере.

Я сгенерировал сертификаты сервера и клиента, используя по этой ссылке и заставили их отлично работать на локальном хосте. Для сервера я использовал обычное имя RPi-Host, то есть имя хоста, а для клиентов я использовал «localhost». Пример кода, который я использую для создания ЦС для клиента, приведен ниже, где %NAME — это просто имя сертификата:

Generate Key with:
$ openssl genrsa -out <%NAME>.key 2048

Generate certificate request with:
$ openssl req -out <%NAME>.csr -key <%NAME>.key -new

Link to main CA:
$ openssl x509 -req -in <%NAME>.csr -CA ../ca/ca.crt -CAkey ../ca/ca.key -CAcreateserial -out <%NAME>.crt -days 365

Допустим, я сгенерировал сертификаты client и client2, затем я могу запустить приведенное ниже на двух разных терминалах на RPi-Host и подключиться без проблем:

Subscribe to MQTT broker:
$ mosquitto_sub -p 8883 --cafile ca.crt --cert client2.crt --key client2.key -h localhost -t /world

Publish to MQTT broker:
$ mosquitto_pub -p 8883 --cafile ../ca/ca.crt --cert client.crt --key client.key -h localhost -m hello! -t /world

Однако, если я изменю -h localhost на 192.168.0.190, то есть IP-адрес, я сразу же получаю:

Error: A TLS Error occurred.

... что не очень полезно!

Цель состоит в том, чтобы попытаться подключиться к этому с отдельной машины, однако я в тупике, просто пытаясь сделать это на той же машине с ее собственным IP-адресом! Нужно ли мне делать что-то необычное в общем имени при создании сертификата? К сожалению, я еще не нашел учебник, в котором рассматривается подключение с использованием mosquitto и TLS на двух разных машинах.

Любые указатели приветствуются, и мне очень жаль, если я упускаю очевидное!

Алекс


person Alex L    schedule 01.12.2020    source источник


Ответы (1)


Имя хоста (или IP-адрес*), которое вы используете для подключения к удаленному компьютеру, ДОЛЖНО соответствовать значению CN/SAN в сертификате, представленном этим компьютером.

localhost никогда не следует использовать в сертификатах, так как это просто заполнитель, который говорит «Эта машина». Использование TLS/SSL с локальным хостом не дает ничего полезного. Вы должны всегда генерировать сертификаты с внешним именем хоста брокера.

Если вы не можете настроить правильные имена хостов на DNS-сервере, вам, вероятно, следует добавить подходящие записи в файл /etc/hosts на всех клиентских машинах с именем хоста для брокера.

Временным решением этой ошибки, вероятно, является добавление -i в командные строки mosquitto_pub и mosquitto_sub. Это говорит им игнорировать любое несоответствие между именем хоста и именем в сертификате. Но это всего лишь обходной путь, поскольку он в основном сводит на нет одну из двух ключевых функций TLS/SSL (1. доказательство того, что машина, к которой вы подключаетесь, является машиной, за которую она выдает себя, 2. включение шифрования сообщений, передаваемых туда и обратно между клиентом /маклер)

* Использование необработанных IP-адресов для TLS возможно, но это добавляет еще один уровень сложности с правильными записями в сертификатах.

person hardillb    schedule 01.12.2020