如何部署 MQTT 服务器

MQTT是一种机器到机器的消息传递协议,旨在为“物联网”设备提供轻量级的发布/订阅通信。Mosquitto是一种流行的MQTT服务器(或MQTT中的代理),具有出色的社区支持,易于安装和配置。

在本篇教程中,我们将安装和配置Mosquitto,并使用Let的加密SSL证书来保护我们的MQTT流量。如果您还没有腾讯云的服务器,可以先点击这里进行免费套餐的试用。免费套餐包含企业版和个人版,超过11款热门产品和42款长期免费的云产品可以供您选择。如果您有长期搭建服务器的需求的话,可以点击这里进行服务器的购买,现在的促销力度很大哦。

安装软件

首先,我们将安装一个自定义软件存储库以获取最新版本的Certbot,即Let的加密客户端:

sudo add-apt-repository ppa:certbot/certbot

ENTER了接受,然后安装Mosquitto和Certbot的软件包:

sudo apt install certbot mosquitto mosquitto-clients

接下来我们将获取SSL证书。

下载SSL证书

打开防火墙中的端口80

sudo ufw allow 80

然后运行Certbot以获取证书。请务必在此处替换您服务器的域名:

sudo certbot certonly --standalone --preferred-challenges http -d mqtt.example.com

系统将提示您输入电子邮件地址并同意服务条款。执行此操作后,您应该会看到一条消息,告诉您进程是否成功以及您的证书存储在何处。

我们接下来将Mosquitto配置为使用这些证书。

配置Mosquitto

首先,我们将创建一个Mosquitto将用于验证连接的密码文件。使用mosquitto_passwd来创建这个文件,请确保使用你喜欢的用户名替换它:

sudo mosquitto_passwd -c /etc/mosquitto/passwd your-username

系统将提示您输入两次密码。

现在为Mosquitto打开一个新的配置文件:

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

这将打开一个空文件。粘贴如下:

allow_anonymous false
password_file /etc/mosquitto/passwd
​
listener 1883 localhost
​
listener 8883
certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem
cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem
​
listener 8083
protocol websockets
certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem
cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem

请务必替换您在步骤2中使用的域名为mqtt.example.com。完成后保存并关闭文件。

该文件执行以下操作:

  • 禁用匿名登录
  • 使用我们的密码文件启用密码验证
  • 仅在端口1883上为localhost设置不安全的侦听器
  • 在端口8883上设置安全侦听器
  • 在端口8083上设置基于websocket的安全侦听器

重启Mosquitto以获取配置更改:

sudo systemctl restart mosquitto

检查以确保服务再次运行:

sudo systemctl status mosquitto
● mosquitto.service - LSB: mosquitto MQTT v3.1 message broker
   Loaded: loaded (/etc/init.d/mosquitto; generated)
   Active: active (running) since Mon 2018-07-16 15:03:42 UTC; 2min 39s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 6683 ExecStop=/etc/init.d/mosquitto stop (code=exited, status=0/SUCCESS)
  Process: 6699 ExecStart=/etc/init.d/mosquitto start (code=exited, status=0/SUCCESS)
    Tasks: 1 (limit: 1152)
   CGroup: /system.slice/mosquitto.service
           └─6705 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

状态应该是active (running)。如果不是,请检查配置文件并重新启动。Mosquitto的日志文件中可能会提供更多信息:

sudo tail /var/log/mosquitto/mosquitto.log

如果一切顺利,请使用ufw允许两个新端口通过防火墙:

sudo ufw allow 8883
sudo ufw allow 8083

现在已经建立了Mosquitto,我们将在续订证书后配置Certbot以重启Mosquitto。

配置Certbot续订

Certbot会在它们到期之前自动续订我们的SSL证书,但需要告知它在重新启动之后重启Mosquitto服务。

打开域名的Certbot续订配置文件:

sudo nano /etc/letsencrypt/renewal/mqtt.example.com.conf

在最后一行添加以下renew_hook选项:

renew_hook = systemctl restart mosquitto

保存并关闭该文件,然后运行Certbot dry run以确保语法正常:

sudo certbot renew --dry-run

如果您没有看到任何错误,那么您已经完成了设置。让我们接下来测试我们的MQTT服务器。

测试Mosquitto

我们在步骤1中安装了一些命令行MQTT客户端。我们可以在localhost监听器上订阅主题测试,如下所示:

mosquitto_sub -h localhost -t test -u "your-user" -P "your-password"

我们可以用mosquitto_pub发布:

mosquitto_pub -h localhost -t test -m "hello world" -u "your-user" -P "your-password"

要使用端口8883上的安全侦听器进行订阅,请执行以下操作:

mosquitto_sub -h mqtt.example.com -t test -p 8883 --capath /etc/ssl/certs/ -u "your-username" -P "your-password"

这就是您向安全监听器发布的方式:

mosquitto_pub -h mqtt.example.com -t test -m "hello world" -p 8883 --capath /etc/ssl/certs/ -u "your-username" -P "your-password"

请注意,我们使用的是完整的主机名而不是localhost。因为我们为mqtt.example.com发布了SSL证书,如果我们尝试安全连接到localhost,我们会收到一条错误消息,指出主机名与证书主机名不匹配。

要测试websocket功能,我们将使用基于浏览器的公共MQTT客户端。在浏览器中打开Eclipse Paho javascript客户端实用程序并填写连接信息,如下所示:

  • 主机是您的Mosquitto服务器的域,mqtt.example.com
  • 端口8083
  • ClientId可以保留为默认的随机值
  • 路径可以保留为/ ws的默认值
  • 用户名是步骤3中的Mosquitto用户名
  • 密码是您在步骤3中选择的密码

其余字段可以保留其默认值。

Connect后,客户端将连接到您的服务器。您可以使用连接窗格下的订阅发布消息窗格进行发布和订阅。

结论

我们现在已经设置并测试了一个安全的,受密码保护和SSL加密的MQTT服务器。这可以作为物联网,家庭自动化或其他项目的强大而安全的消息传递平台。腾讯云 SSL证书(SSL Certificates)提供了安全套接层(SSL)证书的一站式服务,包括证书申请、管理及部署功能,与顶级的数字证书授权(CA)机构和代理商合作,为您的网站、移动应用提供 HTTPS 解决方案。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

花生壳黑吃黑之一:Web练手基地

作为我这样的新手,看网上的渗透社工教程,看的我热血沸腾,但是我怎么找那种脆弱网站练手啊,现在网站一个比一个保护强,什么弱口令,什么注入到哪里去找啊?菜鸟们是否有...

507100
来自专栏云计算教程系列

如何在Ubuntu 14.04上为SSH设置多重身份验证

一个认证因素是单件的使用信息,以证明你有权要执行的操作,如登录到系统中。的认证信道是认证系统提供了一个因子给用户或要求用户回答的方式。密码和安全令牌是身份验证因...

13300
来自专栏黑白安全

常见后门解释

现实生活中有前门后门之分,前门一般守卫严格,难以突破,然而后门计较隐蔽,部位广大人们所知道,所以守卫比较松懈基本无人问津,所以后门的安全性很弱不能跟前门相比。在...

22940
来自专栏架构师小秘圈

互联网安全威胁及应对方案

作者:蒋海滔,阿里巴巴国际事业部,高级技术专家,爱好Java/JavaScript,长期关注高性能、并发编程以及Web安全。 来自:高可用架构(ID:ArchN...

40840
来自专栏大葡萄元元

测试要走高冷路线,如何完美测试产品?

Android 开发者要测试应用发个APK安装包即可,但是对于iOS来说想要参与App的测试一直都很复杂。不过自从发现一个测试平台,帮助开发者一键上传应用生成短...

13010
来自专栏java达人

JWT VS Session

作者:Prosper Otemuyiwa 译者:java达人 来源:https://ponyfoo.com/articles/json-web-tokens-...

47560
来自专栏Python、Flask、Django

【转】python 相见恨晚的第三方类库

17320
来自专栏FreeBuf

针对近期“博全球眼球的OAuth漏洞”的分析与防范建议

据Cnet报道,新加坡南洋理工大学一位名叫Wang Jing的博士生,发现了OAuth和OpenID开源登录工具的“隐蔽重定向”漏洞(Covert Redire...

220100
来自专栏魏艾斯博客www.vpsss.net

魏艾斯博客重装 CentOS 系统和添加 Let’s Encrypt 免费 SSL 证书过程全记录

29630
来自专栏FreeBuf

绕过WiFi验证:四招教你免费使用WiFi

如今越来越多的商场、咖啡店、饭店等公共场所都提供了开放的WiFi网络。不过有时即便我们的设备连上了WiFi,当随便打开一个网页就会立即弹出身份验证页面……是不是...

75170

扫码关注云+社区

领取腾讯云代金券