我正在运行以下代码以连接到mqtt服务器。
import paho.mqtt.client as mqtt
import ssl
import uuid
client = mqtt.Client(str(uuid.uuid1()))
client.tls_set(
"ca.crt",
"client.crt",
"client.key",
cert_reqs=ssl.CERT_REQUIRED,
tls_version=ssl.PROTOCOL_TLSv1
)
client.connect(
"127.0.0.1",
8883,
)
client.loop_forever()
这段代码可以在python2.7版本上正常工作。但是当我使用python3.7版本运行它时,出现以下错误。
Traceback (most recent call last):
File "test.py", line 29, in <module>
8883,
File "virtualenvs/mqtt-xG2h6zri/lib/python3.7/site-packages/paho/mqtt/client.py", line 839, in connect
return self.reconnect()
File "mqtt-xG2h6zri/lib/python3.7/site-packages/paho/mqtt/client.py", line 994, in reconnect
sock.do_handshake()
File ".pyenv/versions/3.7.0/lib/python3.7/ssl.py", line 1108, in do_handshake
self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: IP address mismatch, certificate is not valid for '127.0.0.1'. (_ssl.c:1045)
请帮助我弄清楚如何使它在python 3.7中工作。
找到了答案。
实际上,根据此链接,与证书的CN字段匹配的服务器IP地址已被弃用超过15年。但是低于3.7的python版本仍然允许这样做,即使它已被弃用。因此,我必须创建一个证书,并在SAN字段中添加服务器的IP地址。
在此答案中说明了创建带有SAN字段的证书。但是答案中的解决方案使用域名。如果要使用IP地址创建证书,请使用此命令而不是该答案中的命令来创建证书。
openssl x509 -req -in server.csr \
-extfile <(printf "subjectAltName=IP:127.0.0.1") \
-CA ca.crt \
-CAkey ca.key \
-CAcreateserial -out server.crt \
-days 365
使用这些证书后,错误就解决了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句