Nginx实现tcp代理并支持TLS加密实验

Nginx源码编译

        关于nginx的搭建配置具体参考笔者之前的一篇文章:实时流媒体服务器搭建试验(nginx+rtmp)_如何在线测试流媒体rtmp搭建成功了吗-CSDN博客中的前半部分;唯一变化的是编译参数(添加stream模块并添加其对应ssl模块):

./configure --prefix=/usr/local/nginx --with-http_stub_status_module \
--with-http_ssl_module --with-stream --with-stream_ssl_module \
--with-stream_realip_module --with-openssl=../openssl-1.0.1f --without-http_gzip_module

tcp代理配置实验

          在配置文件nginx.conf中增加stream模块的配置,具体如下:

# lijd add 2023-11-4
stream {upstream backend {server 192.168.97.50:54321;}server {listen 12345 ssl;proxy_connect_timeout 60s;proxy_timeout 60s;proxy_pass backend;}
}
# lijd add end

          说明:真是的tcp服务器为:192.168.97.50,端口:54321;nginx代理服务器地址为:192.168.97.51,端口:12345。实验结果截图如下:

        当本地客户端(192.168.80.67)连接代理服务器192.168.97.51的12345端口时,nginx的代理进程会与真实的后台服务器(192.168.97.50)的54321端口创建一个tcp连接,如下图:

        客户端与服务器之间的通信成功连接并发送数据,演示如下图:

tcp加密通道配置实验

生成CA

        首先通过系统自带的openssl生成一套自己的CA跟服务器证书、客户端证书,具体命令如下:

==============================生成CA相关内容===============================
# 为CA生成私钥
openssl genrsa -out private/ca.prikey 2048# 为CA机构生成公钥
openssl rsa -in ca.prikey -pubout -out ca.pubkey# 为CA生成自签名证书
openssl req -new -x509 -days 3650 -key private/ca.prikey -out ca.cert===========================生成服务器证书相关内容============================
# 生成服务器私钥
openssl genrsa -out server/ser.prikey 2048# 生成服务器证书申请文件
openssl req -new -key server/ser.prikey -out server/ser.csr# 生成由CA签名过的服务器证书
openssl x509 -req -days 365 -in server/ser.csr -CA ca.cert -CAkey private/ca.prikey -CAcreateserial -out server/ser.cert===========================生成客户端证书相关内容============================
# 生成客户端私钥
openssl genrsa -out client/cli.prikey 2048# 生成客户端证书申请文件
openssl req -new -key client/cli.prikey -out client/cli.csr# 生成由CA签名过的客户端证书
openssl x509 -req -days 365 -in client/cli.csr -CA ca.cert -CAkey private/ca.prikey -CAcreateserial -out client/cli.cert# 生成客户端集成证书,包括公钥和私钥,用于浏览器访问场景
openssl pkcs12 -export -in client/cli.cert -inkey client/cli.prikey -out client/certificate.p12

         生成的所有证书如下:

 TLS代理单向认证实验

        实验的环境跟上面的tcp代理配置实验相同,nginx.conf的配置文件添加SSL的一些基本配置,具体如下:

# lijd add 2023-11-4
stream {upstream backend {server 192.168.97.50:54321;}server {listen 12345;proxy_connect_timeout 60s;proxy_timeout 60s;proxy_pass backend;# 设置nginx代理与真实服务器连接是否为SSL协议加密proxy_ssl off;# 设置使用的SSL协议版本ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 SSLv2;      ssl_ciphers         AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;# 设置服务端使用的密码套件ssl_certificate      /lijd/CA/server/ser.cert;ssl_certificate_key  /lijd/CA/server/ser.prikey;ssl_session_cache   shared:SSL:10m;		# SSL TCP会话缓存设置共享内存区域名为# SSL,区域大小为10MBssl_session_timeout 10m;				# SSL TCP会话缓存超时时间为10分钟# 开启客户端认证#ssl_verify_client on;#ssl_client_certificate /lijd/CA/ca.cert;}
}
# lijd add end

        注意:proxy_ssl参数开关表示:nginx代理与后台真是的tcp服务器直接是否需要SSL加密。

        由于实验需要tcp客户端通道加密,支持tcp客户端TLS加密工具比较难找到,因此用单纯的tcp协议认证测试相对麻烦。笔者在这里想了一个办法:由于http、https协议是基于tcp协议之上的协议,利用浏览器的https的请求特性,模拟一个tcp加密客户端;此时后台的真实服务器用系统自带的IIS服务(http服务器)充当一个tcp服务端。后台的真实服务器如下:

        通过nginx代理的tcp服务去访问后台服务器浏览器页面如下:

         可以看到浏览器能通过nginx代理访问到真实的后台服务器并收到网页回复数据。通过抓两条链路的数据包分析如下:

        1、浏览器(充当tcp客户端)与nginx代理之间的加密链路抓包分析如下:

        2、nginx与后台真实服务器之间的纯tcp链路抓包分析如下:

TLS代理双向认证实验

        双向认证需要nginx代理配置开启客户端认证。nginx.conf的配置将下面两行注释放开:

ssl_verify_client on;
ssl_client_certificate /lijd/CA/ca.cert;

        重启nginx代理后,再通过浏览器访问页面就打不开了,如下图:

        双向认证服务端需要认证客户端的证书信息,此时浏览器需要导入客户端集成证书certificate.p12,导入时需要密码,导入成功后如下图:

        再次通过浏览器访问页面如下图:

        点击确认之后成功访问到页面。由于客户端与nginx直接变成双向认证,nginx与真实服务器之间连接还是纯裸的tcp连接与单向认证时的情况相同,这里就抓一下客户端与nginx之间的数据包,如下图:

结语

        至此,通过nginx代理TLS加密通道实验已经完结。本章主要讨论的是如下图结构:

        有兴趣的同学可以研究一下nginx代理与客户端、服务器双向都为TLS加密通道。此时nginx的配置中proxy_ssl参数需要设置成on(默认为on,实验时在这卡了半天),这时就需要后台TCP服务器支持TLS加密。

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

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

相关文章

无线城市WiFi解决方案【完整Word】

wx供重浩:创享日记 获取完整无水印高清Word版 文章目录 第1章 项目背景1.1“无线城市”的定义1.2 国内外“无线城市”发展概况1.3 典型案例分析1.4 建设无线城市的必要性1.5 无线城市能为政府带来的价值 第2章 项目需求分析2.1 无线城市的现状分析2.2 无线城市的总体…

Excel中功能区的存放位置很灵活,可以根据需要隐藏或显示

在这个简短的教程中,你将找到5种快速简单的方法来恢复Excel功能区,以防丢失,并学习如何隐藏功能区,为工作表腾出更多空间。 功能区是Excel中所有操作的中心点,也是大多数可用功能和命令所在的区域。你觉得功能区占用了你太多的屏幕空间吗?没问题,只需单击鼠标,它就被隐…

Wsl2 Ubuntu在不安装Docker Desktop情况下使用Docker

目录 1. 前提条件 2.安装Distrod 3. 常见问题 3.1.docker compose 问题无法使用问题 3.1. docker-compose up报错 参考文档 1. 前提条件 win10 WSL2 Ubuntu(截止202308最新版本是20.04.xx) 有不少的博客都是建议直接安装docker desktop,这样无论在windows…

秋招进入尾声了,还有哪些公司和岗位可以投递?

24届秋招基本已经进入尾声了,接下来就是秋招补录了,最近在微信群看到一些同学再问哪些公司还在招人的。 在这里跟大家分享一份2024届秋招信息汇总表,目前已更新2000家,不仅有互联网公司,还有外企、国企、各类研究所&am…

EM@解三角形@正弦定理@余弦定理

文章目录 abstract解三角形基本原理不唯一性 正弦定理直角三角形中的情形推广锐角三角形钝角情形 小结:正弦定理 余弦定理直角三角形中的情形非直角情形小结:余弦定理公式的角余弦形式 abstract 解直角三角形问题正弦定理和余弦定理的推导 对于非直角情形,都是直角情形的推广同…

页表和cache

页表基本原理 页表主要用来将虚拟地址映射到物理地址,在使用虚拟地址访问内存时,微处理器首先将虚拟地址拆分成页号和页内偏移量,然后使用页号在页表中查找对应的物理页框号,将物理页地址加上页内偏移量,得到最终的物…

Three.js 实现简单的PCD加载器(可从本地读取pcd文件)【附完整代码】

1 功能实现 初始会显示我们之前 SfM 做出的点云,包括相机位置可以点击右上角加载你本地的PCD文件可以通过选择多个文件加载多个点云并显示在同一场景中可以通过左上角的控制界面查看/调整点云的属性,如点大小、颜色等可以通过右上角的控制界面选择旋转 …

【考研数据结构代码题3】用栈实现十进制数转为八进制数

题目:将十进制数m1348转换成八进制数 难度:★ 算法思路:十进制转八进制的核心原理是“用辗转相除法不断对8取余,最后将余数反向输出”,即先求出来的余数后输出,符合“先进后出”的栈的特性,故设…

AI:71-基于深度学习的植物叶片识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

dRep-基因组质控、去冗余及物种界定

文章目录 Install依赖关系 常用命令常见问题pplacer线程超过30报错当比较基因组很多(>4096)有了Bdv.csv文件后无需输入基因组list 超多基因组为什么需要界定种?dRep重要概念次级ANI的选择Minimum alignment coverage3. 选择有代表性的基因…

linux 操作系统

先讲一下叭,自己学这的原因,是因为我在做项目的时候使用到啦Redis,其实在windows系统上我其实也装啦Redis上,但是我觉得后期在做其他的项目的时候可能也会用到这个然后就想着要不先学学redis,然后在后面也不至于什么都…

解决 matplotlib 中文字体无法显示问题

问题表现 使用 matplotlib 呈现出图片中文为方框□,表现如下所示 查找了以下解法: from matplotlib.font_manager import FontProperties # 指定字体路径 font_properties FontProperties(fname"./SimHei.ttf") plt.rcParams[font.family]…

【Docker安装RockeMQ:基于Windows宿主机,并重点解决docker rocketMQ安装情况下控制台无法访问的问题】

拉取镜像 docker pull rocketmqinc/rocketmq创建网络 docker network create rocketmq-net构建namesrv容器 docker run -d -p 9876:9876 -v D:/dockerFile/rocketmq/namesrv/logs:/root/logs -v D:/dockerFile/rocketmq/namesrv/store:/root/store --network rocketmq-net -…

计算机网络学习笔记(五):运输层(待更新)

目录 5.1 概述 5.1.1 TCP协议的应用场景 5.1.2 UDP协议的应用场景 5.2 三大关系 5.2.1 传输层协议和应用层协议之间的关系 5.3 用户数据报协议UDP(User Datagram Protocol) 5.3.1 UDP的特点 5.3.2 UDP的首部 5.4 传输控制协议TCP(Transmission Control Protocol) 5.…

obs whip 100ms端到端时延 webrtc验证

obs----whip---->媒体服务-----whep-----→chrome播放器(webrtc demo) 所有软件在同一台机器 1)h264251080p 平均时延:162.8ms 采样点ms:167151168169151168166168167153 2)h264301080p 平均时延&…

Matplotlib数据可视化综合应用Matplotlib图形配置在线闯关_头歌实践教学平台

Matplotlib数据可视化综合应用图形配置 第1关 配置颜色条第2关 设置注释第3关 自定义坐标刻度第4关 配置文件与样式表 第1关 配置颜色条 任务描述 本关任务:使用colorbar绘制一个热成像图。 编程要求 在右侧编辑器Begin-End处补充代码,根据输入数据绘制…

P1529 [USACO2.4] 回家 Bessie Come Home 题解

文章目录 题目描述输入格式输出格式样例样例输入样例输出 提示完整代码 题目描述 现在是晚餐时间,而母牛们在外面分散的牧场中。 Farmer John 按响了电铃,所以她们开始向谷仓走去。 你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数…

【数据结构】单链表之--无头单向非循环链表

前言:前面我们学习了动态顺序表并且模拟了它的实现,今天我们来进一步学习,来学习单链表!一起加油各位,后面的路只会越来越难走需要我们一步一个脚印! 💖 博主CSDN主页:卫卫卫的个人主页 &#x…

ubuntu 16.04.5 安装 vivado 2019.1 完整编译AD9361的环境

一、前期安装 1、安装ncurses库(已经包含了,其他的os需要安装) sudo apt install libncurses5二、安装 sudo ./xsetup使用lic进行激活。 三、安装后 输入指令 sudo gedit ~/.bashrc 末尾添加 source /opt/Xilinx/Vivado/2019.1/setti…

无人机航拍技术基础入门,无人机拍摄的方法与技巧

一、教程描述 买了无人机,可是我不敢飞怎么办?禁飞区越来越多,到底哪儿才能飞?我的无人机跟你一样,为什么我拍不出大片?厂家的说明书看不进去,有没有一套无人机的课程,可以快速上手…