在向MQTT代理发送时用SSL证书封装MQTT数据

1 投票
1 回答
5691 浏览
提问于 2025-04-18 12:31

我正在使用MQTT的Python客户端在树莓派上运行。我不是做网页相关工作的,但我需要在从我的Python客户端向一个开源的MQTT代理发送数据时实现SSL安全。

我发现了Python中有一个特定的包,可以在打开一个套接字时实现SSL安全。我对Python还比较陌生,所以我想了解它是如何工作的,以及如果我们想实现SSL安全需要做些什么。这个问题详细解释了SSL及其工作原理。但如果我想用Python来实现它,我该如何在我的树莓派上本地安装SSL证书(因为我现在只是做一个本地项目,所以我想要一些开源的SSL证书)呢?

我使用下面的Python代码打开了一个SSL套接字,然后通过443端口连接到www.google.com。

import socket
import ssl

s_ = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s = ssl.wrap_socket(s_, ca_certs='/usr/local/lib/python2.7/dist-packages/requests/cacert.pem',cert_reqs=ssl.CERT_REQUIRED)
s.connect(('www.google.com', 443))
s.write("""GET / HTTP/1.1\r
Host: www.google.com\r\n\r\n""")
d=s.read()
print(d)
s.close()

然后我在控制台上得到了这个输出。

HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Location: https://www.google.co.in/?gfe_rd=cr&ei=PkW8U8SsPOqK8Qfwt4DYAw
Content-Length: 262
Date: Tue, 08 Jul 2014 19:23:42 GMT
Server: GFE/2.0
Alternate-Protocol: 443:quic

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="https://www.google.co.in/?gfe_rd=cr&amp;ei=PkW8U8SsPOqK8Qfwt4DYAw">here</A>.
</BODY></HTML>

但我仍然想问或理解(根据我从可用资源中学习到的)每个打开SSL套接字的人都需要有一个SSL证书,那么我们在发送我们的SSL证书到服务器的那部分是怎么处理的,还是说这是由openssl库来完成的?另外,我想确认一下,openssl提供的SSL证书是openssl使用并发送到服务器的证书吗?

这个链接对理解SSL安全的基础知识有一点帮助。

1 个回答

4

你可以直接使用Paho Python客户端这个库来处理你问题中的MQTT和SSL部分吗?

下面是一个简单的例子,演示如何在test.mosquitto.org测试服务器上订阅一个主题,并打印收到的消息,同时支持SSL:

import paho.mqtt.client as paho

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

mqttc = paho.Client()
mqttc.on_message = on_message
mqttc.tls_set("mosquitto.org.crt") # http://test.mosquitto.org/ssl/mosquitto.org.crt
mqttc.connect("test.mosquitto.org", 8883)
mqttc.subscribe("bbc/#")
mqttc.loop_forever()

撰写回答