Mosquitto — клиентский брокер в сертификате включить мост, не представляющий сертификат

#openssl #mqtt #x509certificate #tls1.2 #mosquitto

#openssl #mqtt #x509certificate #tls1.2 #mosquitto

Вопрос:

Я пытаюсь установить мост TLS mqtt между моей локальной сетью и облачным сервером mqtt, на котором запущен сервер mqtt, но не могу его создать.

Я настроил брокера (назовем его remote_broker) для приема соединений, прошедших проверку подлинности сертификата (require_certificate, use_identity_as_username, keyfile, certfile и cafile), и после настройки клиентских сертификатов я смог напрямую публиковать и подписываться на темы (используя mosquitto_pub и mosquitto_sub).

Когда я пытаюсь настроить мост от другого брокера (назовите его local_broker) к удаленному, опять же с проверкой подлинности сертификата, происходит сбой. В журнале в remote_broker отображается ошибка openssl, в которой указано, что «одноранговый узел не представил сертификат» (см. Журналы remote_broker) . На локальном сервере соединение просто указывается как неудачное до завершения подтверждения SSL (см. Ниже Журналы local_broker), и поэтому сеанс mqtt даже не запускается. Из журналов кажется, что обе стороны запускают рукопожатие TLS, но это не удается, потому что клиент не идентифицирует себя должным образом.

журналы remote_broker:

 2020-10-05T23:55:17Z: New connection from 127.0.0.1 on port 8883.
2020-10-05T23:55:17Z: OpenSSL Error[0]: error:1417C0C7:SSL routines:tls_process_client_certificate:peer did not return a certificate
2020-10-05T23:55:17Z: Socket error on client <unknown>, disconnecting.
  

журналы local_broker:

 2020-10-05T23:55:17Z: Bridge local.mqttserver.local-remote doing local SUBSCRIBE on topic shelleys/#
2020-10-05T23:55:17Z: Bridge local.mqttserver.local-remote doing local SUBSCRIBE on topic tele/#
2020-10-05T23:55:17Z: Connecting bridge (step 1) local-remote (localhost:8883)
2020-10-05T23:55:17Z: Connecting bridge (step 2) local-remote (localhost:8883)
2020-10-05T23:55:17Z: Bridge mqttserver.local-remote sending CONNECT
2020-10-05T23:55:17Z: OpenSSL Error[0]: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure
  

Конфигурация моста local_broker содержится в файле внутри каталога conf.d и имеет содержимое ниже (на данный момент я использую ssh-туннель для доступа к облачной машине — отсюда имя локального хоста в качестве ссылки для IP-адреса remote_broker):

 connection local_remote
address localhost:8883

topic shelleys/# out
topic tele/# out

bridge_cafile /etc/mosquitto/ca_certificates/RootCA.crt
bridge_certfile /etc/mosquitto/certs/bridgeClient.crt
#bridge_keyfile /etc/mosquitto/certs/bridgeClient.key
  

параметр bridge_keyfile закомментирован, поскольку local_broker для соединения с мостом ведет себя как клиент (или, как я понял), поэтому он не нужен, но я попытался раскомментировать его, но поведение не изменилось.

Сертификаты были подписаны одним и тем же центром сертификации, чей общедоступный сертификат присутствует в обоих брокерах и упоминается в конфигурации в ‘bridge_cafile’ в local_broker и в ca_file в remote_broker. Сертификат remote_broker был выдан «localhost», чтобы он соответствовал указанному параметру адреса имени домена.

Я попробовал несколько других параметров моста TLS, которые могут влиять на поведение соединения, таких как ‘bridge_insecure’, ‘bridge_protocol_version’, ‘bridge_require_ocsp’ и ‘bridge_tls_version’, но ни один из них не изменил поведение.

Кто-нибудь знает, чего не хватает в конфигурации, чтобы клиент моста local_broker отправлял свой сертификат и таким образом идентифицировал себя?

Спасибо.

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

1. Вам понадобится файл ключа при работе в качестве клиента, если удаленный брокер использует аутентификацию TLS.

Ответ №1:

@hardillb вы правы. Я просмотрел и повторил свою конфигурацию в отношении вашего комментария и после его успешного подключения. Окончательная конфигурация была представлена ниже. Не уверен, почему он не работал раньше, когда я тестировал его с активированным файлом bridge_keyfile.

 connection local_remote
address localhost:8883

topic shelleys/# out
topic tele/# out

bridge_cafile /etc/mosquitto/ca_certificates/RootCA.crt
bridge_certfile /etc/mosquitto/certs/bridgeClient.crt
bridge_keyfile /etc/mosquitto/certs/bridgeClient.key
  

Спасибо за помощь.