MQTT(消息队列遥测传输)是ISO 标准下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议。
Mosquitto是一款实现了消息推送协议 MQTT v3.1 的开源消息代理软件,提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息通信变得简单,比如现在应用广泛的低功耗传感器,手机、嵌入式计算机、微型控制器等移动设备。它具有强大的社区支持,并且易于安装和配置。
在本教程中,我们将教你安装Mosquitto,并通过腾讯云免费的SSL证书进行加密配置。
在开始本教程之前,您需要:
mqtt.example.com
进行简介。nano
,您可以使用sudo yum -y install nano
命令进行安装或者替换您最喜欢的文本编辑器。CentOS 7 默认没有mosquitto
包。要安装它,首先我们将安装一个额外的软件软件包,即 EPEL
的额外软件存储库。该存储库中充满了可在CentOS,Red Hat和其他面向企业的Linux发行版上的软件。
使用yum
软件包管理器安装epel-release
软件包。
sudo yum -y install epel-release
这会将EPEL存储库信息添加到我们的系统中。在整个过程中,-y
选项会对几个问题自动回答“是”。现在我们可以安装mosquitto
包了。
sudo yum -y install mosquitto
该软件包带有一个简单的默认配置,所以让我们运行它来测试我们是否安装成功。
sudo systemctl start mosquitto
我们还需要启用服务,以确保它在重新启动系统时启动:
sudo systemctl enable mosquitto
现在让我们测试默认配置。mosquitto
包附带了一些MQTT客户端命令行。我们将使用其中一个订阅代理上的主题。
主题是您发布消息并订阅的标签。它们按等级排列,你可以有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
,不要关闭其他终端哦,后面我们还要进行测试。
接下来,我们将使用新的Let's Encrypt客户端Certbot通过SSL保护我们的安装。
进入SSL证书管理控制台
单击【申请证书】
查看申请域名型证书型号,单击【确定】
填写自己申请的域名,例如qcloud.com,cloud.tencent.com,demo.test.qlcoud.com。
证书默认支持收到DNS验证,验证方法可查看详情。
提交申请成功后弹窗提示如下,需要前往【证书详情页】获取CName记录添加解析:
获取CName记录如Tips中显示,需要尽快成功添加解析,方可通过CA机构审核:
Mosquitto包含一个工具,用于生成一个特殊的密码文件,名为mosquitto_passwd
。此工具将提示您输入指定用户名的密码,并将结果放在/etc/mosquitto/passwd
。
sudo mosquitto_passwd -c /etc/mosquitto/passwd sammy
现在,我们将替换默认的配置文件,并告诉Mosquito使用这个密码文件来要求所有连接的登录。首先,删除现有的 mosquitto.conf
。
sudo rm /etc/mosquitto/mosquitto.conf
现在打开一个新的空白配置。
sudo nano /etc/mosquitto/mosquitto.conf
把下面的内容粘贴进去。
allow_anonymous false
password_file /etc/mosquitto/passwd
allow_anonymous false
将禁用所有未经身份验证的连接,并且password_file
告诉Mosquitto在哪里查找用户和密码,保存并退出文件。
现在我们需要重新启动Mosquitto并测试。
sudo systemctl restart mosquitto
尝试在没有密码的情况下发布消息。
mosquitto_pub -h localhost -t "test" -m "hello world"
你应该看到被拒绝的信息:
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加密来修复这个问题。
要启用SSL加密,我们需要告诉Mosquitto存储Let的加密证书的位置。打开我们之前启动的配置文件。
sudo nano /etc/mosquitto/mosquitto.conf
在文件末尾粘贴以下内容,留下我们已经添加的两行:
. . .
listener 1883 localhost
listener 8883
certfile /etc/Tencent_Cloud_SSL/live/mqtt.example.com/cert.pem
cafile /etc/Tencent_Cloud_SSL/live/mqtt.example.com/chain.pem
keyfile /etc/Tencent_Cloud_SSL/live/mqtt.example.com/privkey.pem
我们要增加两个单独的listener
到配置。第一个,listener 1883 localhost
,更新1883
端口上的默认mqtt侦听器。1883
是标准的未加密的MQTT端口。Mosquitto
只将该端口绑定到localhost
接口,因此无法从外部访问它。外部请求无论如何都会被防火墙阻止。
listener 8883
在端口上设置加密侦听器8883
端口。这是MQTT+SSL的标准端口,通常称为MQTTS。接下来的三行,certfile
,cafile
和keyfile
,填写您在腾讯云申请到的证书地址。
保存并退出该文件。
在重新启动Mosquitto
以加载新配置之前,我们需要安装一个mosquitto
服务文件。systemd
这个文件用于确定如何运行mosquitto
。在你最喜欢的编辑器里打开它。
sudo nano /etc/systemd/system/multi-user.target.wants/mosquitto.service
找一行写着User=mosquitto
然后删除它,然后保存并退出该文件。
Mosquitto仍将作为mosquitto用户,但是当它第一次启动时,它将具有root特权,并自动安装您申请的SSl证书。在装载证书后,它将自动变为到mosquitto的用户。
我们需要重新加载systemd
,因此它会注意到我们对服务文件所做的更改。
sudo systemctl daemon-reload
现在我们可以重新启动Mosquitto来更新设置。
sudo systemctl restart mosquitto
更新防火墙以允许连接到8883
端口。
sudo firewall-cmd --permanent --add-port=8883/tcp
重新加载防火墙。
sudo firewall-cmd --reload
现在我们再次使用mosquitto_pub
,和以前不同,我们需要加上几个不同的SSL选项。
mosquitto_pub -h mqtt.example.com -t test -m "hello again" -p 8883 --cafile /etc/ssl/certs/ca-bundle.crt -u "sammy" -P "password"
我们使用的是完整的主机名,而不是localhost
。因为我们的ssl证书是为mqtt.example.com
,如果我们尝试连接到localhost
我们将得到一个错误,即主机名与证书主机名不匹配。
--cafile /etc/ssl/certs/ca-bundle.crt
为mosquitto_pub
启用SSL,并告诉它在哪里查找根证书。它们通常是由操作系统安装的,所以对于MacOS、Windows等来说,路径是不同的。mosquitto_pub
使用根证书来验证Mosmisto服务器的证书是否已由腾讯云所签发的证书颁发机构正确地签名。重要的是要注意mosquitto_pub
和mosquitto_sub
如果没有此选项,将不会尝试使用ssl连接,即使您正在连接到标准的安全端口8883
。
如果一切顺利,我们将看到Hello again出现在另一个mosquitto_sub
终端。这意味着您的服务器已经完全设置好了!如果您希望扩展MQTT协议以使用WebSocket,则可以执行最后一步。
为了在Web浏览器中使用JavaScript来使用MQTT,该协议被调整为在标准WebSocket上工作。如果不需要此功能,则可以跳过此步骤。
我们需要再次打开mosquitto
配置文件
sudo nano /etc/mosquitto/mosquitto.conf
在文件末尾添加以下内容:
. . .
listener 8083
protocol websockets
certfile /etc/Tencent_Cloud_SSL/live/mqtt.example.com/cert.pem
cafile /etc/Tencent_Cloud_SSL/live/mqtt.example.com/chain.pem
keyfile /etc/Tencent_Cloud_SSL/live/mqtt.example.com/privkey.pem
除了端口号和协议websockets
行之外,这与前一个块大致相同。MQTT在websockets
上没有官方标准化端口,但8083
是最常见的。
保存并退出该文件,然后重新启动Mosquitto。
sudo systemctl restart mosquitto
现在,在防火墙中打开8083
端口。
sudo firewall-cmd --permanent --add-port=8083/tcp
重新加载防火墙。
sudo firewall-cmd --reload
为了测试这个功能,我们将使用一个公共的、基于浏览器的MQTT客户端。在浏览器中打开mqtt-admin (校者注:这个页面已经失效了,你可以访问:https://github.com/hobbyquaker/mqtt-admin 获取项目自己搭建服务端),您将看到以下内容:
填写连接信息如下:
mqtt.example.com
。8083
。按“ Save Setting”后,mqtt-admin
将连接到你的Mosquitto服务器。在下一个屏幕中,填写Topic作为test,输入Payload的任何消息,然后按Publish。该消息将显示在mosquitto_sub
终端中。
现在,我们已经建立了一个安全的、受密码保护的MQTT服务器,并使用了腾讯云SSL证书。这将作为一个强大和安全的消息传递平台,无论你梦想什么项目。与MQTT协议很好地工作的一些流行的软件和硬件包括:
这些只是MQTT生态系统中几个流行的例子。外面有更多的硬件和软件来表达协议。如果您已经有了最喜欢的硬件平台或软件语言,那么它可能具有MQTT功能。让你们的“东西”互相交谈。腾讯云现在也推出了物联网通信(IoT Hub)服务 ,旨在提供一个安全、稳定、高效的连接平台,帮助开发者低成本、快速地实现“设备-设备”、“设备-用户应用”、“设备-云服务”之间可靠、高并发的数据通信。也就是说,腾讯物联网通信可以实现设备之间的互动、设备的数据上报和配置下发,还可以基于规则引擎和腾讯云产品打通,方便快捷的实现海量设备数据的存储、计算以及智能分析。总之,基于腾讯物联网通信,开发者可以低成本实现“设备-数据-应用-云服务”的连接,快速搭建物联网应用平台。 欢迎您试用。更多Linux教程请前往腾讯云+社区学习更多知识。
参考文献:《How To Install and Secure the Mosquitto MQTT Messaging Broker on CentOS 7》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有