python实现mqtt之带CA证书的连接

一、问题引入:

1、在连接MQTT时,需要携带证书的,如何用python实现?

在这里插入图片描述

2、python连接MQTT时,报错:ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1091)

在这里插入图片描述

二、python解决带证书的连接问题:

  1. 配置ca证书
    cafile = “C:/Users/Desktop/cafile/ca.crt”

  2. 配置ssl版本号
    tls_version=ssl.PROTOCOL_TLSv1_2

关键python代码配置如下

import ssl
cafile = "C:/Users/Desktop/cafile/ca.crt"
client.tls_set(ca_certs=cafile,cert_reqs=False,tls_version=ssl.PROTOCOL_TLSv1_2)

python全部实现代码如下:

import paho.mqtt.client as mqtt
import json
import ssl

HOST = "101.10.10.214"
PORT = 1683
client_id = "ytest001"                               #client id
Q_topic="persistent://test/topic01"          #请求的topic
D_topic="persistent://test/topic02"          #订阅topic
cafile = "C:/Users/Desktop/cafile/ca.crt"

# 连接成功回调
def on_connect(client, userdata, flags, rc):  
    print("Connected with result code "+str(rc))
    client.subscribe(D_topic)  #设置订阅topic            


# 消息推送回调函数
def on_message(client, userdata, msg):        
    print("主题:"+msg.topic+" 消息:"+str(msg.payload.decode('utf-8')))

# 订阅回调函数
def on_subscribe(client, userdata, mid, granted_qos):
    print("On Subscribed: qos = %d" % granted_qos)

# 断开连接回调
def on_disconnect(client, userdata, rc):
    if rc==0:
        print("connect success !")
    else :
        print("connect error: rc=%s"% rc)


data = {
    "msg_id": "111",
    "type": 3,
    "topic": "topic01",
    "content": {
        "id": 1
    },
    "from": 1,
    "to": -1
}
param = json.dumps(data)

client = mqtt.Client(client_id)
client.username_pw_set("username", "password")
client.tls_set(ca_certs=cafile,cert_reqs=False,tls_version=ssl.PROTOCOL_TLSv1_2)
client.on_connect = on_connect
client.on_message = on_message
client.on_subscribe = on_subscribe
client.on_disconnect = on_disconnect
client.connect(HOST, PORT, 60)
client.publish(Q_topic, payload=param, qos=0)     # 发送消息
client.loop_forever()

首次连接mqtt内容的学习参照第一篇文章:https://blog.csdn.net/yangyaner__/article/details/132437188?spm=1001.2014.3001.5502

查看运行结果:

消息发送成功,返回回调内容:
在这里插入图片描述

要在Python中使用MQTT SSL连接,您需要遵循以下步骤: 1. 安装paho-mqtt库 ``` pip install paho-mqtt ``` 2. 导入必要的库 ```python import ssl import paho.mqtt.client as mqtt ``` 3. 创建SSL/TLS上下文 ```python context = ssl.create_default_context() ``` 4. 设置TLS版本和密码套件 ```python context.set_ciphers('DEFAULT@SECLEVEL=2') context.set_default_verify_paths() context.set_alpn_protocols(['x-amzn-mqtt-ca']) context.options |= ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 ``` 5. 创建MQTT客户端 ```python client = mqtt.Client(client_id="your_client_id") ``` 6. 配置TLS选项 ```python client.tls_set_context(context) ``` 7. 连接MQTT代理 ```python client.connect("your_broker_address", port=8883) ``` 8. 订阅主题 ```python client.subscribe("your_topic") ``` 9. 发布消息 ```python client.publish("your_topic", "your_message") ``` 完整代码示例: ```python import ssl import paho.mqtt.client as mqtt def on_connect(client, userdata, flags, rc): print("Connected with result code "+str(rc)) client.subscribe("your_topic") def on_message(client, userdata, msg): print(msg.topic+" "+str(msg.payload)) context = ssl.create_default_context() context.set_ciphers('DEFAULT@SECLEVEL=2') context.set_default_verify_paths() context.set_alpn_protocols(['x-amzn-mqtt-ca']) context.options |= ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 client = mqtt.Client(client_id="your_client_id") client.tls_set_context(context) client.on_connect = on_connect client.on_message = on_message client.connect("your_broker_address", port=8883) client.loop_forever() ``` 请注意,您需要将 "your_client_id","your_topic","your_message" 和 "your_broker_address" 替换为您自己的值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值