本页内容

  • 准备工作
  • 安装所需的依赖项
  • 安装 Mosquitto 服务器
  • 创建 MQTT 管理员密码
  • 如何使用 MQTT 发送和接收消息
  • 使用 Let's Encrypt SSL 保护 Mosquitto
  • 配置 MQTT 以使用 Let's Encrypt SSL
  • 配置 Mosquitto Websockets
  • 总结

Mosquitto 是 MQTT 协议的一个免费、开源且轻量级的服务器实现。它专为各类设备设计,从低功耗的单板计算机到完整的服务器均可适用。MQTT 运行在 TCP/IP 协议之上,并利用您现有的家庭互联网网络向物联网设备发送消息并响应这些消息。它使用 C 语言编写,这使得它比其他 MQTT 代理更快、更高效。

本文将以 Ubuntu 22.04 为例,向您演示如何安装 Mosquitto 服务器。

准备工作

  • 一台运行 Ubuntu 22.04 的服务器。
  • 服务器上已配置 root 密码。

安装所需的依赖项

在开始之前,建议将系统中的所有软件包更新并升级到最新版本。您可以使用以下命令进行更新:

apt update -y
apt upgrade -y

升级完所有软件包后,运行以下命令以安装其他所需的软件包:

apt-get install curl gnupg2 wget git apt-transport-https ca-certificates -y

所有必需的软件包安装完成后,您就可以进入下一步了。

安装 Mosquitto 服务器

默认情况下,Ubuntu 22.04 的默认软件源中并未包含 Mosquitto 软件包。因此,您需要将 Mosquitto 的官方软件源添加到 APT 中。您可以使用以下命令进行添加:

add-apt-repository ppa:mosquitto-dev/mosquitto-ppa -y

将软件源添加到 APT 后,您可以使用以下命令进行安装:

apt install mosquitto mosquitto-clients -y

安装完成后,您可以使用以下命令验证 Mosquitto 的状态:

systemctl status mosquitto

您应该会看到类似以下的输出:

? mosquitto.service - Mosquitto MQTT Broker
     Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2022-12-06 04:50:33 UTC; 8s ago
       Docs: man:mosquitto.conf(5)
             man:mosquitto(8)
    Process: 5491 ExecStartPre=/bin/mkdir -m 740 -p /var/log/mosquitto (code=exited, status=0/SUCCESS)
    Process: 5492 ExecStartPre=/bin/chown mosquitto:mosquitto /var/log/mosquitto (code=exited, status=0/SUCCESS)
    Process: 5493 ExecStartPre=/bin/mkdir -m 740 -p /run/mosquitto (code=exited, status=0/SUCCESS)
    Process: 5494 ExecStartPre=/bin/chown mosquitto:mosquitto /run/mosquitto (code=exited, status=0/SUCCESS)
   Main PID: 5495 (mosquitto)
      Tasks: 1 (limit: 2242)
     Memory: 1.3M
        CPU: 23ms
     CGroup: /system.slice/mosquitto.service
             ??5495 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

Dec 06 04:50:32 ubuntu2204 systemd[1]: Starting Mosquitto MQTT Broker...
Dec 06 04:50:33 ubuntu2204 systemd[1]: Started Mosquitto MQTT Broker.

创建 MQTT 管理员密码

出于安全考虑,建议为 MQTT 配置密码认证。

我们使用以下命令来设置一个管理员用户和密码:

mosquitto_passwd -c /etc/mosquitto/passwd hitesh

按如下方式设置密码:

Password: 
Reenter password: 

接下来,编辑 MQTT 配置文件,并定义端口和密码文件。

nano /etc/mosquitto/conf.d/default.conf

添加以下行:

listener 1883
password_file /etc/mosquitto/passwd

保存并关闭文件,然后重启 Mosquitto 服务以使更改生效。

systemctl restart mosquitto

如何使用 MQTT 发送和接收消息

您需要使用 Mosquitto 客户端连接到 Mosquitto 服务器,然后在不同主题上发送和接收消息。

在发送和接收消息之前,您需要先订阅一个主题。您可以在家庭自动化应用中使用以下主题之一。

  • home/lights/sitting_room
  • home/lights/kitchen
  • home/lights/master_bedroom
  • home/lights/kids_bedroom

我们运行以下命令以订阅 home/lights/kids_bedroom 主题。

mosquitto_sub -u hitesh -P password -t "home/lights/kids_bedroom"

接下来,打开一个新的终端界面,并使用以下命令向 home/lights/kids_bedroom 主题发布一条消息。

mosquitto_pub -u hitesh -P password -m "ON" -t "home/lights/kids_bedroom"

在第一个终端上,您将收到 ON 消息负载:

ON

现在,切换到第二个终端,并在同一主题上发送 OFF 消息。

mosquitto_pub -u hitesh -P password -m "OFF" -t "home/lights/kids_bedroom"

您应该在第一个终端上看到类似以下的消息:

ON
OFF

完成后,您就可以进入下一步了。

使用 Let's Encrypt SSL 保护 Mosquitto

要使用 SSL 保护 Mosquitto,您需要在服务器上安装 Certbot 客户端软件包。

首先,使用以下命令安装 Snap 软件包管理器:

apt install snapd

接下来,使用以下命令更新 Snap 软件包:

snap install core 
snap refresh core

接下来,使用以下命令安装 Certbot 软件包:

snap install --classic certbot

接下来,将 Certbot 可执行文件创建为系统位置的符号链接。

ln -s /snap/bin/certbot /usr/bin/certbot

接下来,运行以下命令以生成 SSL 证书。

certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m 
[email protected]
 -d mosquitto.linuxbuz.com

您应该会看到类似以下的输出:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for mosquitto.linuxbuz.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/mosquitto.linuxbuz.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/mosquitto.linuxbuz.com/privkey.pem
This certificate expires on 2023-03-06.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

您可以使用以下命令查看所有已生成的证书文件:

ls /etc/letsencrypt/live/mosquitto.linuxbuz.com/

您将看到类似以下的输出:

cert.pem  chain.pem  fullchain.pem  privkey.pem  README

接下来,使用以下命令生成 Diffie-Hellman 证书:

openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

完成后,您就可以进入下一步了。

配置 MQTT 以使用 Let's Encrypt SSL

首先,使用以下命令将所有生成的证书复制到 Mosquitto 目录:

cp /etc/letsencrypt/live/mosquitto.linuxbuz.com/fullchain.pem /etc/mosquitto/certs/server.pem
cp /etc/letsencrypt/live/mosquitto.linuxbuz.com/privkey.pem /etc/mosquitto/certs/server.key

接下来,为 Mosquitto 证书设置正确的所属用户和组。

chown -R mosquitto: /etc/mosquitto/certs

接下来,编辑 Mosquitto 配置文件并配置 Let's Encrypt SSL。

nano /etc/mosquitto/conf.d/default.conf

添加以下行:

listener 8883
certfile /etc/mosquitto/certs/server.pem
cafile  /etc/ssl/certs/ISRG_Root_X1.pem
keyfile /etc/mosquitto/certs/server.key
dhparamfile /etc/ssl/certs/dhparam.pem

保存并关闭文件,然后重启 Mosquitto 服务以使更改生效。

systemctl restart mosquitto

接下来,使用以下命令验证 Mosquitto 的连接:

mosquitto_pub -h mosquitto.linuxbuz.com -t "home/lights/kids_bedroom" -m "hello" -p 8883 --capath /etc/ssl/certs/ -u hitesh -P password

完成后,您就可以在 Web 浏览器中测试 Mosquitto 的连接了。

配置 Mosquitto Websockets

接下来,您需要配置 Websockets 以便从浏览器内部使用 MQTT 协议。您可以通过编辑 Mosquitto 的默认配置文件来启用它:

nano /etc/mosquitto/conf.d/default.conf

添加以下行:

listener 8083
protocol websockets
certfile /etc/mosquitto/certs/server.pem
cafile  /etc/ssl/certs/ISRG_Root_X1.pem
keyfile /etc/mosquitto/certs/server.key
dhparamfile /etc/ssl/certs/dhparam.pem

保存并关闭文件,然后重启 Mosquitto 服务以使更改生效。

systemctl restart mosquitto

接下来,打开您的终端界面并运行以下命令:

mosquitto_sub -u hitesh -P password -t "home/lights/kids_bedroom"

现在,打开您的 Web 浏览器,并使用基于浏览器的 MQTT 客户端来测试 Websockets 功能。您应该会看到类似以下的界面:

在 Ubuntu 22.04 上安装 Mosquitto MQTT 消息代理

输入您的 Mosquitto 服务器主机、端口、用户名、密码,然后点击“连接”(Connect)按钮。您应该会看到类似以下的界面:

在 Ubuntu 22.04 上安装 Mosquitto MQTT 消息代理

现在,输入任意主题和消息,然后点击“发布”(Publish)按钮。

接下来,返回终端界面。您应该在类似以下的输出中看到您发布的消息:

Hi

总结

在本文中,我们介绍了如何在 Ubuntu 22.04 上安装 Mosquitto 服务器,并使用 Let's Encrypt SSL 对其进行安全加固。我们还通过基于浏览器的客户端对 Mosquitto 进行了测试。如果您有任何疑问,欢迎随时向我提问。