将 Mosquitto 连接到新的 Azure MQTT 后端
Connecting Mosquitto to the new Azure MQTT backend
最近 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
但是,连接从未建立。
蚊子输出:
Client Device1 sending CONNECT
Error: A TLS error occurred.
我之前已经通过 ssl 成功地将 mosquitto 连接到 Amazon 云(尽管我为此获得了证书和私钥)。
所以我尝试添加从 AWS 获得的客户端 certificate/key,希望错误是 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 的 mosquitto 代码,发现错误可能是由 SSL_connect 引起的 on this line,这似乎是一个 openssl 函数。
有没有人让 mosquitto 连接到 Microsoft Azure 云或者有任何指示下一步该去哪里?
编辑:
我似乎可以通过在 socat 上传输 SSL 来发布:
socat openssl-connect:mytarget.azure-dices.net:8883,verify=0 tcp-l:8884,reuseaddr,fork
然后在 mosquitto 上连接到 -h localhost 而不是 azure 让我:
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
可能是 Azure Host 的东西在扔蚊子。
用 mosquitto 这样订阅也可以。
这种方法的问题是 ssl 连接似乎在第一个(几个)数据包之后被破坏,socat 随后抱怨
E SSL_write(): Broken pipe
对于搜索此内容的其他人。
我们终于设法让它与 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-数据,其他所有内容都会被拒绝(至少在我们的设置中)!
注意请注意,您(貌似)不能直接从一台设备发送到另一台设备。因为这与 Cloud 方式相反。
您必须在云中配置连接
最近 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
但是,连接从未建立。 蚊子输出:
Client Device1 sending CONNECT Error: A TLS error occurred.
我之前已经通过 ssl 成功地将 mosquitto 连接到 Amazon 云(尽管我为此获得了证书和私钥)。 所以我尝试添加从 AWS 获得的客户端 certificate/key,希望错误是 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 的 mosquitto 代码,发现错误可能是由 SSL_connect 引起的 on this line,这似乎是一个 openssl 函数。
有没有人让 mosquitto 连接到 Microsoft Azure 云或者有任何指示下一步该去哪里?
编辑:
我似乎可以通过在 socat 上传输 SSL 来发布:
socat openssl-connect:mytarget.azure-dices.net:8883,verify=0 tcp-l:8884,reuseaddr,fork
然后在 mosquitto 上连接到 -h localhost 而不是 azure 让我:
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
可能是 Azure Host 的东西在扔蚊子。 用 mosquitto 这样订阅也可以。
这种方法的问题是 ssl 连接似乎在第一个(几个)数据包之后被破坏,socat 随后抱怨
E SSL_write(): Broken pipe
对于搜索此内容的其他人。 我们终于设法让它与 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-数据,其他所有内容都会被拒绝(至少在我们的设置中)!
注意请注意,您(貌似)不能直接从一台设备发送到另一台设备。因为这与 Cloud 方式相反。 您必须在云中配置连接