Paho Mqtt SSL连接时常见异常问题以及解决方案

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Paho Mqtt SSL连接时常见异常问题以及解决方案相关的知识,希望对你有一定的参考价值。

参考技术A

在使用Mqtt的SSL方式连接时遇到了如下问题:

说明使用SSL连接配置中的TrustManager里的server验证失败,即服务端证书签名时用的host和现在签名的host不是同一个。如果是HTTPS,可以通过重写hostNameVerifyer的方法来解决问题,网上有很多攻略
对于Mqtt连接时遇到这个问题,应该检查是否pom.xml中依赖的版本有冲突。经实际验证,paho的版本使用 较新 版本时会遇到这个问题(无论证书是正确/错误,均优先报no name mathing错误,推测是较低版本的校验机制较弱)因此可以参考下面的搭配,使用较低版本跳过这个错误。因为暂未找到mqtt ssl连接时忽略host验证的方法

对于Mqtt连接时遇到这个问题,应该检查是否现在所使用的证书,和服务器端的证书不是同一个。这一次就栽在这个问题上了

pom.xml文件中的依赖:

python paho mqtt客户端连接通过ssl/tls给出错误

【中文标题】python paho mqtt客户端连接通过ssl/tls给出错误【英文标题】:python paho mqtt client connection through ssl/tls giving an error 【发布时间】:2016-08-23 13:41:11 【问题描述】:

我正在尝试使用我自己的证书颁发机构通过 tls 将我的 python paho mqtt 客户端连接到我的代理。我生成了必要的文件并配置了我的 RabbitMQ 代理以使用它们。我的想法是客户端对服务器进行身份验证,但客户端本身不需要进行身份验证。

ca.cert.pem cert.pem key.pem

我知道这些应该可以正常工作,因为我还有一个可以正常工作的 scala paho mqtt 客户端。

目前我直接从我的 Mac 上的终端运行该文件。我正在使用由 python 3.5.2 创建的 virtuanenv,并且我有一个文件 subscribe.py

import paho.mqtt.client as paho
import ssl

def on_message(clnt, userdata, msg):
    print(msg.topic+" "+str(msg.payload))

def on_connect(client, userdata, rc):
        print("Connected with result code "+str(rc))
        mqttc.subscribe("foo")

mqttc = paho.Client()
mqttc.on_message = on_message
mqttc.on_message = on_message
mqttc.tls_set("ca.cert.pem", tls_version=ssl.PROTOCOL_TLSv1_2)
mqttc.connect("address", 8883, 60)
mqttc.loop_forever()

当我运行该文件时,我收到以下错误

ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:645)

我还尝试将tls_version 更改为TLSv1_1TLSv1 并将其完全排除在外。 ca.cert.pemsubscribe.py 文件位于同一文件夹中

paho 网站上的示例看起来很简单,所以我在这里缺少什么?为什么我的 python 客户端收到错误消息?

【问题讨论】:

【参考方案1】:

您尝试过 mosquitto 客户端吗?您遇到的问题有很多可能性,因此最好的解决方法是尝试另一种方法。

mosquitto_sub -h address -p 8883 --cafile ca.cert.pem -t "#" -d -v

d 标志用于调试消息,v 标志用于详细模式。

如果mosquitto客户端无法连接ca,可以试试:

mosquitto_sub -h address -p 8883 --cafile ca.cert.pem -t "#" -d -v --insecure

不安全标志将忽略 CA 检查服务器。如果添加不安全标志可以使您连接,那么可能是 CA 错误。然后你可以使用openssl来调试它。

【讨论】:

以上是关于Paho Mqtt SSL连接时常见异常问题以及解决方案的主要内容,如果未能解决你的问题,请参考以下文章

在 paho mqtt(客户端证书)中进行连接时,ee 密钥太小

phpMQtt和paho.mqtt.js通过ssl协议链接moquitto

org.eclipse.paho.client mqtt客户端连接超时

MT7621加 OPENWRT 移植MQTT(paho.mqtt.c) 进行数据的收发

MQTT paho客户端连接超时错误

js 连接mqtt