Windows环境下MQTT连接报SSLCertVerificationError证书过期错误如何解决
问题根因
报错明确指向SSL证书校验失败,核心触发点是证书过期,结合代码此前可正常运行的前提,通常对应两类情况:
- MQTT Broker端的服务端SSL证书已到期,运维侧未及时更新证书
- Windows本地的根证书信任列表中,对应Broker证书的签发根证书/中间证书已过期,或是paho-mqtt依赖的CA根证书包版本过旧,内置了已过期的根证书
解决方案
按优先级依次尝试以下操作:
- 优先确认MQTT Broker的证书状态
用openssl命令即可校验Broker证书有效期,执行命令:openssl s_client -connect [你的Broker地址]:[Broker端口] -showcerts
查看返回结果里的证书有效期区间,若确实已过期,联系Broker运维人员更新证书即可恢复。 - 确认Broker证书有效的前提下,更新本地CA根证书包
你代码里的tls_set()没有传CA证书路径,默认会读取系统或依赖库自带的CA根证书列表,Windows环境下先更新paho-mqtt默认依赖的根证书数据源certifi即可:pip install --upgrade certifi - 本地测试场景可临时跳过证书校验(生产环境严禁使用)
仅做本地功能调试不需要严格校验证书的话,可以修改tls_set()配置关闭校验,修改后的代码如下:import ssl client = mqtt.Client(Client_id) # 新增参数关闭证书校验 client.tls_set(cert_reqs=ssl.CERT_NONE) # 额外关闭hostname校验避免衍生报错 client.tls_insecure_set(True) client.username_pw_set(username=usename, password=password) client.on_connect = on_connect client.on_message = on_message client.connect(Broker, Port, Keep_Alive) client.loop_forever() - 手动指定可信CA证书路径
如果你持有Broker对应的可信CA根证书文件,直接在tls_set()中传入证书本地路径即可,优先级高于系统默认根证书列表:client.tls_set(ca_certs="你的CA证书文件本地存储路径") - 检查Windows系统根证书更新状态
打开Windows更新面板,确认系统的根证书更新补丁已安装,避免系统内置根证书过期导致校验失败。
内容的提问来源于stack exchange,提问作者Saran Deeluea
相关产品推荐
相关产品推荐

