Брокер mosquitto с ssl-сертификатом LetsEncrypt и самозаверяющим клиентским сертификатом

Я уже читал об этом, но не уверен, что понял правильно.

Ситуация такова, что у меня есть сертификаты LetsEncrypt для ssl для моего сервера duckdns.

Я хотел повторно использовать его и для сервера mosquitto, я настроил его как

listener 8884

allow_anonymous false
password_file /mosquitto/config/passwords
certfile /mosquitto/ssl/live/xxxxxx.duckdns.org/fullchain.pem
keyfile /mosquitto/ssl/live/xxxxxx.duckdns.org/privkey.pem
tls_version tlsv1.2

где файл сертификата и ключевой файл созданы LetsEncrypt. Это работает, как и ожидалось.

Теперь, чтобы выставить его в Интернете, я бы предпочел использовать клиентские сертификаты. Насколько я понял, я должен использовать «частный» ЦС, иначе любой сертификат, подписанный LetsEncrypt, будет работать как действительный клиент.

Поэтому я добавил в конфигурацию следующие строки

require_certificate true
use_identity_as_username true
cafile /mosquitto/certs/ca.crt

Где ca.crt — сертификат, который я сгенерировал

openssl genrsa -out ca.key 4096
openssl req -new -x509 -days 36500 -key ca.key -out ca.crt

и с его помощью сгенерировал клиентский сертификат, используя

openssl genrsa -out keyfile.key 4096
openssl req -new -key keyfile.key -out keyfile.csr
openssl x509 -req -days 36500 -in keyfile.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out keyfile.crt

Я проверил, что сертификат клиента правильно подписан с помощью проверки openssl. Теперь, позвонив

 mosquitto_pub --cafile /mosquitto/certs/ca.crt --key keyfile.key --cert keyfile.crt -h xxxxxx.duckdns.org -p 8884 -t broker/hello -m "online"

Я получаю ошибку TLS и в журналах mosquitto вижу

OpenSSL Error[0]: error:1404A418:SSL routines:ST_ACCEPT:tlsv1 alert unknown ca

Я полагаю, что смешиваю вещи с сертификатом сервера и сертификатом клиента, имеющим разные ЦС, хотя я не понимаю, где я делаю это неправильно и как достичь цели.

Любая помощь или намек на то, что не так в моих операциях, приветствуется.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в сертификате CA, который вы передали команде mosquitto_pub.

mosquitto_pub использует переданный ему сертификат ca для проверки сертификата, который брокер представляет для аутентификации самого себя, поэтому он должен указывать на то, что имеет корневой CA Let's Encrypt. Сертификат ЦС не должен быть связан с сертификатом/ключом, который клиент использует для аутентификации.

Поэтому вам, вероятно, следует указывать на пакет сертификатов CA системы, например.

mosquitto_pub --capath /etc/ssl/certs --key keyfile.key --cert keyfile.crt -h xxxxxx.duckdns.org -p 8884 -t broker/hello -m "online"

Спасибо, это была моя ошибка. Для тех, кто увидит это и должен использовать один файл с --cafile (например, для подключения с устройств, не имеющих /etc/ssl/certs), сертификат можно получить из letsencrypt.org/certs/isrgrootx1.pem (источник letsencrypt.org/сертификаты)

Alessandro Perla 19.03.2022 23:44

Другие вопросы по теме