0 前期教程

1 前言

  上一篇教程简单讲述了怎么在虚拟机CentOS中用mosquitto搭建MQTT服务器,这一篇博客主要是介绍一下mosquitto的“高级玩法”

2 配置SSL证书

  前面教程配置好了mosquitto的基本数据传输,但是这个数据传输过程是明文传递,是不安全的,因此需要进行加密,这本身也是MQTT协议所支持的。
  目前MQTT服务器传输加密主要还是使用SSL/TLS协议,这个协议比较复杂,不过可以参考这篇文章简单理解一下。
  还记得安装mosquitto需要什么组件吗?没错,有openssl,这个软件可以用来生成自签的证书,可以用于测试使用,它在大多Linux发行版中有预安装。如果是要在生产环境当中使用,就不能使用openssl了,下面简单演示一下如果使用openssl生成自签证书并被客户端连接。

  • 首先需要虚拟一个CA,并为它创建私钥
openssl genrsa -des3 -out ca.key 2048

其中,-des3代表加密算法,2048表示位数,回车运行会要求输入两次密码,运行完毕后可以在当前文件夹得到CA的私钥文件:ca.key

  • 根据CA的私钥生成CA的证书
openssl req -new -x509 -days 1826 -key ca.key -out ca.crt

其中,-days表示证书有效期,在生成过程中,需要填写很多信息,除了国家必须是两个字母外,其他的基本可以随便填写。运行完毕后可以在当前文件夹得到证书文件:ca.crt

  • 然后再给服务器生成私钥
openssl genrsa -out server.key 2048

为方便起见,服务器的私钥不加密,也就是不用输入密码

  • 拿着服务器的私钥向上面虚拟的CA机构申请证书
openssl req -new -out server.csr -key server.key

此时可以得到一个server.csr的文件,注意,这个是待签名的证书,并不能直接使用。同样,在申请过程中需要填写一些信息,和上面CA机构证书申请差不多,但要注意的是Common Name字段填写要慎重,一般是填写虚拟机的内网IP

  • 用虚拟出的CA机构证书给服务器的待签名证书签名
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 360

运行完毕后可以得到一个server.crt的证书(已签名生效)

如果想了解这些命令的用法,可以参考OpenSSL的中文网站


  以上就是配置ssl证书的全部过程了,运行完毕后可以得到这几个文件:

在这里插入图片描述

其中,主要有用的是三个文件:ca.crtserver.crtserver.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配置没有问题了。

3 配置用户名和密码

  之所以用户名和密码放在后面,是因为不建议在配置SSL时添加用户认证。

  用户名和密码是mosquitto安全机制中比较弱的一种 1 ,但它可以用来由服务器验证客户端(上面的SSL配置的是由客户端验证服务器,即SSL单向认证),当然,如果需要更加安全的数据传输,也可以增加客户端证书,用来证明客户端的身份,即SSL双向认证,这里就不再展开了,主要是介绍如何添加用户名和密码。

  配置用户名和密码主要是使用mosquitto_passwd这个命令。

在这里插入图片描述

常用的指令格式如下:mosquitto_passwd [-H sha512 | -H sha512-pbkdf2] [-c] -b <passwordfile> <username> <password>

其中passwordfile表示密码文件放置的位置。一般也放在/etc/mosquitto/下。

得到密码文件后,还需要修改一下配置文件

vi /etc/mosquitto/mosquitto.conf

# 只需要修改以下几项
allow_anonymous false #禁止匿名登录
password_file /etc/mosquitto/pwfile #设置密码的路径

  还是那个问题,修改完配置文件记得重启服务。

systemctl restart mosquitto.service

4 配置客户端id(client_id)

  前面提到,用户名和密码是一种比较弱的安全机制,其实还有一种更弱的安全机制,那就是限制客户端的id,比如限制它的前缀,这个在配置文件当中也有。

在这里插入图片描述

可以通过限制客户端id的前缀来保证客户端的身份。

5 conf文件理解

  从上面的配置来看,其实每次都是需要修改conf配置文件,可见这个配置文件的重要性。对于这种设置,我的观点是:最好知道它里面都有些啥,但不用完全记下来,用到的时候再去仔细看

  关于这个文件,我在网上没有找到什么比较好的资料,即使有完整讲解这个文件的也都是很老的资料。而mosquitto官网提供的资料实际上也就是这个文件的手册,可以在命令行用命令man /etc/mosquitto/mosquitto.conf唤出来,可以作为最权威的参考。

  不过还是找到一个讲解这个配置文件的教程,有对这个文件的结构进行分析,而且还给出了多端口监听的例子,参考价值比较高。

理解这个配置的前提是理解MQTT v3.1 v3.1.1 v5协议,所以建议多参考MQTT官网 2

6 websocket配置

  一开始我以为配置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

7 其他资料


  1. mosquitto安全机制比较完整的介绍可以参考这个链接 ↩︎

  2. 官网的这个Getting Start很有参考价值! ↩︎

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐