【问题标题】:Mosquitto certificate SSL23_GET_CLIENT_HELLO:unknown protocol蚊子证书 SSL23_GET_CLIENT_HELLO:未知协议
【发布时间】:2020-03-03 02:56:34
【问题描述】:

我一直在拼命尝试让我的 MQTT 客户端连接到使用 CA 证书设置的 MQTT 代理。 (Letsencrypt:https://pypi.python.org/pypi/letsencrypt/0.4.1)我正在为我的 https 站点使用相同的证书,这似乎工作正常。不过,我不确定这是否有任何联系。

我已使用本指南为代理 (http://mosquitto.org/2015/12/using-lets-encrypt-certificates-with-mosquitto/) 设置证书

代理 v1.4.8 似乎可以在以下配置下正常工作:

cafile chain.pem
certfile cert.pem
keyfile privkey.pem

[ ok ] mosquitto is running.

客户端尝试使用调试消息连接到此代理:

Client mosqsub/42074-titan sending CONNECT

在我的代理端日志中,我收到以下错误消息:

1457358950: New connection from NOT.TELLING.YOU.OBVIOUSLY on port 8883.
1457358950: OpenSSL Error: error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol
1457358950: Socket error on client <unknown>, disconnecting.

我已经四处寻找解决这个问题的方法,遗憾的是那里几乎没有。

任何帮助将不胜感激!谢谢!

【问题讨论】:

  • 请更新问题,详细说明您使用的是什么客户端以及如何配置它
  • 这些信息足够吗?
  • 请添加完整的 mosquitto_sub 命令行

标签: ssl ssl-certificate mqtt ca


【解决方案1】:

当我使用 tcp 作为协议而不是 ssl 时,我遇到了 paho.mqtt.c MQTT 客户端库的问题。

所以我不得不使用

ssl://1.2.3.4:56789

而不是

tcp://1.2.3.4:56789

此外,在使用 paho.mqtt.c 时,请确保您链接的是支持 SSL 的库,并且支持 SSL 的库实际上是在支持 SSL 的情况下构建的! CMake 文件中曾经存在一个错误,其中缺少定义 (OPENSSL),因此 SSL 库不提供 SSL 支持...

【讨论】:

    【解决方案2】:

    我的猜测是您没有启用 TLS 模式 - 您是否将 --cafile 传递给 mosquitto_sub?

    【讨论】:

      【解决方案3】:

      这对我来说只是为了测试一个简单的安全发布-订阅。

      1. 我使用https://github.com/owntracks/tools/blob/master/TLS/generate-CA.sh 生成证书(在/share/mosquitto 中),简单地说:

        生成-CA.sh

      2. 我配置了 mosquitto.conf(包括完整的日志记录):

        log_dest 文件 /var/log/mosquitto.log

        log_type 全部

        cafile /share/mosquitto/ca.crt

        证书文件/share/mosquitto/localhost.crt

        keyfile /share/mosquitto/localhost.key

      3. 我订阅了(启用调试):

        mosquitto_sub -h localhost -t test -p 8883 --insecure -d --cafile /share/mosquitto/ca.crt

      4. 我发表于:

        mosquitto_pub -h localhost -t test -p 8883 --cafile /share/mosquitto/ca.crt -m "Hi" --insecure

      【讨论】:

        【解决方案4】:

        我最近开始在我的一个 Cloud mosquitto 代理上遇到这个问题。 我使用 python 客户端从另一个 VPS 连接到这个代理,我正在使用 paho.mqtt.client python 库。

        一切都在运转,直到有一天,一切都崩溃了。原因可能是定期更新或其他原因,但它突然开始给我握手错误和 OP 提到的完全相同的错误。

        Client connection from AREA51 failed: error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol.
        
        

        在我的 python 客户端中,我使用 transport=tcp 并使用 tls 连接到安全 MQTT 端口。这之前工作得很好。遇到此问题后,我已将 Openssl 更新到最新版本,但无法解决此问题。

        我的问题是我的代理允许来自所有其他客户端的所有 ssl/tcp 和 websocket 连接。即使是相同的 Python 代码在我的本地机器上也能正常工作。

        所以很明显,我的另一个 VPS(客户端)上的传输机制有问题

        利用 Python MQTT 库,我发现我们可以尝试改变传输机制。

        因此只需将客户端代码更改为:

        client = mqtt.Client(transport="websockets")

        之前是:

        client = mqtt.Client(transport="tcp")

        解决了我的问题。 我必须更改运行安全 websocket 的连接端口。

        我希望这可能对处于类似情况的人有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-01-14
          • 1970-01-01
          • 2023-03-31
          • 1970-01-01
          • 1970-01-01
          • 2011-11-22
          • 2021-07-29
          • 2018-12-05
          相关资源
          最近更新 更多