Я уже читал об этом, но не уверен, что понял правильно.
Ситуация такова, что у меня есть сертификаты 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
Я полагаю, что смешиваю вещи с сертификатом сервера и сертификатом клиента, имеющим разные ЦС, хотя я не понимаю, где я делаю это неправильно и как достичь цели.
Любая помощь или намек на то, что не так в моих операциях, приветствуется.
Проблема в сертификате 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/сертификаты)