上一篇教程简单讲述了怎么在虚拟机CentOS中用mosquitto搭建MQTT服务器,这一篇博客主要是介绍一下mosquitto的“高级玩法”
前面教程配置好了mosquitto的基本数据传输,但是这个数据传输过程是明文传递,是不安全的,因此需要进行加密,这本身也是MQTT协议所支持的。
目前MQTT服务器传输加密主要还是使用SSL/TLS协议,这个协议比较复杂,不过可以参考这篇文章简单理解一下。
还记得安装mosquitto需要什么组件吗?没错,有openssl,这个软件可以用来生成自签的证书,可以用于测试使用,它在大多Linux发行版中有预安装。如果是要在生产环境当中使用,就不能使用openssl了,下面简单演示一下如果使用openssl生成自签证书并被客户端连接。
openssl genrsa -des3 -out ca.key 2048
其中,-des3
代表加密算法,2048表示位数,回车运行会要求输入两次密码,运行完毕后可以在当前文件夹得到CA的私钥文件:ca.key
openssl req -new -x509 -days 1826 -key ca.key -out ca.crt
其中,-days
表示证书有效期,在生成过程中,需要填写很多信息,除了国家必须是两个字母外,其他的基本可以随便填写。运行完毕后可以在当前文件夹得到证书文件:ca.crt
。
openssl genrsa -out server.key 2048
为方便起见,服务器的私钥不加密,也就是不用输入密码
openssl req -new -out server.csr -key server.key
此时可以得到一个server.csr
的文件,注意,这个是待签名的证书,并不能直接使用。同样,在申请过程中需要填写一些信息,和上面CA机构证书申请差不多,但要注意的是Common Name
字段填写要慎重,一般是填写虚拟机的内网IP
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 360
运行完毕后可以得到一个server.crt
的证书(已签名生效)
如果想了解这些命令的用法,可以参考OpenSSL的中文网站
以上就是配置ssl证书的全部过程了,运行完毕后可以得到这几个文件:
其中,主要有用的是三个文件:ca.crt
,server.crt
,server.key
,建议将这三个文件移到/etc/mosquitto/Cert
文件夹下,最后一级文件夹没有就新建一个,名字自定。
建立好证书后,接下来就是改配置文件了
vi /etc/mosquitto/mosquitto.conf
#主要是修改以下几项,其他的不要改动
cafile /etc/mosquitto/Cert/ca.crt
certfile /etc/mosquitto/Cert/server.crt
keyfile /etc/mosquitto/Cert/server.key
listener 8883 #带有ssl证书验证的mqtt服务器传输端口默认为8883
如果不愿意一行一行翻,可以利用/
的检索功能。
需要注意:设置端口之后一定要确定一下防火墙有没有开放此端口,没有的话一定要记得开放!!!具体操作步骤见上一篇教程
修改配置文件后,如果此时mosquitto在运行,需要重启服务使配置文件生效。
参考链接
配置好服务端,再来看看客户端怎么配置。还是用之前的MQTTX软件。需要将配置好的CA证书ca.crt
放到宿主机上(不需要服务器的证书和私钥)
如果能连接成功,就代表服务器的SSL配置没有问题了。
之所以用户名和密码放在后面,是因为不建议在配置SSL时添加用户认证。
用户名和密码是mosquitto安全机制中比较弱的一种 1 ,但它可以用来由服务器验证客户端(上面的SSL配置的是由客户端验证服务器,即SSL单向认证),当然,如果需要更加安全的数据传输,也可以增加客户端证书,用来证明客户端的身份,即SSL双向认证,这里就不再展开了,主要是介绍如何添加用户名和密码。
配置用户名和密码主要是使用mosquitto_passwd
这个命令。
常用的指令格式如下:mosquitto_passwd [-H sha512 | -H sha512-pbkdf2] [-c] -b
其中passwordfile
表示密码文件放置的位置。一般也放在/etc/mosquitto/
下。
得到密码文件后,还需要修改一下配置文件
vi /etc/mosquitto/mosquitto.conf
# 只需要修改以下几项
allow_anonymous false #禁止匿名登录
password_file /etc/mosquitto/pwfile #设置密码的路径
还是那个问题,修改完配置文件记得重启服务。
systemctl restart mosquitto.service
前面提到,用户名和密码是一种比较弱的安全机制,其实还有一种更弱的安全机制,那就是限制客户端的id,比如限制它的前缀,这个在配置文件当中也有。
可以通过限制客户端id的前缀来保证客户端的身份。
从上面的配置来看,其实每次都是需要修改conf配置文件,可见这个配置文件的重要性。对于这种设置,我的观点是:最好知道它里面都有些啥,但不用完全记下来,用到的时候再去仔细看。
关于这个文件,我在网上没有找到什么比较好的资料,即使有完整讲解这个文件的也都是很老的资料。而mosquitto官网提供的资料实际上也就是这个文件的手册,可以在命令行用命令man /etc/mosquitto/mosquitto.conf
唤出来,可以作为最权威的参考。
不过还是找到一个讲解这个配置文件的教程,有对这个文件的结构进行分析,而且还给出了多端口监听的例子,参考价值比较高。
理解这个配置的前提是理解MQTT v3.1 v3.1.1 v5协议,所以建议多参考MQTT官网 2
一开始我以为配置websocket只需要在conf文件当中将协议设置为websocket即可,但是每次一设置协议,mosquitto服务就会failed,后来参考这篇博客才知道原来在编译的时候就需要设置。
对于新版2.0.x来说,在编译阶段,需要先修改config.mk
文件,将WITH_WEBSOCKETS
变量改为yes,如下图所示。
修改完之后,先别急着编译,还需要下载安装一个组件——libwebsockets
:
yum install libwebsockets-devel.x86_64
如果显示找不到这个软件,那就需要先安装epel软件源:
yum install epel-release.noarch
然后再运行上面的代码。
安装好组件后,接下来就可以正常编译安装了:
make
make install
值得一提的是,如果一开始没有加上websocket模块,那么可以通过这种方式覆盖安装,不影响原来的配置文件。
安装好之后,就可以通过修改配置文件实现多端口连接了,具体操作建议参考上面的链接。核心:一个listener对应一个protocol。
mosquitto安全机制比较完整的介绍可以参考这个链接 ↩︎
官网的这个Getting Start很有参考价值! ↩︎