介绍
MQTT是一种机器对机器的消息传递协议,旨在为“物联网”设备提供轻量级的发布/订阅通信。它通常用于车辆的地理跟踪,家庭自动化,环境传感器网络和公用事业规模的数据收集。
Mosquitto是流行的MQTT服务器(或MQTT的代理),它具有强大的社区支持,并且易于安装和配置。
在本教程中,我们将安装Mosquitto并将代理设置为使用SSL来保护受密码保护的MQTT通信。
先决条件
在开始本教程之前,您需要:
-
具有非root用户,启用sudo的用户和基本防火墙设置的Debian 10服务器,如本Debian 10服务器设置教程中所述。
-
指向您服务器的域名,如我们的DigitalOcean DNS产品文档中所述。本教程将
mqtt.example.com
通篇使用。 -
使用Certbot工具生成的可自动更新的“让我们加密SSL证书以用于您的域和Mosquitto”。您可以在如何使用Certbot独立模式来检索让我们在Debian 10上加密SSL证书中
学习如何进行设置。您可以在步骤4中添加systemctl restart mosquitto
arenew_hook
。请确保使用在先前的前提条件步骤中配置的相同域。
第1步-安装Mosquitto
Debian 10在其默认软件存储库中具有Mosquitto的较新版本,因此我们可以从那里安装它。
首先,使用您的非root用户登录并使用以下命令更新软件包列表apt update
:
sudo apt update
现在,使用安装Mosquitto apt install
:
sudo apt install mosquitto mosquitto-clients
默认情况下,Debian将在安装后启动Mosquitto服务。让我们测试默认配置。我们将使用刚刚安装的Mosquitto客户端之一来订阅经纪人上的主题。
主题是您将消息发布到并订阅的标签。它们按层次结构排列,因此例如可以有sensors/outside/temp
和sensors/outside/humidity
。您如何安排主题取决于您和您的需求。在本教程中,我们将使用一个简单的测试主题来测试我们的配置更改。
第二次登录到服务器,因此并排有两个终端。在新终端中,用于mosquitto_sub
订阅测试主题:
mosquitto_sub -h localhost -t test
-h
用于指定MQTT服务器的主机名,并且-t
是主题名称。点击后您将看不到任何输出,ENTER
因为它mosquitto_sub
正在等待消息到达。切换回另一个终端并发布一条消息:
mosquitto_pub -h localhost -t test -m "hello world"
的选项mosquitto_pub
与相同mosquitto_sub
,尽管这次我们使用附加-m
选项来指定消息。点击ENTER
,您应该会在另一个终端中看到hello world。您已经发送了第一条MQTT消息!
输入CTRL+C
第二个终端以退出mosquitto_sub
,但保持与服务器的连接打开。我们将在步骤5中再次使用它进行另一项测试。
接下来,我们将使用基于密码的身份验证来保护安装。
步骤2 —配置MQTT密码
让我们将Mosquitto配置为使用密码。Mosquitto包含一个实用程序,用于生成名为的特殊密码文件mosquitto_passwd
。该命令将提示您输入指定用户名的密码,并将结果放在中/etc/mosquitto/passwd
。
sudo mosquitto_passwd -c /etc/mosquitto/passwd sammy
现在,我们将为Mosquitto打开一个新的配置文件,并告诉它使用此密码文件要求所有连接都需要登录:
sudo nano /etc/mosquitto/conf.d/default.conf
这应该打开一个空文件。粘贴以下内容:
<span style="color:#333333"><span style="color:#545454"><code class="language-bash">allow_anonymous <span style="color:#08966b">false</span>
password_file /etc/mosquitto/passwd</code></span></span>
确保在文件末尾保留换行符。
allow_anonymous false
将禁用所有未经身份验证的连接,并且该password_file
行告诉Mosquitto在哪里查找用户和密码信息。保存并退出文件。
现在,我们需要重新启动Mosquitto并测试我们的更改。
sudo systemctl restart mosquitto
尝试发布没有密码的消息:
mosquitto_pub -h localhost -t "test" -m "hello world"
该消息应被拒绝:
Output
Connection Refused: not authorised. Error: The connection was refused.
在再次尝试使用密码之前,请再次切换到第二个终端窗口,并使用用户名和密码来订阅“ test”主题:
mosquitto_sub -h localhost -t test -u "sammy" -P "password"
它应该连接并坐着,等待消息。在本教程的其余部分中,您可以保持此终端的打开和连接状态,因为我们会定期向其发送测试消息。
现在,再次使用用户名和密码在另一个终端上发布一条消息:
mosquitto_pub -h localhost -t "test" -m "hello world" -u "sammy" -P "password"
该消息应按照步骤1中的顺序进行。我们已成功为Mosquitto添加了密码保护。不幸的是,我们正在通过互联网发送未加密的密码。接下来,我们将为Mosquitto添加SSL加密来解决此问题。
步骤3 —配置MQTT SSL
要启用SSL加密,我们需要告诉Mosquitto我们的“加密”证书的存储位置。打开我们之前开始的配置文件:
sudo nano /etc/mosquitto/conf.d/default.conf
在文件末尾粘贴以下内容,保留我们已经添加的两行:
<span style="color:#333333"><span style="color:#545454"><code class="language-bash"><span style="color:#e0276a">.</span> <span style="color:#e0276a">.</span> <span style="color:#e0276a">.</span>
listener <span style="color:#225196">1883</span> localhost
listener <span style="color:#225196">8883</span>
certfile /etc/letsencrypt/live/<span style="color:inherit">mqtt.example.com</span>/cert.pem
cafile /etc/letsencrypt/live/<span style="color:inherit">mqtt.example.com</span>/chain.pem
keyfile /etc/letsencrypt/live/<span style="color:inherit">mqtt.example.com</span>/privkey.pem</code></span></span>
同样,请确保在文件末尾保留换行符。
我们将两个单独的listener
块添加到配置中。首先,listener 1883 localhost
更新端口上的默认MQTT侦听器1883
,这是我们到目前为止已连接的端口。1883
是标准的未加密MQTT端口。该localhost
行的一部分指示Mosquitto仅将此端口绑定到localhost接口,因此无法从外部访问它。无论如何,外部请求都将被我们的防火墙阻止,但是最好是明确的。
listener 8883
在port上设置一个加密的侦听器8883
。这是MQTT + SSL的标准端口,通常称为MQTTS。接下来的三行,certfile
,cafile
,和keyfile
,都指向Mosquitto到合适咱们加密文件建立的加密连接。
保存并退出文件,然后重新启动Mosquitto以更新设置:
sudo systemctl restart mosquitto
更新防火墙以允许连接到端口8883
。
sudo ufw allow 8883
Output
Rule added Rule added (v6)
现在,我们再次使用进行测试mosquitto_pub
,并为SSL提供了几种不同的选项:
mosquitto_pub -h mqtt.example.com -t test -m "hello again" -p 8883 --capath /etc/ssl/certs/ -u "sammy" -P "password"
请注意,我们使用的是完整的主机名,而不是localhost
。由于我们的SSL证书是针对颁发的mqtt.example.com
,如果我们尝试建立安全连接,localhost
则会收到一条错误消息,指出主机名与证书主机名不匹配(即使它们都指向同一台Mosquitto服务器)。
--capath /etc/ssl/certs/
为启用SSL mosquitto_pub
,并告诉它在哪里寻找根证书。这些通常是由您的操作系统安装的,因此Mac OS,Windows等的路径是不同的。mosquitto_pub
使用根证书来验证Mosquitto服务器的证书已由Let's Encrypt证书颁发机构正确签名。这是需要注意的重要mosquitto_pub
,并mosquitto_sub
会尝试在没有此选项(或类似的SSL连接--cafile
选项),即使你连接的标准安全端口8883
。
如果测试一切顺利,我们将在另一个终端再次看到问候mosquitto_sub
。这意味着您的服务器已完全设置好!如果您想扩展MQTT协议以使用websocket,则可以执行最后一步。
步骤4 —通过Websockets配置MQTT(可选)
为了在Web浏览器中使用JavaScript讲MQTT,该协议经过修改可在标准Websocket上工作。如果不需要此功能,则可以跳过此步骤。
我们需要在listener
Mosquitto配置中再添加一个块:
sudo nano /etc/mosquitto/conf.d/default.conf
在文件末尾,添加以下内容:
<span style="color:#333333"><span style="color:#545454"><code class="language-bash"><span style="color:#e0276a">.</span> <span style="color:#e0276a">.</span> <span style="color:#e0276a">.</span>
listener <span style="color:#225196">8083</span>
protocol websockets
certfile /etc/letsencrypt/live/<span style="color:inherit">mqtt.example.com</span>/cert.pem
cafile /etc/letsencrypt/live/<span style="color:inherit">mqtt.example.com</span>/chain.pem
keyfile /etc/letsencrypt/live/<span style="color:inherit">mqtt.example.com</span>/privkey.pem</code></span></span>
同样,请确保在文件末尾保留换行符。
除端口号和protocol websockets
行外,这与上一个块几乎相同。websockets上没有用于MQTT的官方标准化端口,但是这8083
是最常见的端口。
保存并退出文件,然后重新启动Mosquitto。
sudo systemctl restart mosquitto
现在,打开8083
防火墙中的端口。
sudo ufw allow 8083
为了测试此功能,我们将使用基于浏览器的公共MQTT客户端。那里有一些,但是Eclipse Paho JavaScript Client使用起来简单明了。在浏览器中打开Paho客户端。您会看到以下内容:
如下填写连接信息:
- 主机应该是您的Mosquitto服务器的域
mqtt.example.com
。 - 端口应该是
8083
。 - 可以将ClientId保留为默认值js-utility-DI1m6。
- 路径可以保留为默认值/ mqtt。
- 用户名应该是您的Mosquitto用户名;在这里,我们使用了萨米。
- 密码应该是您选择的密码。
其余字段可以保留为其默认值。
按下Connect之后,基于Paho浏览器的客户端将连接到您的Mosquitto服务器。
要发布消息,请导航到“发布消息”窗格,填写主题为test,然后在“消息”部分中输入任何消息。接下来,按发布。该消息将显示在您的mosquitto_sub
终端中。
结论
现在,我们已经建立了安全的,受密码保护和SSL保护的MQTT服务器。对于您梦dream以求的项目,它都可以充当健壮且安全的消息传递平台。与MQTT协议配合使用的一些流行软件和硬件包括:
- OwnTracks,您可以在手机上安装的开源地理跟踪应用程序。OwnTracks将定期向您的MQTT服务器报告位置信息,然后您可以将其存储在地图上并显示在地图上,或者根据您的位置创建警报并激活IoT硬件。
- Node-RED是基于浏览器的图形界面,用于“连接”物联网。您可以将一个节点的输出拖到另一个节点的输入,并且可以通过各种协议之间的过滤器将信息路由到数据库等。NodeTT很好地支持MQTT。
- 该ESP32是一种廉价的无线微控制器MQTT能力。您可以将其连接起来以将温度数据发布到某个主题,或者订阅气压主题并在暴风雨来临时发出蜂鸣声!
这些只是MQTT生态系统中的一些流行示例。有更多的硬件和软件可以使用该协议。如果您已经拥有喜欢的硬件平台或软件语言,则它可能具有MQTT功能。让您的“事物”互相交谈,祝您玩得开心!