ESP32 教程:使用 MQTT + SSL 安全传输数据

安全性是 MQTT 代理非常重要的一个方面。在之前的文章中,您已经学习了如何实现身份验证和授权。这种配置的弱点在于证书是以明文传送的;因此,对于可以嗅探网络流量的攻击者来说,读取和使用它们来冒充合法的客户端是可能的。

今天我将向您展示:如何使用 SSL 证书加密客户端和代理之间的通信通道。 我还将解释,如何编写一个 esp32 芯片的程序,使用安全通道向代理发送数据...

步骤1:SSL 证书

为了能够加密通信,mosquitto 需要服务器证书。

首先产生私钥(长度至少为2048位的RSA):

openssl genrsa -out mosquitto.key 2048

然后生成 CSR 文件:

openssl req -new -out mosquitto.csr -key mosquitto.key

键入所需的信息; 其中最重要的是识别服务器的通用名称:

Mosquitto SSL

现在使用您的证书颁发机构签署 CSR 文件(或将其发送给公共/公司CA)以生成证书:

openssl ca -config openssl.cnf -extensions server_cert 
 -notext -in mosquitto.csr -out mosquitto.cer

Mosquitto

在安装了 mosquitto 的文件夹中创建 ssl 子文件夹,并将该证书,其私钥和 CA 的证书复制到该文件夹中。

步骤2:配置

打开 mosquitto.conf 文件,并添加以下行:

mosquitto.conf

第一行改为 TCP 端口 mosquitto 通常正在监听(1883)到默认的 SSL 连接端口 8883

以下 3 行设置服务器证书和 CA 证书以及与服务器证书对应的私钥的路径。最后一个不是强制性的,强制使用 TLS v1.2协议,这是目前最安全的协议。

一旦服务器已经配置好,你可以启动它(-v 是启用详细输出):

mosquitto.exe -c mosquitto.conf -v

为了能够使用 mosquitto_pubmosquitto_sub 工具,您现在必须添加新的参数:

mosquitto_sub.exe -p 8883 -t test --cafile .\ssl\ca.cer --insecure
mosquitto_pub.exe -p 8883 -m 20 -t test --cafile .\ssl\ca.cer --insecure

使用 -p 指定服务器的 TCP 端口,-cafile 是签名了服务器证书的CA证书的路径,最后是 -insecure,您将两个客户端配置为不验证证书的公用名称(在我的示例中 mymosquitto.local)对应于服务器名称。

注意:你可以避免使用 -insecure 开关,如果你生成一个公用名称的证书,包含运行 mosquitto 服务器/ PC的确切名称;或者 - 如果你添加一个DNS别名,解析 IP 地址的证书的公用名称 并使用 -h commonName 运行客户端。

ESP32

Tuan PM 为 esp-idf 框架开发了一个库(espmqtt),它实现了一个完整的 MQTT 客户端。而且,库支持安全连接,因此可以使用它来连接到启用了 TLS 的 MQTT 代理。

将 Github 代码库的内容复制到项目的 components 文件夹中,并在源代码中包含该库的头文件:

#include "mqtt.h"

MQTT 客户端使用 mqtt_settings 结构进行配置:

MQTT 设置

最重要的参数是:

  • 运行 MQTT 代理的服务器(host)(您可以使用 IP 地址或 DNS 名称)
  • 服务器正在侦听的 TCP 端口(port)(如果启用 SSL,则默认为 1883 或 8883)
  • 用户名(username)和密码(password),如果服务器需要验证
  • 当相应的事件发生时,espmqtt库将调用一个或多个回调函数

注意:espmqtt 库不会复制内部结构中的参数。因此,mqtt_settings 变量具有全局作用域,并且在特定函数之外定义是非常重要的。

您的程序可以与实现其回调函数的 MQTT 客户端进行交互。

例如,从 MQTT 服务器连接或断开连接的过程如下所示:

MQTT 连接服务器

connect_cb 和 disconnect_cb 函数执行 “真实” 连接和断开连接,而 connected_cb 和 disconnected_cb 函数在相应的活动完成后(=客户端成功连接到服务器)执行。你的程序通常不需要重新实现主要功能,而是实现与事件相关的功能,在发生特定事件时执行动作(例如订阅主题)。

配置好客户端之后,你可以运行它:

mqtt_start(&settings);

一旦连接到服务器(connected_cb 回调函数),您可以订阅或取消订阅主题:

void mqtt_subscribe(mqtt_client *client, const char *topic, uint8_t qos);
void mqtt_unsubscribe(mqtt_client *client, const char *topic);

并将数据发布到以下主题:

void mqtt_publish(mqtt_client* client, const char *topic, 
  const char *data, int len, int qos, int retain);

示例

我准备了一个例子来显示我的 esp32 开发板发送数据到 mosquitto 服务器,启用 SSL。

如前一篇文章中所述,我将 HTU21D 传感器连接到开发板,我的程序每 5 秒读取一次温度和湿度值,并将其发送给代理。 我使用了一个非常方便的开源程序 HelloIoT 来创建仪表板并显示接收到的数据。

程序的源代码和 HelloIoT 仪表板的配置可以在我的 Github 库中找到; 这里是演示的简短视频:

原文地址:http://www.lucadentella.it/en/2017/12/04/esp32-28-mqtt-e-ssl/

尚未评分
您的评分将帮助我们做出更好的玩法

观光\评论区

Copyright © 2017 玩点什么. All Rights Reserved.