【发布时间】: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