我的理解是,如果我的配置中有require_certificate false
,那么Mosquitto Broker将允许客户端连接,即使它没有提供任何证书和密钥;更具体的Python客户端即使我没有调用
mq.tls_set(mqttCafile, mqttCertfile, mqttKeyfile)
之前打电话
mq.connect(mqttBrokerURL, mqttBrokerPort, keepAliveTime)
但是我们无法在不调用tls_set()
函数的情况下与代理连接。
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
当我们通过证书时它成功连接。我的要求是Broker应允许两个案例的连接。使用require_certificate
可以实现这一点吗?如果是的话,请你帮我弄清楚我在这里做错了什么?
我尝试过Mosquitto版本1.2,1.2.1& 1.2.2。
答案 0 :(得分:1)
您需要致电tls_set()
以启用TLS模式。如果不这样做,客户端将尝试连接而不使用TLS。您可以在不设置客户端证书或密钥的情况下调用tls_set()
,方法是将这些参数设置为C中的NULL
或Python中的None
,但除非您使用TLS,否则始终需要CA证书-PSK。在Python中,默认情况下,如果未指定,则证书和密钥文件将作为None
传递,因此您可以使用例如:
mq.tls_set(mqttCafile)
如果require_certificate
为真,则需要将有效的客户端证书和密钥与CA证书一起传递,否则代理将拒绝您的连接。
不可能让单个侦听器处理想要使用和不使用TLS连接的客户端,但是您可以创建多个侦听器,以便一个人在没有TLS的情况下侦听端口1883,在一个8883上使用TLS监听一个侦听器,例如