emqx emqtt部署安装

Emqx 消息中间件的安装部署(银河麒麟arm64) EMQ X 基于 Erlang/OTP 平台开发的 MQTT 消息服务器,是开源社区中最流行的 MQTT 消息服务器是 开源社区中第一个 支持 5.0 协议规范的消息服务器,并且完全兼容 MQTT V3.1 和 V3.1.1 协议。单机支持百万连接,集群支持千万级连接;毫秒级消息转发。共享订阅:共享订阅支持通过负载均衡的方式在多个订阅者之间来分发 MQTT 消息。比如针对物联网等数据采集场景,会有比较多的设备在发送数据,通过共享订阅的方式可以在订阅端设置多个订阅者来实现这几个订阅者之间的工作负载均衡

1.搭建emqx依赖的环境
yum -y install libatomic libatomic_ops-devel
2.安装emqx消息中间件
wget https://www.emqx.com/zh/downloads/broker/5.0.11/emqx-5.0.11-el8-arm64.rpm
rpm -i emqx-5.0.11-el8-arm64.rpm
3.启动emqx   emqx start
关闭emqx   emqx stop
4.登录emqx后台服务器访问http://ip+18083
(比如http://192.168.20.229:18083/)
emqx的后台初始账号密码为admin/public
如果出现访问不了的情况 systemctl stop firewalld 暂时关闭防火墙或者开放18083端口,
后续还要通过ssl访问所以这里我直接暂时关闭防火墙
第一次访问会提示修改密码,记住自己修改的密码即可
5.连接(https://mqttx.app/zh)
  官网下载MQTTX的客户端工具包Linux Windows版的都可以用
  Mqttx新建链接修改ip(部署emqx的ip)和端口(1883)点击链接
  当前是匿名访问的,所以不需要账号密码,在当前链接可以订阅一个主题,往这个主题
  发送数据,在订阅了这条主题的所有链接都可以收到这条数据
6.设置不能匿名访问
  登录emqx后台服务器之后,左侧选择第四项,访问控制-认证,右上角创建密码,默认第一个,
  选择默认直到创建完成。在选择左边栏的认证,第一条上面有个用户管理,选择之后添加用户,
  输入自定义访问的账号密码,至此emqx用户名访问设置完成,在mqttx上输入设定的用户名密码访问
7.单项ssl访问 ssl的默认端口是8883
SSL/TLS是一种密码通信框架,他是世界上使用最广泛的密码通信方法。
SSL/TLS	综合运用了密码学中的对称密码,消息认证码,公钥密码,数字签名,
伪随机数生	成器等,可以说是密码学中的集大成者
生成CA证书需要一个私钥为它签名在emqx服务端创建一个文件夹ssl
mkdir  ssl && cd ssl
openssl genrsa -out ca.key 2048    
 生成一个密钥长度为 2048 的密钥并保存在 ca.key 中。有了这个密钥,就可以用它生成emqx的根证书了:
 openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.pem
所有的设定直接回车即可
查看ca证书
 openssl x509 -in ca.pem -noout -text
根证书是整个信任链的起点,如果一个证书的每一级签发者向上一直到根证书都是可信的,
那个我们就可以认为这个证书也是可信的。有了这个根证书,我们就可以用它来给其他实体签发实体证书了,
  实体(在这里指的是 EMQX)也需要一个自己的私钥对来保证它对自己证书的控制权。
 openssl genrsa -out emqx.key 2048
 vi openssl.cnf   新建 openssl.cnf 文件
[req]
default_bits  = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
countryName = CN
stateOrProvinceName = Zhejiang
localityName = Hangzhou
organizationName = EMQX
commonName = Server certificate
[req_ext]
subjectAltName = @alt_names
[v3_req]
subjectAltName = @alt_names
[alt_names]
IP.1 = BROKER_ADDRESS  #修改为自己实际的ip
DNS.1 = BROKER_ADDRESS

:wq

 然后以这个密钥和配置签发一个证书请求:
openssl req -new -key ./emqx.key -config openssl.cnf -out emqx.csr
然后以根证书来签发 EMQX 的实体证书:
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
查看证书
openssl x509 -in emqx.pem -noout -text
验证证书是否正确
openssl verify -CAfile ca.pem emqx.pem
返回ok字样表示成功
用openssl测试链接
openssl s_server -accept 2009 -key emqx.key -cert emqx.pem
新开一个终端
cd到同级目录下
openssl s_client -connect ip(本机ip):2009 -CAfile ca.pem -showcerts
链接成功之后,可相互发送数据 至此验证完成
登录服务器的控制网页端功能配置监听器
选择ssl监听类型的设置SSL参数配置打开验证服务器证书
TLS Cert
路径选择 刚刚生成ssl路径下的ca.pem文件
TLS Key
路径选择 刚刚生成ssl路径下的ca.Key文件
CA Cert
路径选择 刚刚生成ssl路径下的emqx.pem 文件
更新保存
打开mqttx 新建一条链接 ip地址端口用户名密码输入之前设定的 打开SSL/TLS
开关,关闭ssl安全,点击链接中间件,至此ssl单项认证完成
8.ssl双向认证
登录服务器的控制网页端左侧功能配置监听器
选择ssl监听类型的设置SSL参数配置打开验证服务器证书
TLS Cert
路径选择  /etc/emqx/certs/cert.pem
TLS Key
路径选择  /etc/emqx/certs/key.pem
CA Cert
路径选择 /etc/emqx/certs/cacert.pem
Verify  选择verify_peer

 更新保存
打开mqttx 新建一条链接 ip地址端口用户名密码输入之前设定的 打开SSL/TLS
开关,选择Self signed选项
文件选择 ca文件是/etc/emqx/certs/cacert.pem
         客户端证书是 /etc/emqx/certs/client-cert.pem
         客户端key文件是 /etc/emqx/certs/client-key.pem
链接成功
至此双向链接完成
9.emqx集群
    emqx stop 先关闭emqx
    修改配置文件 node 结构下的name 字段调整为emqx@本机的ip 如emqx@192.168.20.229
    按照之前的部署再一个emqx的服务端
    修改name 字段 emqx@192.168.20.xxx
    至此有两台emqx服务器
    启动这两台服务器 
    在第2台服务器执行 emqx_ctl cluster join emqx@192.168.20.229
emqx@192.168.20.229 为之前name字段的名称
Ok集群创建完成
组成集群后, 它的本地数据将被清除,来自节点s1.emqx.io的数据 会同步过来
例如如果一个s3.emqx.io要加入s1和s2的集群, join 命令应该在 s3 上执行,
但 NOT 在 s1 或 s2 上执行
注连成集群之后会将所有数据清空,用户密码会恢复到默认admin/public
登录到,网页后台就可以看到两个节点正在运行
LB(HAProxy)部署Emqx集群
   LB是指负载均衡,通俗的来讲就是利用负载均衡来管理我们的emqx集群
   LB负责分发设备的 MQTT 连接与消息到 EMQX 集群,LB 提高 EMQX群可用性、实现负载平衡以及动态扩容
   部署架构推荐在 LB 终结 SSL 连接。设备与 LB 之间 TLS 安全连接,LB 与 EMQX 之间普通 TCP 连接。
   这种部署模式下 EMQX 单集群可轻松支持 100 万设备。

就是说我们在vpc(私有网络下部署emqx集群),通过负载均衡管理emqx集群,ssl终结在LB
   LB作为一个转发对外的接口,并终结ssl在LB

HAProxy 作为 LB 部署 EMQX 集群,并终结 SSL 连接

根据上面的步骤搭建好emqx集群之后
新开一台机器部署haproxy(如果是同一台机器端口需要用不同的端口)
开始搭建haproxy
 yum -y install pcre-devel zlib-devel gcc gcc-c++ make
    下载地址:https://src.fedoraproject.org/repo/pkgs/haproxy/
     cd haproxy-2.7.0/
make TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_CRYPT_H=1 USE_LIBCRYPT=1
 cp haproxy /usr/sbin/
 haproxy  -v  //查看当前版本
 mkdir  /etc/haproxy/

编写配置 sudo vi /etc/haproxy/haproxy.cfg 文件,注替换为emqx主机的地址

listen mqtt-ssl
  bind *:8883 ssl crt /etc/ssl/emqx/emq.pem no-sslv3
  #bind 0.0.0.0:1884  #不使用ssl可用这个配置同一台机器端口要改
  mode tcp
  maxconn 50000
  timeout client 600s
  default_backend emqx_cluster

backend emqx_cluster
  mode tcp
  balance source
  timeout server 50s
  timeout check 5000
  server emqx1 192.168.20.228:1883 check inter 10000 fall 2 rise 5 weight 1  
  server emqx2 192.168.20.229:1883 check inter 10000 fall 2 rise 5 weight 1
查如果是同一台机器需要改emqx的配置文件,解压出来的二级制包的etc/emqx.conf文件,端口不能用一样的,会被端口占用
查看集群状态 ./bin/emqx_ctl cluster status

说明:此处vpc中包含emqx的两台服务器走的端口是1883没有加密的,而haproxy的对外端口是8883是要加密的.

生成haproxy的证书文件(此处用emqx的双向认证证书,haproxy同理):

新建haproxy服务器的ssl目录
生成CA根证书(email可以不填,其他随便填,不要为空,可能出问题,随意填)
 openssl req -x509 -new -days 3650 -keyout ca.key -out rootCA.crt -nodes
 
可能提示错误,找不到文件,我们添加一个即可:cd /home/bsxing/ & openssl rand -writerand .rnd
接下来利用生成的根证书生成服务端证书。

生成server端证书
生成私有秘钥 openssl genrsa -out server.key 2048
生成证书请求csr文件(注意和根证书信息一致同样信息输入,后面提示密码可以不输入) 
openssl req -new -key server.key -out server.csr
mkdir demoCA & mkdir demoCA/newcerts & touch demoCA/index.txt & touch demoCA/serial & echo 01 >> demoCA/serial   
解决server证书所需文件
生成证书(使用前面生成的根证书和key) 
openssl ca -in server.csr -out server.crt -cert rootCA.crt -keyfile ca.key -days 3650
cat server.crt server.key > emqx.pem 生成haproxy所需的证书文件
cp  emqx.pem  /etc/ssl/   拷贝到haproxy配置文件所指定的目录

haproxy  -f  /etc/haproxy/haproxy.cfg  &  启动haproxy负载均衡来管理emqx

打开mqttx客户端访问haproxy所在服务器的ip 8883端口打开ssl选项输入之前设定的用户名密码,进行链接,
打开emqx网页端,可以看到有一条链接连着 1883端口,至此haproxy部署完成

Jdk生成证书文件可替换上面ssl生成的.pem文件

生成server端证书库
keytool -genkey -alias ynhr -keyalg RSA -keysize 1024 -keypass 123456 -validity 36500 -keystore test.keystore -storepass 123456
导出证书库中p12文件
keytool -importkeystore -srcstoretype JKS -srckeystore test.keystore -srcstorepass 123456 -srcalias ynhr -srckeypass 123456 -deststoretype PKCS12 -destkeystore test.p12 -deststorepass 123456 -destalias client -destkeypass 123456 -noprompt

从p12中导出.key私钥文件
openssl pkcs12 -in test.p12 -nocerts -nodes -out test.key

从证书库中导出.cer公钥证书文件
keytool -export -alias ynhr -keystore test.keystore -rfc -file test.cer
有时候需要.crt格式的文件,调整下格式即可
keytool -export -alias ynhr -keystore test.keystore -rfc -file test.crt

生成haproxy所需的证书.pem文件
cat test.crt test.key > /etc/ssl/emqx.pem

启动haproxy负载均衡
haproxy -f /etc/haproxy/haproxy.cfg

启动mqttx 链接haproxy 服务器ip的8883端口,启用加密ssl选项,链接
去掉ssl安全,单项认证完成

haproxy 代理tcp双向认证emqx

注意双向认证每台客户机都需要一个客户端的证书
需要重复以上第7点单项认证的步骤 进入解压目录执行
./bin/emqx stop
cd test/etc && mkdir ssl && cd ssl
11.1 openssl genrsa -out ca.key 2048
11.2 openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.pem
11.3 openssl genrsa -out emqx.key 2048
11.4 vi openssl.cnf
[req]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
countryName = CN
stateOrProvinceName = Zhejiang
localityName = Hangzhou
organizationName = EMQX
commonName = CA
[req_ext]
subjectAltName = @alt_names
[v3_req]
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.20.229
DNS.1 = BROKER_ADDRESS
11.5 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
11.7 创建客户端密钥
openssl genrsa -out client.key 2048
11.8使用生成的客户端密钥来创建一个客户端请求文件
openssl req -new -key client.key -out client.csr -subj “/C=CN/ST=Zhejiang/L=Hangzhou/O=EMQX/CN=client”
11.9最后使用先前生成好的服务端 CA 证书来给客户端签名,生成一个客户端证书:openssl x509 -req -days 3650 -in client.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out client.pem
11.10修改文件 vi test/etc/emqx.conf (更加建议网页端修改配置,单项认证的时候用的方式)

listeners.ssl.default {
  bind = "0.0.0.0:8883"
  max_connections = 512000
  ssl_options {
    keyfile = "etc/ssl/emqx.key"
    certfile = "etc/ssl/emqx.pem"
    cacertfile = "etc/ssl/ca.pem"
    verify = verify_peer
  }
}

每台emqx都要改
在启动所有的emqx,并集群到一起

修改sudo vi /etc/haproxy/haproxy.cfg
listen mqtt-ssl
  #bind *:8883 ssl crt /etc/ssl/emqx/emq.pem no-sslv3
  bind 0.0.0.0:8888  #不使用ssl可用这个配置同一台机器端口要改
  mode tcp
  maxconn 50000
  timeout client 600s
  default_backend emqx_cluster

backend emqx_cluster
  mode tcp
  balance source
  timeout server 50s
  timeout check 5000
  server emqx1 192.168.20.228:8883 check inter 10000 fall 2 rise 5 weight 1  
  server emqx2 192.168.20.229:8883 check inter 10000 fall 2 rise 5 weight 1
haproxy  -f  /etc/haproxy/haproxy.cfg  &  启动haproxy负载均衡来管理emqx
将ssl文件夹复制到mqttx所在的设备

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值