物联网项目中MQTT得到广泛的应用,许多云平台都原生支持MQTT协议。在公网上也有许多免费的MQTT broker服务器供开发使用。由于在没确定云服务是否可持续使用之前,有必要自建一套MQTT服务器,让它和各种平台的MQTT用法相兼容,这样就可以很方便桥接或是相到替代云产品和自建应用。
为了适应生产环境的需要,MQTT服务器可以开启密码校验或是通过证书来鉴权,这样可以防止自建的MQTT服务器被滥用或是攻击。一般我们可以用Mosquitto来作为MQTT服务器,不论是用docker容器的方式实现,还是直接安装,其关键还是在配置上。
1. 安装
sudo apt update sudo apt install mosquitto mosquitto-clients
2. 配置密码连接
首先创建一个用户,用下面命令在创建新用户iotdevice时,可以输入用户名和密码,请记录下来
sudo mosquitto_passwd -c /etc/mosquitto/passwd iotdevice
然后在配置文件中实现
sudo nano /etc/mosquitto/conf.d/default.conf
输入配置:
listener 1883 allow_anonymous false password_file /etc/mosquitto/passwd
这样,就实现了有基本鉴权的MQTT服务器
3. 开启服务:
sudo systemctl restart mosquitto.service
4. 开启TLS和利用证书连接
用户名和密码的连接方式保证了一定的安全性,但这还不够,更有效的是为设备和用户端分配证书,凭证书来连接和发布订阅。首先我们需要创建CA和证书,虽然可以用openssl命令行工具实现,但管理和命令操作都非常不方便,这里介绍一个证书管理工具EasyRSA,可以利用这个工具来快速搭建PKI并生成服务端和客户端的证书。
利用证书的连接配置如下:
listener 1883 localhost #listener 9001 #protocol websockets listener 8883 require_certificate true cafile /etc/mosquitto/ca_certificates/ca.crt keyfile /etc/mosquitto/certs/mqttserver.key certfile /etc/mosquitto/certs/mqttserver.crt
有关如何创建CA,服务器和设备端的证书密钥等,可参考:如何自建企业PKI并生成证书