【问题标题】:Connecting Mosquitto to the new Azure MQTT backend将 Mosquitto 连接到新的 Azure MQTT 后端
【发布时间】:2016-03-08 09:41:04
【问题描述】:

最近,Microsoft Azure 为其服务添加了 MQTT 后端。 该服务使用TLS 对其流量进行加密。 我无法在 Mosquitto 和 Microsoft Azure 云之间建立连接。

我下载了服务器证书

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

但是,连接永远不会建立。 蚊子输出:

客户端 Device1 发送 CONNECT 错误:发生 TLS 错误。

我之前已经通过 ssl 成功地将 mosquitto 连接到亚马逊云(尽管我为此获得了证书和私钥)。 所以我尝试添加从 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上的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 主机的某些东西正在扔蚊子。 像这样使用 mosquitto 订阅也可以。

这种方法的问题是 ssl 连接似乎在第一个(几个)数据包之后被破坏,并且 socat 随后抱怨

E SSL_write(): Broken pipe

【问题讨论】:

  • 端口 8883 是否打开?
  • 是的,*.azure-devices.net 上的 883 端口已打开,我获得了证书并成功连接 openssl s_client

标签: azure ssl mqtt mosquitto


【解决方案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 数据,其他所有内容都会被拒绝(至少在我们的设置中)!

注意请注意,您(似乎)不能直接从一台设备发送到另一台设备。因为这与 Cloud 方式相反。 您必须在云中配置连接

【讨论】:

  • 使用你的 mosquitto_sub 示例我得到“错误:发生 TLS 错误”。使用 socat 我得到:我 SSL 对等证书主题:“CN = .azure-devices.net”我 SSL 对等证书颁发者:“C = US,ST = Washington,L = Redmond,O = Microsoft Corporation,OU = Microsoft IT, CN = Microsoft IT SSL SHA2" I commonName ".amqpws.azure-devices.net" 与子域 peername "arduhub.azure-devices.net" I commonName "*.su.management-azure" 不匹配-devices.net" 与子域 peername "arduhub.azure-devices.net" 不匹配 - 这让我认为证书不正确.. 有什么想法吗?
  • 关于我的最后一条评论,对我有用的是删除“--capath /etc/ssl/certs/”并添加“--insecure”。这很奇怪,我怀疑 azure IoT Hub 存在一些问题,因为我尝试连接到 IoT Hub 的 arduino 设备出现间歇性错误。
  • 很高兴你能成功。一开始我的证书也有问题。它实际上可能在 MS 端(?)... 对于您的 Arduino:也许看看 github.com/bbvch/streetlightd,我和一位同事正在为 MQTT、AMQP 和 HTTP 生成 C++ 包装类。仍在进行中的工作,尽管我认为现在所有三个协议(或多或少)都在工作
  • 很酷的东西。我们正在开发一种可以通过互联网控制的视觉反馈设备。如果你好奇github.com/mishacucicea/RedAlert - 如果需要可以用作路灯:) ...
  • "echo -n | openssl s_client -connect mytarget.azure-devices.net:8883 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/ test.cert" 我看到您使用此行来下载证书,但是您是如何将其下载到 /etc/ssl/certs 文件夹的