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

介绍Nginx的SSL/TLS加密支持功能,并学习怎么使用 在本文中,我们将介绍如何使用Nginx的SSL / TLS加密支持功能,同时使用Java编写一个简单的Web应用程序来测试SSL / TLS加密。例如,如果你的Nginx服务器的IP地址是`192.168.0.1`,则可以通过访问`https://192.168.0.1`来获取Java生成的SSL / TLS加密的内容。2. 配置Nginx的SSL / TLS支持:在Nginx的配置文件(通常是nginx.conf)中,你需要添加SSL / TLS支持的配置项。你需要将它们保存在安全的地方。 阅读详情
AI摘要

本文详细介绍了如何编译Nginx添加stream和ssl模块,进行TCP代理配置,实现TLS加密通道,包括单向和双向认证过程。

Nginx源码编译

        关于nginx的搭建配置具体参考笔者之前的一篇文章:实时流媒体服务器搭建试验(nginx+rtmp)_如何在线测试流媒体rtmp搭建成功了吗-优快云博客中的前半部分;唯一变化的是编译参数(添加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,区域大小为10MB
        ssl_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加密。

Nginx开启TLS双向认证流程及配置 是一种可选的优化方案,可以减少握手的长度。它通常用于客户端和服务器之间已经建立了信任的情况下。是客户端和服务器共同协商生成的一个用于加密通信数据的对称密钥。是临时性的,只在会话期间存在,不会存储在客户端或服务器上。的长度通常为256位,但这取决于所使用的密码套件。被泄露,攻击者可能会窃听或篡改通信数据。是否会存储在客户端或服务器上?被泄露,会有什么后果?在TLS握手过程中, 阅读详情

相关推荐

Nginx如何实现 TCP和UDP代理?

Nginx是一个高性能的HTTP和反向代理服务器,同时也支持TCP/UDP代理。在1.9.13版本后,Nginx已经支持端口转发,包括TCP和UDP协议。Nginx的TCP/UDP代理功能允许它作为一个中间人,接收来自客户端的TCP或UDP请求,并将这些请求转发到指定的后端服务器,然后将后端服务器的响应返回给客户端。通过这些配置,Nginx可以作为一个强大的TCP/UDP代理服务器,适用于多种应用场景,如数据库、邮件服务器、游戏服务器等。

m0_74824755的博客 1369

学习Nginx(十四):配置SSL/TLS支持HTTPS

学习Nginx(十四):配置SSL/TLS支持HTTPS。

Linux技术宅 1957

用nginx给TCP端口套上TLS:SSL反向代理配置全解析

TLS/SSL是保障网络传输安全的基础协议,nginx作为高性能反向代理,不仅能处理HTTP流量,其内置的stream模块还支持四层TCP/UDP转发,实现TLS终结。这种方案的核心价值在于:无需修改任何后端业务代码,就能将MySQL、Redis、自研TCP服务等明文协议整体“藏”到nginx后,统一对外暴露一个443端口,完成加密传输、证书管理和访问控制。相比改造后端服务,这能大幅降低运维成本并迅速提升安全水位。本文从四层转发原理出发,详解nginx做SSL反向代理的配置步骤,包括证书合并、SNI分流、双

weixin_31315567的博客 249

Nginx SSL/TLS 配置

SSL(Secure Sockets Layer)和 TLS(Transport Layer Security)都是加密协议,主要用于保护网络通信的安全。SSL 是最早的版本,而 TLS 是其后续版本。尽管 TLS 更为安全和高效,但由于历史原因,人们通常习惯性地称其为 SSL。SSL/TLS 协议通过对称加密和非对称加密相结合的方式,在客户端和服务器之间建立一个安全的加密通道,防止数据在传输过程中被窃取或篡改。

Flying_Fish_roe的博客 2417

Nginx配置TCP代理指南

本文介绍配置nginx 进行tcap代理的方法

笔者从事电信媒体开发多年,愿意将多年的开发经验分享给同行 1万+

Amesim基础篇-热仿真常用模型库-Thermal Hydraulic /Resistance

流体库、管路库在热管理中是必备模块,如动力电池液冷循环系统均需要Thermal Hydraulic /Resistance库的元件建模。

2201_75375391的博客 5661

NGINX技术实践:TCP四层端口代理与mTLS双向加密认证配置指南

本文系统拆解 NGINX TCP 四层端口代理与 mTLS 双向加密认证的完整落地方案,从技术原理(TLS/mTLS 核心机制)、证书生成(根 CA / 服务端 / 客户端全流程),到 NGINX 配置(Stream 模块、SSL 参数优化)、功能验证(合法 / 非法连接测试)均附实战命令,助力运维与开发人员快速搭建安全通信通道,解决传统代理架构下的数据泄露、未授权访问等风险,适用于 Redis、数据库等 TCP 服务的加密代理场景。

qq_40448670的博客 1292

单节锂电池充电管理芯片应用原理阐述及应用领域

当电池电压超过2.9V时,采用恒流模式对电池充电,充电电流由PROG 管脚和GND之间的电阻RPROG确定。充电电压固定于4.2V,而充电电流可通过一个电阻器进行外部设置当充电电流在达到最终浮充电压之后降至设定值1/10时,WD4054将自动终止充电循环。在待机模式中,WD4054 对 BAT 引脚电压进行监控,只有当 BAT 引脚电压低于再充电阈值电压4.1V时(对应电池容量80%~90%),才会开始新的充电循环,重新对电池进行充电,这就避免了对电池进行不必要的反复充电,有效延长电池的使用寿命。

weixin_41141180的博客 941

Nginx Stream 代理配置全解析:TCP/UDP 流量转发及常见问题排查

默认情况下,Nginx 并不会自动启用 stream 模块,需要在编译时添加支持(如果你使用的是主流 Linux 发行版,如 Ubuntu、CentOS,自带的 Nginx 版本通常已经包含 stream 模块)。相比 HAProxy,Nginx 配置更加灵活,并且可以结合 stream 模块进行高效的 TCP/UDP 代理。如果输出包含 --with-stream,说明 stream 模块已启用,否则需要重新编译 Nginx。# 确保启用了 least_conn。,帮助你优化流量转发,提高系统稳定性。

qq_41586848的博客 7210

基于大模型的恶性胸腔积液全周期预测与诊疗方案研究

本研究基于大模型技术构建了恶性胸腔积液全流程预测与诊疗体系,涵盖术前风险评估、术中方案优化、术后恢复预测及并发症预防。通过整合多源医疗数据,实现了手术风险概率预测(准确率80%)、并发症预警(AUC值0.85)及个性化康复方案制定,显著提升诊疗精准度。研究创新性地将Transformer架构与多模态数据融合,在100例临床验证中显示良好性能,但存在数据样本局限、模型可解释性不足等问题。未来将扩大多中心临床验证,优化算法可解释性,探索与基因检测等技术的结合应用,推动恶性胸腔积液的精准诊疗发展。

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1897

PLC期末速成——顺序功能图转梯形图

一、根据顺序功能图写出梯形图程序 顺序功能图: 梯形图: 1、程序段1,系统运行标志M0.0的启-保-停控制电路。 2、程序段2,PLC上电与逆行,初始化脉冲M1.0激活初始化步M2.0。 3、程序段3,当M2.0初始化步为活动步,并且M0.0系统运行标志位为1时,置位M2.1步,复位M2.0步。 4、当M2.1为活动步,并且I0.3中液位传感器为1时,置位M2.2步,复位M2.1步。 5、程序段5,当M2.2为活动步,并且I0.2高液位传感器为1时,置位M2.3步,复位M2.2步。 6、程序段

qq_52251819的博客 1万+

【nginx】用nginx stream 模块实现基于SNI的四层(TCP)代理服务

我们在使用Nginx的过程中,会遇到一种情况,需要使用Nginx代理网站,但是这个网站的SSL证书确无法获得,这个时候我们就需要使用TCP代理来进行处理。 局域网中只有1台服务器可以访问外部网络,其他服务器如果要访问第三放地址只能通过这台代理器的场景下,在其他服务器/etc/hosts下手动添加解析条目,将第三放地址的域名都解析到这台代理服务器的ip。

michaelwoshi的博客 1234

【从零开始入门unity游戏开发之——C#篇37】进程、线程、C# 中实现多线程有多种方案和async/await异步编程

进程、线程、C# 中实现多线程有多种方案和async/await异步编程

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1466
上一篇: SRS源码梳理之rtmp协议解析
下一篇: docker搭建redis集群
码农诗人
博客等级 码龄11年 985粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值