1

我的理解是,如果我require_certificate false的配置中有,那么 Mosquitto Broker 将允许客户端连接,即使它不提供任何证书和密钥;即使我没有打电话,也要更具体地针对 Python 客户端

mq.tls_set(mqttCafile,  mqttCertfile, mqttKeyfile)

打电话之前

mq.connect(mqttBrokerURL, mqttBrokerPort, keepAliveTime)

但是我们无法在没有调用tls_set()函数的情况下与代理连接。

mosquitto.conf 内容:

port 8883

cafile ssl/all-ca.crt
certfile ssl/server.crt
keyfile ssl/server.key
require_certificate false

tls_version tlsv1

password_file /etc/mosquitto/passwd
allow_anonymous false

服务器端错误:

1382529992: Config loaded from mosquitto.conf.
1382529992: Opening ipv4 listen socket on port 8883.
1382529992: Opening ipv6 listen socket on port 8883.
1382530058: New connection from 127.0.0.1 on port 8883.
1382530058: OpenSSL Error: error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
1382530058: Socket read error on client (null), disconnecting.

客户端错误:

[Errno 104] Connection reset by peer
Done: 7

当我们通过证书时,它连接成功。我的要求是经纪人应该允许这两种情况的连接。这可以通过使用来实现require_certificate吗?如果是的话,你能帮我弄清楚我在这里做错了什么吗?

我尝试过使用 Mosquitto 版本 1.2、1.2.1 和 1.2.2。

4

1 回答 1

1

您需要调用tls_set()以启用 TLS 模式。如果您不这样做,客户端将尝试在不使用 TLS 的情况下进行连接。您可以通过在 C 或Python 中将tls_set()这些参数设置为在不设置客户端证书或密钥的情况下调用,但始终需要 CA 证书,除非您使用的是 TLS-PSK。在 Python 中,如果未指定,则默认将证书和密钥文件作为 传递,因此您可以使用例如:NULLNoneNone

mq.tls_set(mqttCafile)

如果require_certificate为真,您需要在 CA 证书旁边传递有效的客户端证书和密钥,否则代理将拒绝您的连接。

不可能有一个侦听器来处理想要同时连接和不连接 TLS 的客户端,但是您可以创建多个侦听器,例如,一个侦听器在没有 TLS 的情况下在端口 1883 上侦听,而在 8883 上的侦听器在使用 TLS 的情况下。

于 2013-10-23T13:36:51.573 回答