介绍
MQTT是一种机器到机器的消息传递协议,旨在为“物联网”设备提供轻量级的发布/订阅通信。 Mosquitto是一种流行的MQTT服务器(或MQTT中的代理 ),具有出色的社区支持,易于安装和配置。
在这个精简的快速入门教程中,我们将安装和配置Mosquitto,并使用Let的加密SSL证书来保护我们的MQTT流量。 如果您需要更深入地了解任何步骤,请查看以下教程:
先决条件
在开始本教程之前,您需要:
- 一个Ubuntu 18.04服务器,具有非root,sudo启用的用户和基本防火墙设置,详见本Ubuntu 18.04服务器设置教程
- 域名指向您的服务器。 本教程将始终使用占位符
mqtt.example.com
- 服务器上的端口80必须未使用。 如果您在具有占用此端口的Web服务器的计算机上安装Mosquitto,则需要使用其他方法来获取证书,例如Certbot的webroot模式 。
第1步 - 安装软件
首先,我们将安装一个自定义软件存储库以获取最新版本的Certbot,即Let的加密客户端:
sudo add-apt-repository ppa:certbot/certbot
按ENTER
接受,然后安装Mosquitto和Certbot的软件包:
sudo apt install certbot mosquitto mosquitto-clients
接下来我们将获取SSL证书。
第2步 - 下载SSL证书
在防火墙中打开端口80
:
sudo ufw allow 80
然后运行Certbot以获取证书。 请务必在此处替换您服务器的域名:
sudo certbot certonly --standalone --preferred-challenges http -d mqtt.example.com
系统将提示您输入电子邮件地址并同意服务条款。 执行此操作后,您应该会看到一条消息,告诉您进程是否成功以及您的证书存储在何处。
我们接下来将Mosquitto配置为使用这些证书。
第3步 - 配置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
Output● 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。
第4步 - 配置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服务器。
第5步 - 测试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
。 因为我们的SSL证书是针对mqtt.example.com
发布的, mqtt.example.com
如果我们尝试与localhost
建立安全连接,我们会收到一条错误消息,指出主机名与证书主机名不匹配。
要测试websocket功能,我们将使用基于浏览器的公共MQTT客户端。 在浏览器中打开Eclipse Paho javascript客户端实用程序并填写连接信息,如下所示:
- 主机是您的Mosquitto服务器的域,
mqtt.example.com
- 端口是
8083
- ClientId可以保留为默认的随机值
- 路径可以保留为/ ws的默认值
- 用户名是第3步中的Mosquitto用户名
- 密码是您在第3步中选择的密码
其余字段可以保留其默认值。
按Connect后 ,客户端将连接到您的服务器。 您可以使用“ 连接”窗格下的“ 订阅”和“ 发布消息”窗格进行发布和订阅。
结论
我们现在已经设置并测试了一个安全的,受密码保护和SSL加密的MQTT服务器。 这可以作为物联网,家庭自动化或其他项目的强大而安全的消息传递平台。