Docker安装emqx详解(配置SSL证书、开启WSS、鉴权)

简介: Docker安装emqx详解(配置SSL证书、开启WSS、鉴权)

EMQX 是一款大规模可弹性伸缩的云原生分布式物联网 MQTT 消息服务器。

1 端口介绍

  • 1883:MQTT 协议端口
  • 8084:MQTT/SSL 端口
  • 8083:MQTT/WebSocket 端口
  • 8080:HTTP API 端口
  • 18083:Dashboard 管理控制台端口

2 拉取镜像

docker pull emqx/emqx:latest
# 也可以拉去指定版本
docker pull emqx/emqx:v4.0.0

3 启动临时容器

其他小知识

image.png

docker run -dit --name emqx -p 1883:1883 -p 8081:8081 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083 emqx/emqx:latest
# 避免跟rabbitmq的1883冲突
docker run -dit --name emqx -p 1884:1883 -p 8081:8081 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083 emqx/emqx:latest

4 拷贝配置文件

拷贝配置文件到宿主机,这样修改宿主机的配置文件之后只需要重启容器,配置文件就会生效。左边是容器的路径,右边是要映射宿主机路径。

把配置文件拷贝出来就是为了之后的ssl证书配置。便于管理。

docker cp emqx:/opt/emqx/etc /home/egn/emqx/etc
• 1

5 删除临时容器

docker rm -f emqx

6 重新启动容器

在挂载之前要记得先创建需要挂载的文件夹

挂载全路径

docker run -d \
--name emqx \
-p 1883:1883 \
-p 8883:8883 \
-p 8083:8083 \
-p 8084:8084 \
-p 8081:8081 \
-p 18083:18083 \
-v /usr/local/emqx/etc:/opt/emqx/etc \
-v /usr/local/emqx/lib:/opt/emqx/lib \
-v /usr/local/emqx/data:/opt/emqx/data \
-v /usr/local/emqx/log:/opt/emqx/log \
emqx/emqx:latest

这里只需要映射出来etc目录,用于ssl的配置

docker run -dit \
--name emqx \
-p 1883:1883 \
-p 8883:8883 \
-p 8083:8083 \
-p 8084:8084 \
-p 8081:8081 \
-p 18083:18083 \
-v /home/egn/emqx/etc:/opt/emqx/etc \
emqx/emqx:latest

7 访问测试

访问http://127.0.0.1:18083

默认密码为admin/public

如果要修改密码

//修改文件,再启动容器
vim /usr/local/emqx/etc/plugins/emqx_auth_username.conf

8 放入证书文件

通过自制证书或者去阿里云签发免费的证书下载下来,获得

bash脚本自动生成证书

#/bin/sh
rm -f ca.*
rm -f emqx.*
rm -f client.*
# 生成自签名的CA key和证书
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.pem -subj "/C=CN/ST=Jiangsu/L=Suzhou/O=XXX/CN=SelfCA"
#openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.pem
# 生成服务器端的key和证书
openssl genrsa -out emqx.key 2048
openssl req -new -key ./emqx.key -config openssl.cnf -out emqx.csr
openssl x509 -req -in ./emqx.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out emqx.pem -days 3650 -sha256 -extensions v3_req -extfile openssl.cnf
# 生成客户端key和证书
openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr -subj "/C=CN/ST=Jiangsu/L=Suzhou/O=XXX/CN=client"
openssl x509 -req -days 3650 -in client.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out client.pem

a9b6f61cd0a4416aad57db730aee7856.png

最好从阿里云或者腾讯云、华为云生成域名证书。证书下载可以下载nginx、tomcat……。这里我们下载其他类证书。

老版本配置ssl证书emqx3.0版本

listener.wss.external.keyfile = etc/certs/my/test.com.key
listener.wss.external.certfile = etc/certs/my/test.com.pem

新版本配置ssl证书

新建证书文件夹

cd /home/egn/emqx/etc/certs
mkdir my

cea0d3bf2adb45a9be9a96745a7bae3d.png

然后修改配置文件,设置证书路径

vim /home/egn/emqx/etc/emqx.conf

修改配置文件

listeners.wss.default {
  bind = "0.0.0.0:8084"
  max_connections = 512000
  websocket.mqtt_path = "/mqtt"
  ssl_options {
    keyfile = "etc/certs/my/iot.xxxx.cn.key"
    certfile = "etc/certs/my/iot.xxxx.cn.pem"
    cacertfile = "etc/certs/cacert.pem"
  }
}

重启容器

docker restart emqx

9 测试

这里要注意配置了ssl证书后,要想使用ssl连接wss就不能使用ip访问wss了,必须使用域名!!!

老版本

381b1635f2b540c38f35221c8b271f16.png

新版本

969b7d25fc5c4d7eabbe79920c4671e7.png

10 添加微信小程序支持

有的mqttjs没有输入端口号的地方,所以这里在nginx添加如下转发。通过https://域名/mqtt一样可以连接

```
    location = /mqtt {
        # 8083就是我们的emq的websocket的端口号
        proxy_pass http://域名:8083;
        proxy_redirect off;
        proxy_set_header Host 域名:8083;
        proxy_set_header Sec-WebSocket-Protocol mqtt;
        # 这个是与你的 js客户端的库有关系,本博文的不需要,为了兼顾以后小伙伴,我这里注释了下! 
        #more_clear_headers Sec-WebSocket-Protocol;
        # 这些都是 websocket必须要配置的
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        }
```

11 emqx添加http登录鉴权认证

如果我们想要自己的mq服务器不是所有人都能连接的,就需要对连接做鉴权,这里我们使用http接口对所有接入emqx的客户端进行登录鉴权。

配套的springboot接口下一章见

1. 老版本配置(emqx3.0版本)

需要打开控制控制台ip:18083

打开【插件】菜单,开启emqx_auth_http 的开关

同时需要进入配置文件目录

cd /home/egn/emqx/etc/plugins
vim emqx_auth_http.conf 

配置文件做如下修改

auth.http.auth_req.url = http://xx.xx.xx.xx:8002/emqapi/auth
auth.http.auth_req.method = post
auth.http.auth_req.headers.content_type = application/x-www-form-urlencoded
auth.http.auth_req.params = clientid=%c,username=%u,password=%P
auth.http.super_req.url = http://xx.xx.xx.xx:8002/emqapi/superuser
auth.http.super_req.method = post
auth.http.super_req.headers.content-type = application/x-www-form-urlencoded
auth.http.super_req.params = clientid=%c,username=%u
auth.http.acl_req.url = http://xx.xx.xx.xx:8002/emqapi/acl
auth.http.acl_req.headers.content-type = application/x-www-form-urlencoded
auth.http.acl_req.params = access=%A,username=%u,clientid=%c,ipaddr=%a,topic=%t,mountpoint=%m

a606062bbf464407beaf2c0f1073e78d.png

2. 新版本配置(emqx4.0+版本)

新版本如果要配置http接口鉴权登录无需这么复杂的配置

只需要在控制台页面上配置即可

打开新版本控制台,访问菜单【访问控制】》【认证】》点击创建按钮》选择Http服务》


b837291270764c52a2db89b8d624d34f.png

设置参数如下

ff9c60658adb44a5b0726db83d5f5c40.png

因为我的鉴权需要获取clientid,默认的接口入参只有username和password所以这里我们修改下入参

{
  "clientid": "${clientid}",
  "password": "${password}",
  "username": "${username}"
}

6a16f8c5c8a04489aa73396df18ea846.png

这样接口鉴权就大功告成了!

12 emqx允许订阅上下线主题

设置allow所有用户订阅$SYS/brokers/+/clients/#主题

vim etc/acl.conf

{allow, {user, "dashboard"}, subscribe, ["$SYS/#"]}.
{allow, {ipaddr, "127.0.0.1"}, pubsub, ["$SYS/#", "#"]}.
{allow, all, subscribe, ["$SYS/brokers/+/clients/#"]}.
{deny, all, subscribe, ["$SYS/#", {eq, "#"}]}.
{allow, all}.


目录
相关文章
|
5月前
|
关系型数据库 应用服务中间件 nginx
Docker一键安装中间件(RocketMq、Nginx、MySql、Minio、Jenkins、Redis)
本系列脚本提供RocketMQ、Nginx、MySQL、MinIO、Jenkins和Redis的Docker一键安装与配置方案,适用于快速部署微服务基础环境。
|
5月前
|
Kubernetes 关系型数据库 文件存储
手把手教你完成极空间 NAS Docker 镜像加速配置
本教程详细介绍了如何在极空间NAS上配置轩辕镜像加速器,以提升Docker镜像的下载速度与稳定性。内容涵盖账号注册、网络确认、加速器设置及验证方法,并提供常见问题解决方案,帮助用户高效完成容器化应用部署。
1855 1
|
3月前
|
关系型数据库 数据库 PostgreSQL
docker 安装 Postgres 17.6
本文介绍如何通过Docker安装和配置PostgreSQL 17.6。内容包括拉取镜像、导出配置文件、运行容器并挂载数据与配置文件目录,以及进入容器使用psql操作数据库的完整步骤,便于持久化管理和自定义配置。
421 4
docker 安装 Postgres 17.6
|
2月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
466 5
|
2月前
|
Java Linux 虚拟化
【Docker】(1)Docker的概述与架构,手把手带你安装Docker,云原生路上不可缺少的一门技术!
1. Docker简介 1.1 Docker是什么 为什么docker会出现? 假定您在开发一款平台项目,您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。 您正在开发的应用依赖于您当前的配置且还要依赖于某些配置文件。 您的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。 **要求:**希望尽可能多在本地模拟这些环境而不产生重新创建服务器环境的开销 问题: 要如何确保应用能够在这些环境中运行和通过质量检测? 在部署过程中不出现令人头疼的版本、配置问题 无需重新编写代码和进行故障修复
374 2
|
5月前
|
Linux Docker Windows
windows docker安装报错适用于 Linux 的 Windows 子系统必须更新到最新版本才能继续。可通过运行 “wsl.exe --update” 进行更新。
适用于 Linux 的 Windows 子系统需更新至最新版本(如 wsl.2.4.11.0.x64.msi)以解决 2025 年 Windows 更新后可能出现的兼容性问题。用户可通过运行 “wsl.exe --update” 或访问提供的链接下载升级包进行更新。
1878 0
|
Ubuntu 网络安全 数据安全/隐私保护
百度搜索:蓝易云【docker通过dockerfile安装sftp教程。】
现在,你已经通过 Dockerfile 成功安装了 SFTP,并且可以使用指定的用户名和公钥进行远程访问。请确保替换示例中的用户名、密码和公钥为自己的实际值。
338 1
|
缓存 Linux Docker
【最新版正确姿势】Docker安装教程(简单几步即可完成)
之前的老版本Docker安装教程已经发生了变化,本文分享了Docker最新版安装教程,其他操作系统版本也可以参考官 方的其他安装版本文档。
11377 3
【最新版正确姿势】Docker安装教程(简单几步即可完成)