【问题标题】:How do I set up TLS on a mosquitto (MQTT) broker?如何在 mosquitto (MQTT) 代理上设置 TLS?
【发布时间】:2016-06-12 21:58:15
【问题描述】:

我让 mosquitto 工作,使用普通的旧 TCP,但我想使用 SSL 和 TLS 保护它,所以我按照以下指南为我的 mosquitto 代理创建证书:

https://mosquitto.org/man/mosquitto-tls-7.html

然后我在配置文件中添加了以下几行:

listener 8883
cafile /mqtt/certs/ca.crt
certfile /mqtt/certs/server.crt
keyfile /mqtt/certs/server.key
require_certificate false

但是现在当我尝试在另一台机器上使用 mosquitto_sub 尝试通过端口 8883 (TLS) 连接到 mosquitto 代理时,我在代理上收到以下错误

New connection from XX.XXX.XXX.XXX on port 8883.
OpenSSL Error: error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca
OpenSSL Error: error:140940E5:SSL routines:SSL3_READ_BYTES:ssl handshake failure
Socket error on client <unknown>, disconnecting.

我已尝试通过以下方式执行 mosquitto_sub:

$ mosquitto_sub -h "HOST_HERE.com" -t "sup" -p 8883
$ mosquitto_sub -h "HOST_HERE.com" -t "sup" -p 8883 --cafile ca.crt
$ mosquitto_sub -h "HOST_HERE.com" -t "sup" -p 8883 --cafile ca.crt --cert client.crt --key client.key

并且客户端的证书是根据我前面提到的第一个链接生成的。

任何人都知道为什么会发生这种情况以及我该如何解决它?

【问题讨论】:

    标签: ssl server mqtt mosquitto tls1.2


    【解决方案1】:

    这是订阅的好方法,因为您不需要客户端证书:

     mosquitto_sub -h "HOST_HERE.com" -t "sup" -p 8883 --cafile ca.crt
    

    客户端似乎无法验证服务器证书。 你应该确保:

    • ca.crt 在客户端和服务器端是一样的
    • 服务器证书的公用名与其主机名相对应

    还要检查服务器和客户端是否有相同的 openssl 版本,因为如果客户端和服务器不使用通用协议或不共享任何密码,也会发生此错误

    希望对您有所帮助,否则我很想知道您是如何解决这个问题的

    【讨论】:

    • 我有同样的问题,但我的代理在 AWS EC2 上,因此主机名一直在变化。使用它作为通用名称没有意义。有没有其他方法可以解决这个问题?
    • @Nazar 如果您使用的是 AWS,则使用路由 53 为 ip 分配名称,然后使用 LB 与其连接
    【解决方案2】:

    试试--insecure 选项。

    mosquitto_sub -h "HOST_HERE.com" -t "sup" -p 8883 --cafile ca.crt --insecure
    

    【讨论】:

      最近更新 更多