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.rhkb.cn/news/124267.html

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

相关文章

Visio文件编辑查看工具Visio Viewer for Mac

Visio Viewer for Mac(Visio文件编辑查看工具)激活版带给大家!Visio Viewer for Mac是一款能够快速的打开Visio文件,包括 vsd 和 vsds 格式的文件编辑查看工具,Visio Viewer mac支持放大和缩小浏览,并可以将Visio绘图文件转换为PD…

Flink提交jar出现错误RestHandlerException: No jobs included in application.

今天打包一个flink的maven工程为jar,通过flink webUI提交,发现居然报错。 如上图所示,提示错误为: Server Response Message: org.apache.flink.runtime.rest.handler.RestHandlerException: No jobs included in application. …

使用SimPowerSystems并网光伏阵列研究(Simulink实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

09:STM32-------USART串口通信+串口数据包

目录 一:串口协议 1:通信接口 2:串口通信 3:硬件电路 4:电平标准 5:串口参数及其时序 二:USART介绍 1:简历 2:USART框图 3:USART的基本结构 4:数据帧 5: 波特率发生器 6:数据模式 三:案例 A:串口发送--单发送 1:连接图 2:函数介绍 3:代码 B:串口发送接收 1…

《CTFshow-Web入门》09. Web 81~90

Web 入门 索引web81题解 web82题解原理 web83题解 web84题解 web85题解 web86题解 web87题解原理 web88题解 web89题解 web90题解 ctf - web入门 索引 web81:include() 利用,一句话木马之 Nginx 日志利用。web82~86:include() 利用&#xff…

ES6中let和const关键字与var关键字之间的区别?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 变量作用域(Scope):⭐ 变量提升(Hoisting):⭐ 重复声明:⭐ 初始化:⭐ 全局对象属性:⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#…

【问题总结】 记 一次dockerFile构建报错

写在前面, 其实是一个比较摸不着脑袋的bug,记录一下解决的过程,作为备忘录 问题留档 1、场景描述 在尝试使用dockefile构建一个tomcat镜像,内容如下,构建正常通过,但是容器启动失败 FROM centos:7 MAINT…

设备管理系统有什么功能?它有什么用?

设备管理系统已成为现代化大规模研究所,信息化管理体系建设中最为关键的要素。随着工业设备的机械化、自动化、大型化、高速化以及复杂化等因素不断叠加,设备设施对于工业生产的作用和影响越来越大,其各项制度和流程也涉及面广、内容繁杂。  …

note_前端框架Vue的安装和简单入门(Windows 11)

1. Vue安装 (1) 下载安装node.js和npm # 下载msi安装包 https://nodejs.org/en# 点击安装包,按提示安装 # 默认安装nodejs, npm, 在线文档; PATH配置# 确认安装是否成功,在dos中输入 node -v # 验证nodejs是否安装成功 npm -v # 验证nodejs包管…

入门力扣自学笔记280 C++ (题目编号:1123)(二分查找)(多看看)

2594. 修车的最少时间 题目: 给你一个整数数组 ranks ,表示一些机械工的 能力值 。ranksi 是第 i 位机械工的能力值。能力值为 r 的机械工可以在 r * n2 分钟内修好 n 辆车。 同时给你一个整数 cars ,表示总共需要修理的汽车数目。 请你返…

TLS协议深度解析:挖掘现代网络安全防御的底层技术

正常简单的通讯 1、服务器生成一对密钥,公钥A、私钥A 2、浏览器请求服务器时,服务器把公钥A传给浏览器 3、浏览器随机生成一个对称加密的密码S,用公钥A加密后传给服务器 4、服务器接收后,用私钥A解密,得到密钥S 5、浏…

微信小程序开发---事件的绑定

目录 一、事件的概念 二、小程序中常用的事件 三、事件对象的属性列表 四、bindtap的语法格式 (1)绑定tap触摸事件 (2)编写处理函数 五、在事件处理函数中为data中的数据赋值 六、事件传参 七、bindinput的语法格式 八、…

Vue + Element UI 前端篇(十五):嵌套外部网页

Vue Element UI 实现权限管理系统 前端篇(十五):嵌套外部网页 嵌套外部网页 在有些时候,我们需要在我们的内容栏主区域显示外部网页。如查看服务端提供的SQL监控页面,接口文档页面等。 这个时候就要求我们的导航菜…

数学建模竞赛常用代码总结-PythonMatlab

数学建模过程中有许多可复用的基础代码,在此对 python 以及 MATLAB 中常用代码进行简单总结,该总结会进行实时更新。 一、文件读取 python (pandas) 文件后缀名(扩展名)并不是必须的,其作用主要一方面是提示系统是用…

matlab 矩阵逆运算的条件数

目录 一、概述1、算法概述2、主要函数3、参考文献二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述 1、算法概述 条件数法是目前应用最为广泛的一种病态诊断方法。一个方阵…

VsCode备忘

上次简单学习了一下vscode的使用,结果好长时间没用,今天打开又全忘了。。。再记录一下吧 快捷键 CtrlShiftP 命令面板,查找命令,设置等等 Ctrl 打开集成终端,监视生成输出 Ctrl, 打开设置 CtrlP 转到文件,使用转到符…

如何用Python机器学习、深度学习提升气象、海洋、水文领域实践能力!!!

Python是功能强大、免费、开源,实现面向对象的编程语言,能够在不同操作系统和平台使用,简洁的语法和解释性语言使其成为理想的脚本语言。除了标准库,还有丰富的第三方库,Python在数据处理、科学计算、数学建模、数据挖…

ChatGPT是如何辅助高效撰写论文及使用ChatGPT注意事项

ChatGPT发布近1年,各大高校对它的态度也发生了极大转变,今年3月发布ChatGPT禁令的牛剑等世界顶级名校也在近期解除了ChatGPT禁令,发布了生成式人工智能使用指南。 ChatGPT一定程度上可以解放科研人员的劳动力,与其直接禁止不如教…

第 3 章 栈和队列(汉诺塔问题递归解法)

1. 背景说明 假设有 3 个分别命名为 X、Y 和 Z 的塔座,在塔座 X 上插有 n 个直径大小各不相同、依小到大编号为 1, 2,…,n 的圆盘。 现要求将 X 轴上的 n 个圆盘移至塔座 Z 上并仍按同样顺序叠排,圆盘移动时必须遵循下列规则&…

平板触控笔哪款好用?好用的第三方apple pencil

而对于那些把ipad当做学习工具的人而言,苹果Pencil就成了必备品。但因为苹果Pencil太贵了,不少的学生们买不起。因此,最佳的选择还是平替电容笔,今天在这里整理了一些高性价比的电容笔! 一、挑选电容笔的要点&#xf…