Назад | Перейти на главную страницу

Проверка сертификатов MQTT не удалась

Я отчаянно пытался заставить моих клиентов MQTT подключиться к моему брокеру MQTT, который настроен с помощью сертификата от CA (Letsencrypt).

Чтобы получить сертификат CA, я использовал команду python letsencrypt (https://pypi.python.org/pypi/letsencrypt/0.4.1)

./letsencrypt-auto certonly -d www.myserver.com

Это дало мне:

lrwxrwxrwx 1 root root   41 Mar  6 23:50 cert.pem
lrwxrwxrwx 1 root root   42 Mar  6 23:50 chain.pem
lrwxrwxrwx 1 root root   46 Mar  6 23:50 fullchain.pem
lrwxrwxrwx 1 root root   44 Mar  6 23:50 privkey.pem

Эти файлы я также использую для шифрования SSL на моем веб-сайте (apache2), который, похоже, работает так же, как и в моем файле conf:

SSLCertificateFile /etc/letsencrypt/live/www.server.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.server.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf

И когда я захожу на свой веб-сервер, я вижу значок SSL, и он работает.

Теперь, когда я помещаю эти файлы в свой /etc/mosquitto/mosquitto.conf:

cafile /etc/letsencrypt/live/www.myserver.com/fullchain.pem
certfile /etc/letsencrypt/live/www.myserver.com/cert.pem
keyfile /etc/letsencrypt/live/www.myserver.com/privkey.pem

И я смог запустить брокера, v1.4.8 отлично:

[ ok ] mosquitto is running.

и из журнала:

1457462631: mosquitto version 1.4.8 (build date Sun, 14 Feb 2016 15:06:55 +0000) starting

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

mosquitto_sub version 1.4.8 running on libmosquitto 1.4.8.

Выполняемая команда:

root@titan:~# mosquitto_pub -h www.myserver.com -p 8883 -t test --cafile /etc/letsencrypt/live/www.myserver.com/fullchain.pem

В моей командной строке упоминается:

Unable to connect (A TLS error occurred.).

Более любопытный взгляд на файл mosquitto.log обнаруживает:

1463562141: Socket error on client <unknown>, disconnecting.
1463562154: New connection from X.X.X.X on port 8889.

Что дает мне на удивление мало информации. Скрипт python, который я использую с веб-сайта, дает мне немного больше информации;

Скрипт Python:

import os, subprocess, socket, sys, time, struct import *
import paho.mqtt.client as mqtt

dir = "/etc/letsencrypt/live/www.server.com/"

def on_connect(mqttc, obj, flags, rc):
    if rc != 0:
        exit(rc)
    else:
        mqttc.disconnect()

def on_disconnect(mqttc, obj, rc):
    obj = rc

run = -1
mqttc = mqtt.Client("08-ssl-connect-crt-auth", run)
mqttc.tls_set(dir + "fullchain.pem", dir + "cert.pem", dir + "privkey.pem")
mqttc.on_connect = on_connect
mqttc.on_disconnect = on_disconnect

mqttc.connect("www.server.com", 8889)
while run == -1:
    mqttc.loop()

exit(run)

И это возвращает мне:

ssl.SSLError: [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Я здесь в растерянности. Для меня это не имеет смысла! Любая помощь приветствуется!

ssl.SSLError: [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Это говорит о том, что имя хоста, с которым вы подключаетесь, не совпадает с именем хоста в сертификате.

С участием mosquitto_pub попробуйте использовать --insecure вариант.

Кроме того, у вас нет правильной цепочки сертификатов CA, и поэтому сертификат сервера не может быть проверен клиентом.

Я смог завершить это с помощью Java. Также попробуйте использовать приложение MQTTBox на MacBook, чтобы узнать, можете ли вы подключиться.

Проверьте эту конфигурацию MQTTBox: