将 MQTT 数据包装在 SSL 证书中,同时将其发送到 MQTT 代理

Posted

技术标签:

【中文标题】将 MQTT 数据包装在 SSL 证书中,同时将其发送到 MQTT 代理【英文标题】:Wrapping MQTT data in SSL certificate while sending it to MQTT broker 【发布时间】:2014-07-08 17:09:56 【问题描述】:

我正在使用在 RPI 上运行的 MQTT python 客户端。我不是来自 Web 相关领域的人,但我需要实现 SSL 安全性,同时我将一些数据从我的 python 客户端发送到开源 MQTT 代理。

我在 python 中找到了certain package,用于在打开套接字时封装 SSL 安全性。我是python的新手。所以我想了解它是如何工作的,以及如果我们想实现 SSL 安全性我们需要做什么。This question 解释了很多关于 SSl 以及它是如何发生的。但是如果我需要用 python 来实现它,我将如何在我的 RPI 上本地安装 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 提供了 openssl 正在使用并发送到服务器的 SSL 证书?

This link 有助于了解 SSL 安全的基础知识。

【问题讨论】:

【参考方案1】:

您能否只使用Paho Python client 库来处理问题的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()

【讨论】:

以上是关于将 MQTT 数据包装在 SSL 证书中,同时将其发送到 MQTT 代理的主要内容,如果未能解决你的问题,请参考以下文章

MQTT研究之EMQ:SSL证书链验证

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

在 InstallShield 安装期间导入 SSL 证书后,无法以编程方式将其与 IIS 中的绑定相关联

charles3.11.2需要怎么安装ssl证书

ESA2GJK1DH1K安全篇: MQTT配置单向SSL

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