«сбой проверки сертификата» при соединении AWS IoT с локальным MQTT Mosquitto - PullRequest
2 голосов
/ 16 марта 2020

У меня есть комар MQTT на местном малиновом пи, работающий как шарм. Я создал MQTT-брокер на AWS IoT, который также работает.

На моем Raspberry Pi я могу подключиться, опубликовать sh и подписаться на AWS брокер «вручную», используя команды mosquitto_pub и mosquitto_sub. Когда я делаю это вручную, я использую все сертификаты и прочее. Я использую команду:

mosquitto_pub --cafile amazonCA1.pem --cert certificate.cert --key private.key -h XXXXXXXXXXXXXXXXXX.amazonaws.com -p 8883 -q 1 -d -t "iot/test" -m "testing message"

Итак, я думаю, что проблема не в сертификатах.

Проблема в том, что когда я меняю конфигурацию, чтобы использовать «режим моста», я получаю следующее сообщение в журнале комаров:

1584371971: Connecting bridge (step 1) awsiot (XXXXXXXXXXXXXXXXXXXXX.amazonaws.com:8883)
1584371972: Connecting bridge (step 2) awsiot (XXXXXXXXXXXXXXXXXXXXX.amazonaws.com:8883)
1584371972: Bridge bridgeawsiot sending CONNECT
1584371972: OpenSSL Error: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed
1584371972: Socket error on client local.bridgeawsiot, disconnecting.
1584371977: Bridge local.bridgeawsiot doing local SUBSCRIBE on topic #

Вот мой mosquitto.conf:

pid_file /var/run/mosquitto.pid

persistence true persistence_location /var/lib/mosquitto/

log_dest file /var/log/mosquitto/mosquitto.log log_type all
#log_dest topic

log_type error log_type warning log_type notice log_type information

connection_messages true log_timestamp true

include_dir /etc/mosquitto/conf.d

password_file /etc/mosquitto/passwordfile allow_anonymous false

А вот мой /etc/mosquitto/conf.d/bridge.conf

connection awsiot
address XXXXXXXXXXXXXXXXXXXX.amazonaws.com:8883

# Specifying which topics are bridged
topic # both 1

# Setting protocol version explicitly
bridge_protocol_version mqttv311
bridge_insecure false

# Bridge connection name and MQTT client Id,
# enabling the connection automatically when the broker starts.
cleansession true
clientid bridgeawsiot

start_type automatic
notifications false
log_type all


# =================================================================
# Certificate based SSL/TLS support
# -----------------------------------------------------------------
#Path to the rootCA
bridge_cafile /home/pi/certs/amazonCA1.pem

# Path to the PEM encoded client certificate
bridge_certfile /home/pi/certs/certificate.cert

# Path to the PEM encoded client private key
bridge_keyfile /home/pi/certs/private.key

Итак, проблема в целом: когда я подключаюсь / публикую / подписываюсь вручную, все работает ... но когда я использую файл conf моста, я получаю ошибку:

OpenSSL Error: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed

Любой предложения? Есть ли проблемы с использованием метода аутентификации с именем пользователя / pw на моем локальном брокере (raspberry pi) и аутентификацией сертификата на AWS ??

Спасибо

1 Ответ

1 голос
/ 17 марта 2020

Хорошо, я понятия не имею, что я сделал, я просто знаю, что это решило проблему.

Сначала я сделал чистую установку москита на виртуальной машине Ubuntu, и все работало правильно.

Затем я удалил Mosquitto с моего Raspberry Pi и снова установил его. Настроил это так, как я настроил Ubuntu VM, и все равно не повезло. Я начал думать, что проблема заключается в моем raspbian образе ... но после небольшого изменения настроек, перемещения файлов сертификатов из одного каталога в другой, изменения их прав доступа, изменения каталога файла bridge.conf и прочего ... начал работать, и теперь все в порядке.

Так что, если у вас возникнет эта проблема в будущем: возможно, это просто разрешения для файлов или каталогов.

РЕДАКТИРОВАТЬ (один день спустя) : поскольку я пытался повторить то же самое на другом брокере, я делал все то же самое, но как только мой локальный брокер установил соединение с AWS IoT bridge, соединение было потеряно (сообщение ниже. На этот раз ошибки сертификата нет) :

1584456917: Bridge local.bridgeawsiot doing local SUBSCRIBE on topic #
1584456917: Connecting bridge (step 1) awsiot (XXXXXXXXXXXXXXX.amazonaws.com:8883)
1584456918: Connecting bridge (step 2) awsiot (XXXXXXXXXXXXXXX.amazonaws.com:8883)
1584456918: Bridge bridgeawsiot sending CONNECT
1584456918: Received CONNACK on connection local.bridgeawsiot.
1584456918: Bridge local.bridgeawsiot sending SUBSCRIBE (Mid: 2, Topic: #, QoS: 0, Options: 0x00)
1584456918: Sending PUBLISH to local.bridgeawsiot (d0, q0, r1, m0, 'XXXXX/XXXXX/XXXXX', ... (6 bytes))
1584456918: Sending PUBLISH to local.bridgeawsiot (d0, q0, r1, m0, 'XXXXX/XXXXX/XXXXX/LWT', ... (6 bytes))
1584456918: Sending PUBLISH to local.bridgeawsiot (d0, q0, r1, m0, 'XXXXX/XXXXX/XXXXX/LWT', ... (6 bytes))
1584456918: Sending PUBLISH to local.bridgeawsiot (d0, q0, r1, m0, 'XXXXX/XXXXX/XXXXX/LWT', ... (6 bytes))
1584456918: Sending PUBLISH to local.bridgeawsiot (d0, q0, r1, m0, 'XXXXX/XXXXX/XXXXX/LWT', ... (6 bytes))
1584456918: Sending PUBLISH to local.bridgeawsiot (d0, q0, r1, m0, 'XXXXX/XXXXX/XXXXX/LWT', ... (6 bytes))

1584456918: Received SUBACK from local.bridgeawsiot
1584456919: Socket error on client local.bridgeawsiot, disconnecting.

Я использовал мост со всеми темами:

topic # both 1

I THINK как только я подключился к мосту, многие устройства опубликовали много сообщений и связь была разорвана. Поэтому после того, как я сменил мостовую топи c все было правильно

topic iot/test both 1

[Другое РЕДАКТИРОВАНИЕ: 3 дня спустя] Я выяснил, почему он отключался, когда использовал "topi * 1029" * # both 1 ": потому что одно из моих устройств отправляло сообщение с флагом RETAIN, установленным в значение ИСТИНА.

В документации AWS IoT говорится, что он не поддерживает RETAIN TRUE, и если любое сообщение отправляется таким образом, AWS IoT Broker отключается.

...