从远程客户端连接到 mosquitto 时,TLS 服务器身份验证失败(但如果我使用相同的证书在本地连接,它会起作用)

TLS server authentication fails when connecting to mosquitto from a remote client (but it works If I connect locally with the same certificate)

我在 raspbian 实例上有一个 mosquitto 代理 运行ning。然后我有一个 ubuntu 实例,我试图通过 运行 此命令使用 mosquitto_pub 和 TLS 服务器身份验证来发布消息:

rr@rrubuntu:~/Documents$ mosquitto_pub -h 192.168.0.13 -p 8883 -t master/sensor -m "TLS test" -d --cafile /home/rr/Documents/ca-master.crt --tls-version tlsv1.2

但这就是我得到的结果:

Client mosqpub|7154-rrubuntu sending CONNECT
Error: A TLS error occurred.

当我查看 mosquitto 的日志时,我看到了这个:

raspberry mosquitto[9072]: 1621581631: OpenSSL Error: error:14094412:SSL routines:ssl3_read_bytes:sslv3 alert bad certificate
raspberry mosquitto[9072]: 1621581631: Socket error on client <unknown>, disconnecting.

我不知道是什么导致了这个问题,因为当我从 raspbian 实例本身连接时。我没有问题。这是命令我运行:

pi@raspberry:~/Documents $ mosquitto_pub -h 192.168.0.13 -p 8883 -t master/sensor -m "TLS test" -d --cafile /home/pi/Documents/ca-master.crt --tls-version tlsv1.2

注意:ca-master.crt(以及代理证书和密钥)是使用 openssl 在 raspbian 实例中创建的,然后我将 ca-master.crt 复制到ubuntu 实例使用 scp.

是的,如果我停用 TLS 身份验证(通过对 mosquitto.conf 进行必要的更改),我可以毫无问题地从远程实例发布:

rr@rrubuntu:~/Documents$ mosquitto_pub -h 192.168.0.13 -p 8883 -t master/sensor -m "No TLS test" -d
Client mosqpub|7179-rrubuntu sending CONNECT
Client mosqpub|7179-rrubuntu received CONNACK
Client mosqpub|7179-rrubuntu sending PUBLISH (d0, q0, r0, m1, 'master/sensor', ... (11 bytes))
Client mosqpub|7179-rrubuntu sending DISCONNECT

我真的不知道握手失败的原因是什么以及如何解决。非常欢迎任何建议。

谢谢!

根据我有时遇到的关于 TLS 的问题猜测,您可能需要禁用主机名验证。 mosquitto_sub 有 --insecure 标志:

--不安全

使用基于证书的加密时,此选项会禁用服务器证书中服务器主机名的验证。这在测试初始服务器配置时很有用,但也可能让恶意第三方通过 DNS 欺骗等方式冒充您的服务器。 仅在测试中使用此选项。如果您需要在生产环境中使用此选项,则说明您的设置有问题并且没有必要使用加密。

来源:https://mosquitto.org/man/mosquitto_sub-1.html

因为禁用主机名验证不是一个好主意,所以这里有一篇如何解决此问题的好文章:

我设法通过在 Ubuntu 实例中生成证书然后将它们复制到 Raspbian 实例来解决它。与我最初所做的相反,我最初是在 Raspbian 实例中生成证书,然后将它们复制到 Ubuntu 实例中。

由于我忽略的一个原因,直接在 Raspian 中创建的证书(使用 OpenSSL)在被另一个人使用时不起作用 OS,但反之亦然。