HAProxy终结TLS双向认证代理EMQX集群

文章目录

  • 1. 背景介绍
  • 2. 系统架构
  • 3. 证书签发
    • 3.1 创建根证书
    • 3.2 创建中间证书
    • 3.3 创建设备证书
    • 3.4 创建服务端证书
  • 4. HAProxy开启双向认证
  • 5. 验证
  • 6. 总结

1. 背景介绍

  MQTT协议已经成为当前物联网领域的关键技术之一,当前市面上主流的实现MQTT协议的产品主要有 EMQX、Mosquito、NanoMQ等。本文以EMQX开源版为基础,构建 MQTT Broker 集群,并使用 HAProxy代理 MQTT Broker 集群,由 HAProxy 开启双向认证,并终结TLS,HAProxy 到 MQTT Broker 集群的流量采用非加密模式。

2. 系统架构

在这里插入图片描述
  设备端携带设备证书向NLB所在的域名发起业务请求,NLB将流量转发到 HAProxy 负载均衡服务,HAProxy校验设备证书的有效性,当校验通过后终结TLS,将流量分发到某个MQTT Broker节点。HAProxy的负载策略可采用循环负载。

3. 证书签发

  使用 cfssl 工具签发设备证书。证书信任模型为:
在这里插入图片描述

3.1 创建根证书

  • 首先创建配置文件config.json
{"signing": {"default": {"expiry": "262800h"},"profiles": {"intermediate": {"usages": ["cert sign", "crl sign"],"expiry": "700800h","ca_constraint": {"is_ca": true,"max_path_len": 1}},"device": {"usages": ["client auth","signing","digital signing","key encipherment","server auth"],"expiry": "262800h"}}}}
  • 创建根证书配置文件 root.json
{"CN": "emqx.com","key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","L": "WuHan","O": "emqx","OU": "EMQX Root CA","ST": "China"}]
}
  • 创建根CA证书
cfssl gencert -initca root.json  | cfssljson -bare CaRoot
  • 执行上边命令后将会得到根证书私钥、根证书请求文件、根证书。
    在这里插入图片描述

3.2 创建中间证书

  • 创建中间证书配置文件 intermediate.json
{"CN": "intermediate.emqx.com","key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "WuHan","L": "XS","O": "EMQX intermediate CA","OU": "EMQX intermediate CA"}]
}
  • 使用根CA签发中间证书
cfssl gencert -ca=./CaRoot.pem -ca-key=./CaRoot-key.pem -config=./config.json -profile=intermediate ./intermediate.json | cfssljson -bare CaIntermediate
  • 执行上边命令后将会生成中间证书私钥、中间证书申请文件、中间证书
    在这里插入图片描述

3.3 创建设备证书

  • 创建设备证书配置文件device-a-csr.json
{"CN": "DEVICEAXXXXXXXX","key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "WuHan","L": "XS","O": "EMQX DEVICE","OU": "EMQX DEVICE"}]
}
  • 创建设备证书
cfssl gencert -ca=./CaRoot.pem -ca-key=./CaRoot-key.pem -config=./config.json -profile=device ./device-a-csr.json | cfssljson -bare device-a
  • 执行上边命令将会得到设备证书私钥、设备证书申请文件、设备证书
    在这里插入图片描述

3.4 创建服务端证书

  • 创建服务端证书配置文件 emqx-server-csr.json
{"CN": "emqx.xxx.com","key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "Hubei","L": "Wuhan","O": "emqx","OU": "EMQX Server"}]
}
  • 使用根CA签发服务端证书
cfssl gencert -ca=./CaRoot.pem -ca-key=./CaRoot-key.pem -config=./config.json -profile=device ./emqx-server-csr.json | cfssljson -bare emqx-server
  • 执行上边命令将会得到EMQX服务端证书私钥 emqx-server-key.pem、证书申请文件 emqx-server.csr、服务端证书emqx-server.pem
  • 将服务端证书私钥与服务端证书合并到一个PEM文件,得到 server-allinone.pem 证书文件。
cat emqx-server-key.pem emqx-server.pem |tee server-allinone.pem

4. HAProxy开启双向认证

  修改/etc/haproxy/haproxy.cfg文件,开启MQTT Broker访问端口,并开启双向认证。

frontend emqx-tlsbind *:8091 ssl crt /etc/emqx/certs/server-allinone.pem ca-file /etc/haproxy/certs/CaIntermediate.pem ca-verify-file /etc/haproxy/certs/CaRoot.pem verify required# 一层证书信任模型,设备证书直接由根证书签发时,ca-file 配置根证书# bind *:8091 ssl crt /etc/emqx/certs/server-allinone.pem ca-file /etc/haproxy/certs/CaRoot.pem verify requiredmode tcplog globaloption tcplogdefault_backend emqx-backendbackend emqx-backendmode tcpoption tcplogbalance roundrobindefault-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 500000 maxqueue 10000 weight 100server emqx-165 10.0.1.165:1883 check-send-proxy send-proxy-v2 check inter 10s fall 2 rise 5server emqx-171 10.0.1.171:1883 check-send-proxy send-proxy-v2 check inter 10s fall 2 rise 5
  • ca-file 指定中间证书,用于校验设备端证书的有效性
  • ca-verify-file 指定根CA证书,用于校验中间证书的有效性,如果只有一层信任模型,这个参数通常不会使用
  • crt 指定服务端证书,此处的服务端证书包含了证书及私钥
  • verify required 表示开启双向认证,
  • check-send-proxy send-proxy-v2 用于开启 Proxy Protocol 协议,MQTT Broker 可获取到设备端的IP地址
  • maxconn 指定最大连接数,默认值2000,一定要修改这个值,否则设备连接最大数量将会被限制在2000个连接内

当 HAProxy 设置了 check-send-proxy 与 send-proxy-v2 参数后,需要 EMQX 开启 proxy-protocol 协议。开启方式时修改 /etc/emqx/emqx.conf 配置文件,在 1883 监听端口配置 proxy-protocol = true

listeners.tcp.default {bind = "0.0.0.0:1883"max_connections = 500000proxy_protocol = true
}

5. 验证

   使用 MQTT客户端工具向NLB所在的IP地址发起连接请求,请求参数携带根CA证书,设备证书,设备私钥,详细信息如下图所示:
在这里插入图片描述
  点击CONNECT按钮发起连接请求。
在这里插入图片描述
  如上图所示,客户端成功连接到MQTT Broker。

6. 总结

   HAProxy 作为一款非常优秀的四层均衡程序,在大量的生产项目中得到广泛的应用,相较于NGINX在七层负载场景中广泛应用,四层负载均衡服务在TCP服务负载业务场景上有着更好的性能优势。云商的NLB服务作为高可靠的负载均衡服务,为何不直接将NLB的流量负载分发到MQTT Broker节点,还额外的安装HAProxy负载均衡程序,主要原因是云商NLB的功能通常比较基础,无法满足企业额外的定制化需求,所以,大量的业务场景中使用云商的NLB作为第一层负载入口,定制化的业务处理交给后边的HAProxy负载均衡服务实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/110146.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【微服务】六. Nacos配置管理

6.1 Nacos实现配置管理 配置更改热更新 在nacos左侧新建配置管理 Data ID:就是配置文件名称 一般命名规则:服务名称-环境名称.yaml 配置内容填写:需要热更新需求的配置 配置文件的id:[服务名称]-[profile].[后缀名] 分组&#…

CSS:实现文字溢出显示省略号且悬浮显示tooltip完整信息

组件&#xff1a; element ui中的tooltip组件 思路&#xff1a;通过ref获取宽度进行判断&#xff0c;当子级宽度大于对应标签/父级宽度显示tooltip组件 <div class"bechmark-wrap"><ul ref"bechmarkUl"><liv-for"(item,index) in comp…

python科研作图

1、气泡图 气泡图是一种在xy轴上显示三个维度的数据的有效方式。在气泡图中&#xff0c;基本上&#xff0c;每个气泡代表一个数据点。横坐标和纵坐标的位置代表两个维度&#xff0c;气泡的大小则代表第三个维度。 在这个例子中&#xff0c;我们用numpy库生成了一些随机数据&a…

软件测试常问面试题

1、讲一下你最熟悉的模块是怎么测试的&#xff1f; 2、fiddler如何抓https请求&#xff1f; 步骤&#xff1a; 设置浏览器http代理 安装证书 导入证书&#xff0c;端口号8888 手机端获取fiddler的地址&#xff0c;配置无线局域网代理&#xff0c;安装手机证书。 3、jmeter如何参…

【C# Programming】继承、接口

一、继承 1、派生 继承在相似而又不同的概念之间建立了类层次概念。 更一般的类称为基类&#xff0c;更具体的类称为派生类。派生类继承了基类的所有性质。 定义派生类要在类标识符后面添加一个冒号&#xff0c;接着添加基类名。 public class PdaItem {public string Name {…

【Spring Boot系列】- Spring Boot侦听器Listener

【Spring Boot系列】- Spring Boot侦听器Listener 文章目录 【Spring Boot系列】- Spring Boot侦听器Listener一、概述二、监听器Listener分类2.1 监听ServletContext的事件监听器2.2 监听HttpSeesion的事件监听器2.3 监听ServletRequest的事件监听器 三、SpringMVC中的监听器3…

【Redis】3、Redis主从复制、哨兵、集群

Redis主从复制 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(Master)&#xff0c;后者称为从节点(Slave)&#xff1b;数据的复制是单向的&#xff0c;只能由主节点到从节点。 默认情况下&#xff0c;每台Redis服务器…

HeyFriday AI:智能AI写作工具

【产品介绍】​ 名称 HeyFriday AI 具体描述​ HeyFriday是一款智能AI写作工具&#xff0c;可以帮助用户快速生成博客、广告、创意故事等各种类型的文本内容&#xff0c;节省时间和金钱。​HeyFriday的团队由前谷歌NLP科学家&#xff08;ALBERT的第一作者&#xff…

本地docker注册证书docker login连接到harbor仓库、利用shell脚本将大量镜像pull、tag、push到私有harbor仓库

1. 本地docker注册证书docker login连接到harbor仓库&#xff1a; 我们使用docker login/push/pull去与Harbor打交道&#xff0c;上传下载镜像等。 但是可能会出现x509: certificate signed by unknown authority之类的错误。 [roottest01 harbor.dev]# docker login harbor.d…

[Linux入门]---搭建Linux环境

1.Linux环境的搭建方式 使用Linux操作系统的三种途径&#xff1a; 1.直接安装在物理机上&#xff0c;但是由于 Linux 桌面使用起来非常不友好&#xff0c;不推荐。 2.使用虚拟机软件&#xff0c;将 Linux 搭建在虚拟机上&#xff0c;但是由于当前的虚拟机软件(如 VMWare 之类的…

博客系统(升级(Spring))(二)获取当前用户信息、对密码进行加密、设置统一数据格式、设置未登录拦截、线程池

博客系统&#xff08;二&#xff09; 博客系统获取当前用户的信息对密码进行加密和解密的操作设置统一的数据返回格式设置未登录拦截设置线程池 博客系统 博客系统是干什么的&#xff1f; CSDN就是一个典型的博客系统。而我在这里就是通过模拟实现一个博客系统&#xff0c;这是…

CocosCreator3.8研究笔记(十九)CocosCreator UI组件(三)

前面的文章已经介绍了Layout 组件 、ScrollView 组件 、PageView 组件 。 想了解的朋友&#xff0c;请查看 CocosCreator3.8研究笔记&#xff08;十八&#xff09;CocosCreator UI组件&#xff08;二&#xff09;。 今天我们主要介绍CocosCreator 常用组件&#xff1a;Butt…