Подключение Mosquitto к новому бэкэнду Azure MQTT
Недавно Microsoft Azure добавил бэкэнд MQTT к своим сервисам. Эта служба использует TLS для шифрования своего трафика. Я не могу подключиться между Mosquitto и Microsoft Azure Cloud.
Я скачал сертификат сервера с
echo -n | openssl s_client -connect mytarget.azure-devices.net:8883 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/test.cert
А потом попытался соединиться с mosquitto_sub
mosquitto_sub -h mytarget.azure-devices.net -p 8883 -d -t devices/Device1/messages/events -i Device1 -u "mytarget.azure-devices.net/Device1" -P "SharedAccessSignature sr=snip&sig=snip&skn=snip" --cafile /tmp/test.pem --insecure
Тем не менее, соединение никогда не строится. Москитные выходы:
Клиентское устройство1 отправляет ошибку CONNECT: произошла ошибка TLS.
Ранее я успешно подключил mosquitto over ssl к облаку Amazon (хотя я получил сертификат и закрытый ключ для этого). Поэтому я попытался добавить клиентский сертификат / ключ, полученный от AWS, надеясь, что ошибка в том, что Mosquitto тоже нуждается в этих файлах.
mosquitto_sub -h mytarget.azure-devices.net -p 8883 -d -t devices/Device1/messages/events -i Device1 -u "mytarget.azure-devices.net/Device1" -P "SharedAccessSignature sr=snip&sig=snip&skn=snip" --cafile /tmp/test.pem --cert certificate.pem.crt --key -private.pem.key --insecure --insecure
Однако это не помогло и не изменило сообщение об ошибке.
Затем я заглянул в код комара на github и обнаружил, что ошибка, вероятно, вызвана в этой строке SSL_connect, который, похоже, является функцией openssl.
Кто-нибудь сделал москит подключиться к облаку Microsoft Azure или есть какие-нибудь указатели, где искать дальше?
редактировать:
Кажется, я могу опубликовать, туннелируя SSL через socat:
socat openssl-connect:mytarget.azure-dices.net:8883,verify=0 tcp-l:8884,reuseaddr,fork
И тогда связь от комара до -h localhost вместо лазурного получает меня:
Client Device1 sending CONNECT
Client Device1 received CONNACK
Client Device1 sending PUBLISH (d0, q0, r0, m1, 'devices/Device1/messages/events', ... (4 bytes))
Client Device1 sending DISCONNECT
Возможно, что-то от Лазурного Хозяина выбрасывает комара. Подписка как это с москитом также работает.
Проблема с этим подходом состоит в том, что ssl-соединение кажется разрушенным после первого (нескольких) пакетов, и socat впоследствии жалуется
E SSL_write(): Broken pipe
1 ответ
Для всех, кто ищет это. Наконец-то нам удалось заставить его работать с mosquitto_sub/pub:
mosquitto_sub -h mytarget.azure-devices.net -p 8883 -t "devices/Device1/messages/devicebound/#" -i Device1 -u "mytarget.azure-devices.net/Device1" -P "SharedAccessSignature sr=mytarget.azure-devices.net&sig=snip&skn=snip" --capath /etc/ssl/certs/ --tls-version tlsv1 -d -V mqttv311 -q 1
и для публикации:
mosquitto_pub -h mytarget.azure-devices.net -p 8883 -t "devices/Device1/messages/events/" -i Device2 -u "mytarget.azure-devices.net/Device2" -P "SharedAccessSignature sr=bbvgathering.azure-devices.net&sig=snip&se=snip&skn=snip" --capath /etc/ssl/certs/ --tls-version tlsv1 -d -V mqttv311 -q 1 -m "{\"key\": \"value\"}"
Важно Вы должны отправить JSON-данные, все остальное будет отклонено (по крайней мере, в нашей настройке)!
Примечание Имейте в виду, что вы (казалось бы) не можете напрямую отправлять сообщения с одного устройства на другое. Как это противоречит облачному пути. Вам нужно будет настроить соединение в облаке