如何在 Debian 11 上安装 Mosquitto MQTT 消息代理
在此页
- 先决条件
- 安装 Mosquitto 服务器和客户端
- 在 Mosquitto 上设置身份验证
- 使用 SSL/TLS 证书保护 Mosquitto
- 在 Mosquitto 上启用 WebSocket
- 结论
Eclipse Mosquitto 是 MQTT 协议的免费开源消息代理实现。 Mosquitto 实现了 MQTT 3.1.0、3.1.1 和 5.0 版本。 Mosquitto 是一个轻量级的消息代理,适合多种类型的部署和使用。
Mosquitto 是一个消息代理,它使用发布/订阅模型来传递消息。它使用低带宽并易于实施,这意味着适用于小型设备和 IoT(物联网)、移动设备、嵌入式计算机和微控制器的部署。
在本教程中,我们将介绍在 Debian 11 服务器上安装和配置 Mosquitto MQTT Message Broker、设置身份验证、通过 SSL/TLS 证书保护 Mosquitto 以及在 Mosquitto 上启用 WebSockets 的过程。
先决条件
首先,您必须满足以下要求才能完成本教程:
- Debian 11 服务器 - 该演示使用主机名为 mosquitto-server 的 Debian 服务器。
- 具有根/管理员权限的非根用户。
安装 Mosquitto 服务器和客户端
Mosquitto 是一个开源的 MQTT 消息代理,可以安装在多个平台上,例如 Windows、Linux、BSD 和 macOS。对于 Debian Linux 发行版,Mosquitto 在默认的 Debian 存储库中可用,这使您可以通过 APT 轻松安装它。
在此步骤中,您将了解在 Debian 服务器上安装 Mosquitto 服务器和客户端的过程。您还将复习 Mosquitto 命令行(mosquitto_sub 和 mosquitto_pub)的基本用法以验证 Mosquitto 服务器安装。
首先,通过下面的 apt 命令更新和刷新您的 Debian 软件包索引。
sudo apt update
使用以下 apt 命令搜索 mosquitto 包。
sudo apt search mosquitto
您应该会看到 Debian 存储库中默认提供的一些 Mosquitto 软件包,其中包括 Mosquitto 服务器应用程序和客户端。

现在运行下面的 apt 命令来安装 Mosquitto 包。出现提示时,输入 y 确认并按 ENTER 继续。
sudo apt install mosquitto mosquitto-clients

安装 Mosquitto 后,通过以下 systemctl 命令验证 Mosquitto 服务。
sudo systemctl is-enabled mosquitto
sudo systemctl status mosquitto
然后您会看到 Mosquitto 服务已启用,并且会在启动时自动运行。 Mosquitto 服务的当前状态是运行。

现在 Mosquitto 服务器正在运行,接下来您将通过客户端命令行 mosquitto_sub 和 mosquitto-pub 验证 Mosquitto。
简单来说,mosquitto_sub 是用于从 mosquitto_pub(发布者)接收消息(订阅者)的命令行工具。
运行以下 mosqitto_sub 命令以接收有关主题 test 的一些消息。
sudo mosquitto_sub -h localhost -t test
接下来,打开服务器的一个新终端会话并运行以下 mosquitto_pub 命令以向主题test 发送一些消息
sudo mosquitto_pub -h localhost -t test -m "Hello from terminal 2"
sudo mosquitto_pub -h localhost -t test -m "Hello from terminal 2 - Publisher"
sudo mosquitto_pub -h localhost -t test -m "Hello"
然后,您将通过接收器 mosquitto_sub 上的 mosquitto_pub 看到发布的消息,这意味着 Mosquitto 服务器和客户端安装成功。

在 Mosquitto 上设置身份验证
默认的 Mosquitto 安装没有身份验证。为了保护部署(尤其是在生产环境中),您应该在 Mosquitto 服务器上启用身份验证。您可以在 Mosquitto 上创建和定义用户,并通过用户名/密码身份验证保护 Mosquitto Sub 和 Pub。
运行以下命令以创建新的 Mosquitto 用户和密码。此演示使用用户 alice,密码将在文件 /etc/mosquitto/.passwd 中生成和散列。
sudo mosquitto_passwd -c /etc/mosquitto/.passwd alice
输入 Mosquitto 用户 alice 的密码并重复密码。
创建用户名/密码后,使用以下 nano 编辑器命令创建一个新的 Mosquitto 配置 /etc/mosquitto/conf.d/auth.conf。
sudo nano /etc/mosquitto/conf.d/auth.conf
将以下配置添加到文件中。这将在端口 1883 上运行 Mosquitto,禁用匿名访问,并将密码文件定义为 /etc/mosquitto/.passwd。
listener 1883
allow_anonymous false
password_file /etc/mosquitto/.passwd
完成后保存文件并退出编辑器。
接下来,重新启动 Mosquitto 服务以应用新更改。 Mosquitto 服务器现在应该在启用身份验证的情况下运行。
sudo systemctl restart mosquitto

要验证身份验证 Mosquitto 服务器,您可以使用 mosquitto_sub 和 mosquitto_pub 命令。
当您在发布/订阅过程中未提供用户名/密码时,您将被拒绝并拒绝连接。但是,如果您提供了用于身份验证的用户名/密码并且您拥有正确的凭据,您将能够通过 Mosquitto 订阅者和发布者发送和接收消息。
运行以下命令无需身份验证即可在 Mosquitto 上验证 Pub 和 Sub。
# session - Mosquitto Subscriber
sudo mosquitto_sub -h localhost -t test
# session - Mosquitto Publisher
sudo mosquitto_pub -h localhost -t test -m "Hello again from terminal 2"
然后你会看到,如果没有身份验证,与 Mosquitto 服务器的两个连接都将被拒绝,因为它未经授权,你将无法发送和接收消息。

接下来,运行以下命令以使用用户和密码验证 Mosquitto 的 Pub 和 Sub。
# session - Mosquitto Subscriber
sudo mosquitto_sub -h localhost -t test -u "alice" -P "p4ssw0rd"
# session - Mosquitto Publisher
sudo mosquitto_pub -h localhost -t "test" -m "Hello - enabled auth" -u "alice" -P "p4ssw0rd"
当 Mosquitto 凭据正确时,您将同时连接到 Mosquitto 订阅者和发布者,并且您可以通过 Mosquitto 命令行发送和接收消息。

随着 Mosquitto 服务器的运行和身份验证的启用,您现在应该拥有一个安全的消息代理。但是,为了获得更高的安全性,您还可以在本地 Mosquitto 数据传输和连接上通过 SSL/TLS 证书添加授权。
使用 SSL/TLS 证书保护 Mosquitto
虽然 Mosquitto 服务器通过身份验证得到保护,但您仍然必须执行几个步骤来确保 Mosquitto 部署的安全。这包括 SSL/TLS 证书的实施,这些证书将加密 Mosquitto 服务器和应用程序之间的数据传输。
在开始之前,请确保您已为本地环境生成 SSL/TLS 证书。
首先,运行以下 openssl 命令以生成 dhparam 证书。这会将 DHPARAM 证书生成到 /etc/mosquitto/certs/dhparam.pem。
sudo openssl dhparam -out /etc/mosquitto/certs/dhparam.pem 2048

现在通过下面的 chmod 命令将 Mosquitto 证书目录的所有权更改为用户 mosquitto。
sudo chown -R mosquitto: /etc/mosquitto/certs
接下来,使用以下 nano 编辑器命令创建一个新的附加配置 /etc/mosquitto/conf.d/ssl.conf。这样,您将通过 SSL/TLS 证书在 Mosquitto 服务器上启用安全连接。
sudo nano /etc/mosquitto/conf.d/ssl.conf
将以下配置添加到文件中。这将在端口 8883 上运行 Mosquitto,并在其上启用 TLS。因此,请务必更改 SSL/TLS 证书的路径。
listener 8883
certfile /etc/letsencrypt/live/msqt.hwdomain.io/fullchain.pem
cafile /etc/letsencrypt/live/msqt.hwdomain.io/chain.pem
keyfile /etc/letsencrypt/live/msqt.hwdomain.io/privkey.pem
dhparamfile /etc/mosquitto/certs/dhparam.pem
完成后保存文件并退出编辑器。
现在运行以下 systemctl 命令以重新启动 Mosquitto 服务并应用新的更改。现在 Mosquitto 服务器将在启用安全 TLS 的情况下运行。
sudo systemctl restart mosquitto
启用 SSL/TLS 后,您将通过安全连接向 Mosquitte 订阅者发送消息来验证配置。
运行以下 mosquitto_sub 命令以在当前终端会话中打开 Mosquitte Subscriber。
sudo mosquitto_sub -h localhost -t test -u "alice" -P "p4ssw0rd"
接下来,打开一个新会话,连接到服务器,然后运行以下命令向 Mosquitto 服务器发送消息。这样,您将通过在端口 8883 上运行的 SSL/TLS 连接连接到 Mosquitto 服务器 msqt.hwdomain.io。
sudo mosquitto_pub -h msqt.hwdomain.io -t test -m "hello again - with SSL enabled" -p 8883 --capath /etc/ssl/certs/ -u "alice" -P "p4ssw0rd"
您现在应该在 Mosquitto Subscriber shell 上收到消息。 Mosquitto 生产者通过在端口 8883 上运行的安全 SSL/TLS 连接向 Mosquitto 订阅者发送消息。

在 Mosquitto 上启用 WebSockets
至此,您已经安装了 Mosquitto 服务器并确保安装启用用户名/密码身份验证和 SSL/TLS 安全连接。然后,您将学习如何在 Mosquitto 服务器上通过 MQTT 启用 WebSockets。
WebSocket 是一种有状态的通信协议,它通过重用在通信开始时(在打开握手期间)打开的相同连接,在服务器和客户端之间提供持久的全双工通道。
首先,使用以下 nano 编辑器命令创建一个新配置 /etc/mosquitto/conf.d/websockets.conf。
sudo nano /etc/mosquitto/conf.d/websockets.conf
将以下配置添加到文件中。这将启用 WebSockets 协议并通过 SSL/TLS 证书保护它。 WebSockets 将在端口 8083 上运行。
listener 8083
protocol websockets
certfile /etc/letsencrypt/live/msqt.hwdomain.io/fullchain.pem
cafile /etc/letsencrypt/live/msqt.hwdomain.io/chain.pem
keyfile /etc/letsencrypt/live/msqt.hwdomain.io/privkey.pem
完成后保存文件并退出编辑器。
接下来,运行以下 systemctl 命令以重新启动 Mosquitto 服务并应用新的更改。 Mosquitto 服务器现在将在安全 SSL/TLS 连接之上启用 WebSockets 运行。
sudo systemctl restart mosquitto
要验证 WebSockets 配置,您可以通过第三方工具(例如适用于 Linux、Windows 和 macOS 等主要操作系统的 MQTT Explorer)连接到 Mosquitto。
下面是带有 WebSockets 连接的 MQTT Explorer。

连接后,您应该会看到以下仪表板。

结论
在本指南中,您学习了如何在 Debian 11 服务器上安装 Mosquitto MQTT Message Broker。您还了解了如何通过启用用户名/密码身份验证以及通过 SSL/TLS 证书保护 Mosquitto 数据传输和连接来保护 Mosquitto 服务器。除此之外,您还在 Mosquitto 服务器上启用了 WebSockets 协议,该协议允许您在订阅者和生产者之间异步建立连接。
从这里开始,您现在可以通过创建高可用性 Mosquitto 集群或通过 Cedalo 管理中心设置 Mosquitto 管理仪表板来利用 Mosquitto 安装。