服务器安装MQTT服务器并启用websockets,配置SSL

背景

最近接触物联网,感觉太有意思了,打算弄个用手机控制的遥控小车,
手机与小车之前通讯采用MQTT,服务器就需要安装mosquitto,于是就有了这篇文章,期间经历了不为人知的心酸与苦楚,早上起来,到晚上6点才整成功,记录一下中间过程。

环境

linux centos7.4

1. 直接安装mosquitto

这种方式是linux直接安装安装mosqutto软件的方式,
但是我这边配置ws,wss, SSL证书的教程没有,只支持到mqtt消息订阅与发布
总结就是操作简单,很容易就安装,并投入使用。
如果需要配置ws,wss,SSl等,请直接去第二步骤。
(第二部操作会比较繁琐,功能也能强大,比如支持微信小程序需要的wss加密链接)

需要提前准备一下基础环境

cmake用来编译代码,经常用

yum install gcc-c++
yum install cmake
yum install openssl-devel

创建一个soft文件夹,用来存放下载的文件

mkdir soft

下载mosquitto源码

cd soft
wget http://mosquitto.org/files/source/mosquitto-1.4.10.tar.gz

有好多个版本,找个喜欢的数字下载吧,官网地址
服务器安装MQTT服务器并启用websockets,配置SSL_第1张图片

编译安装

tar -xzvf mosquitto-1.4.10.tar.gz
cd mosquitto-1.4.10
cmake ..
make
make install

启动mosquitto

简单配置一下

mv /etc/mosquitto/mosquitto.conf.example /etc/mosquitto/mosquitto.conf

启动程序
-d 表示挂后台,根据自己情况要不要加

mosquitto -c /etc/mosquitto/mosquitto.conf -d

默认端口是1883
查看一下这个端口是否被占用,能看到tcp,tcp6两行基本上就算成功了。

netstat -tunlp|grep 1883
tcp        0      0 0.0.0.0:1883            0.0.0.0:*               LISTEN      18987/mosquitto     
tcp6       0      0 :::1883                 :::*                    LISTEN      18987/mosquitto

再用软件MQtt.fx简单测试一下我们部署的mqtt服务;
发布一个hello 主题的 消息
服务器安装MQTT服务器并启用websockets,配置SSL_第2张图片

服务器安装MQTT服务器并启用websockets,配置SSL_第3张图片

注意

如果中间出现什么找不到libmosquitto.so.1的话,输入以下指令修改一下libmosquitto.so的位置

sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
sudo ldconfig

就这么简单?

虽然成功了,但是有个问题需要思考一下,目前为止好像还没有验证账号,随便哪个人都能用呢。
现在来配置账号
修改一下配置文件"/etc/mosquitto/mosquitto.conf",没有的话自己创建一个“touch” 指令。

#禁止匿名登录
allow_anonymous false
#存放用户的文件
password_file  /etc/mosquitto/pwfile.example
#权限文件
acl_file  /etc/mosquitto/aclfile.example

创建账号

test 账号,test123 是密码

mosquitto_passwd -b /mosquitto/config/pwfile.conf test test123

然后重新启动一下mosquitto服务。就可以了。

还没结束

先说说需求吧,在手机点开一个连接,进入控制界面,点击按钮实现 小车的前进后退等功能。
这时候需要实时交互,但是浏览器不支持mqtt 协议,只有websockets能用,这时候就到这个文章的重点了,我得给mosquitto 支持websockets!

踩坑正式开始

网上搜了一大堆文章都是说直接修改下面这个配置文件

/etc/mosquitto/mosquitto.conf

然后我就改了,加了websockets进去

#MQTT协议
port 1883
#websockets协议
# 主要是这两行
listener 8888
protocol websockets
#
#禁止匿名登录
allow_anonymous false
#存放用户的文件
password_file  /etc/mosquitto/pwfile.example
#权限文件
acl_file  /etc/mosquitto/aclfile.example

然后启动mosquitto,报错了

Error: Websockets support not available. Error found at /etc/mosquitto/mosq...

到处搜解决办法,看了几个都是说在mosquitto安装目录里面config.mk修改配置 no=>yes

# Build with websockets support on the broker.
WITH_WEBSOCKETS:=no

改成yes后,重新编译文件,运行mosquitto,还是一样的报错!就是这个问题花了一下午时间都在找解决办法,后面还不得不尝试各个版本的mosquitto,最后还是失败!
服务器安装MQTT服务器并启用websockets,配置SSL_第4张图片

没办法了,后来无意间看到docker,就想去用docker试试了。

2. Docker 安装mosquitto,并配置websockets

eclipse-mosquitto这个镜像应该是docker上面使用最多的,功能也很强大。
可以支持:
mqtt: http 非加密型
mqtt: https 加密型
ws: websockets 的http 非加密型
wss: websockets的https 加密型

平时使用的mqtt一般都是使用1883端口
如果开启websockets就是mqtt支持websocket, 例如:http://mqtt.xxx.com
如果开启websockets并配置证书密钥就是mqtt支持websockets,例如:https:mqtt.xxx.com
像微信小程序只支持https,这也是我写下这篇文章的来源了。

1. 下载镜像

docker pull eclipse-mosquitto

2. 创建一些配置文件的映射文件

每次重启,都从linux环境中的文件映射给docker容器里面程序
注意一下当前为止,pwd 指令。我用的是home目录

mkdir -p  /home/mosquitto/config
mkdir -p  /home/mosquitto/data
mkdir -p   /home/mosquitto/log

3. 分配权限

chmod -R 755   /home/mosquitto
chmod -R 777   /home/mosquitto/log 

4. 创建mqtt的配置文件

这个是我自己用的,支持http与https的

# 关闭匿名模式
allow_anonymous false
# 指定密码文件
password_file /mosquitto/config/pwfile.conf
#持久化本地存储
persistence true
persistence_location /mosquitto/data
#日志的保存文件
log_dest file /mosquitto/log/mosquitto.log

#log_type error
#log_type warning
#log_type notice
#log_type subscribe
#log_type unsubscribe

# mqtt 这个端口是mqtt默认用的,尽量别改
listener 1883
protocol mqtt

# websocket 端口根据自己需要修改
listener 8887
protocol websockets
#websockets_log_level all


# websocket ssl 端口根据自己需要修改
listener 9001 
protocol websockets
cafile /mosquitto/data/mqtt.xxx.com.ca.crt
keyfile /mosquitto/data/mqtt.xxx.com.server.key
certfile /mosquitto/data/mqtt.xxx.com.server.crt


# mqtt ssl ,端口根据自己需要修改
listener 8883
protocol mqtt
cafile /mosquitto/data/mqtt.xxx.com.ca.crt
keyfile /mosquitto/data/mqtt.xxx.com.server.key
certfile /mosquitto/data/mqtt.xxx.com.server.crt
tls_version tlsv1.2

5. 生成加密证书

不难发现上面的配置文件只要是涉及到https ssl的两个端口都要证书
生成证书指令,这边需要的是linux的openssl指令(没有的自己装一下)。
这边有个需要注意的地方是,创建两个key的时候记得用不同的地址
ca文件

1.  创建ca文件 :openssl genrsa -des3 -out ca.key 2048
2. 创建crt证书文件:openssl req -new -x509 -days 1826 -key ca.key -out ca.crt
3. 创建服务器用的key文件:openssl genrsa -out server.key 2048
4. 服务器需要的scr文件: openssl req -new -out server.csr -key server.key
5. 服务器需要的crt文件:openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 360

实际上配置mqtt ssl的时候只需要三个文件,在第四步列出来了.
其他几个文件如何使用呢?
举个例子,我的客户端,也就是windows电脑有个mqtt软件,
打开SSL/TLS那个标签,就可以选择用ca证书文件的方式访问服务器的htts端口了
服务器安装MQTT服务器并启用websockets,配置SSL_第5张图片

6. 运行容器

这里很长一条指令,主要映射mqtt端口1883,其他三个端口根据自己需要配置,配置文件,数据文件,日志文件

docker run -it --name=mosquitto --privileged  -p 1883:1883 -p 8886:8886 -p 8887:8887 -p 8888:8888-v /home/mosquitto/config/mosquitto.conf:/mosquitto/config/mosquitto.conf  -v /home/mosquitto/data:/mosquitto/data -v /home/mosquitto/log:/mosquitto/log -d  eclipse-mosquitto

这时候应该还没有用户账号,我们去添加几个

7. 添加账号

# 进入docker 容器
docker exec -it mosquitto sh
# 添加账号密码
mosquitto_passwd -b /mosquitto/config/pwfile.conf test test1233
# 创建完成后退出容器,ctrl+p 然后 ctrl+q

8. 重启就完成了

docker restart mosquitto

看看效果

服务器安装MQTT服务器并启用websockets,配置SSL_第6张图片

总结

如果用nginx代理那两个ssl的端口的话要加上https哦!
原身安装mosquitto其实很简单,但是其中开启websockets的配置,很坑,配置文件里面只有一个配置yes or no来控制,也没有其他的说明。即使把no 改成yes也不行,最后很是无奈,用上docker,太TM香了。期间查了好多网页打开过几百个链接,百度出来的结果都是一个模子出来的(拉机),后来出去找到了eclipse-mosquitto的官网,看了几篇教程,终于配置好了htts。

你可能感兴趣的:(centos,mqtt)