OpenResty支持重写tls中的server name字段的值吗?

56 views
Skip to first unread message

纪老猴子

unread,
Dec 1, 2022, 3:50:40 AM12/1/22
to openresty
我公司最近讨论的一个技术方案中需要nginx对tls流量中server name进行修改,因为这个需求我开始接触openresty,我看了看lua-nginx-model中的接口,发现没有接口可以让nginx修改tls流量中server name的值,我觉得openresty开源版中应该没有这个功能,请问openresty企业版中有这个功能?

Attenuation

unread,
Dec 1, 2022, 5:58:01 AM12/1/22
to open...@googlegroups.com
这个好像不是常见需求啊,为什么要更改tla流量client hello的seever_name,能给出具体的场景么?

纪老猴子 <zxy2...@gmail.com>于2022年12月1日 周四16:50写道:
我公司最近讨论的一个技术方案中需要nginx对tls流量中server name进行修改,因为这个需求我开始接触openresty,我看了看lua-nginx-model中的接口,发现没有接口可以让nginx修改tls流量中server name的值,我觉得openresty开源版中应该没有这个功能,请问openresty企业版中有这个功能?

--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 openresty...@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+...@googlegroups.com
归档: http://groups.google.com/group/openresty
官网: http://openresty.org/
仓库: https://github.com/agentzh/ngx_openresty
教程: http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html
---
您收到此邮件是因为您订阅了Google网上论坛上的“openresty”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到openresty+...@googlegroups.com
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/openresty/3c3941c7-2c3d-42b0-9d42-fb5091b894c5n%40googlegroups.com
--
GPG public key: 4A6D297E6F74638E4D5F8E99152AC7B5F7608B26
Thanks,
Jun Ouyang

Junlong li

unread,
Dec 1, 2022, 7:14:47 AM12/1/22
to openresty
如果是修改 downstream 链接的tls,没有看出来这个有什么用

纪老猴子

unread,
Dec 1, 2022, 8:22:02 AM12/1/22
to open...@googlegroups.com

具体场景如下:


我们这里有一个clientserver程序,clientserver之间执行一个计算任务,它们俩之间通信使用TLS协议,clientserver程序都是商业软件,供应商不开放源码。随着业务的扩展,我们最近接到了一个大项目,这个项目中一个client会和多个server并行进行数据传输,相当于之前是clientserver之间仅仅跑一个计算任务,现在因为业务的扩张它们之间要同时跑多个计算任务了。

对于这个变化我们咨询了供应商,供应商说一个client进程和一个server进程之间可以并行跑多个任务,但是每个计算任务中server要监听不同的通信端口。得到这个消息之后我们很高兴,我们觉得这个大项目基本没有什么风险了,然后开始和甲方进行技术层面的沟通,给他们讲解原理层面的一些内容,然后他们反馈了一个严重问题。

甲方和它的合作伙伴是高信息安全型的企业,项目交付的时候clientserver程序分别运行在甲方和其合作伙伴的数据中心中,这个时候通信端口带来了一些麻烦。这两个数据中心在异地,都是自建机房安装有硬件防火墙。当client部署在甲方数据中心、server部署在甲方合作伙伴的数据中心时,如果想并行执行多个任务,那么server需要监听多个通信端口。虽然server程序可以做到,但是甲方的合作伙伴数据中心的防火墙要开多个通信端口,这点甲方的合作伙伴是不可接受的

对于这个问题我们内部进行了讨论,想到一个方案,内容如下:

0. 情景说明

0.1 client程序运行在甲方数据中心中,server程序运行在甲方合作伙伴数据中心中;

0.2 client程序与server程序之间有两个计算任务并行执行,这意味着甲方合作伙伴运行的server程序会监听两个通信端口,假设一个是10030,另外一个是10040

0.3 甲方合作伙伴数据中心只为server程序开放一个防火墙端口,假设此端口为37821

 

1. 在甲方数据中心中:

1.1 client程序和数据中心防火墙之间部署一个nginx,简称nginix1

1.2 client程序执行第一个任务时与nginx150060端口建立tls通信,执行第二个任务时与nginx150061端口建立tls通信;

1.3 nginx1将两个任务的tls流量转发至server程序,转发时将第一个任务tls流量中的server name修改成task_1,将第二个任务tls流量中的server name修改成task_2

1.4 nginx1将两个任务的tls流量server name字段修改完成之后,将流量发送至甲方合作伙伴数据中心的37912端口上;

 

2. 在甲方合作伙伴的数据中心中:

2.1 在防火墙与server程序之间部署一个nginx,监听37912端口,简称nginx2

2.2 nginx2收到tls流量之后,根据流量中server name的值确定将数据转发至server程序监听的一个端口中:将server nametask_1tls流量转发至server程序监听的10030端口;将server nametask_2tls流量转发至server监听的10040端口;

 

上述方案在不改动clientserver程序的前提下,解决了甲方技术同事提出的通信端口问题,在我们的调研过程中发现,甲方合作伙伴数据中心中运行的nginx通过server name字段将tls流量转发至其内部server程序监听的不同的通信端口是可以实现的,这是nginx的一个典型用法;但是让nginx修改tls流量中server name字段的值似乎很难实现


Junlong li <zhuizhu...@gmail.com> 于2022年12月1日周四 20:14写道:
您收到此邮件是因为您订阅了Google网上论坛上“openresty”群组中的主题。
要退订此主题,请访问https://groups.google.com/d/topic/openresty/szPI4etwLYY/unsubscribe
要退订此群组及其所有主题,请发送电子邮件到openresty+...@googlegroups.com
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/openresty/046595de-62ee-4353-892c-0ef4b8b521cen%40googlegroups.com

Junlong li

unread,
Dec 1, 2022, 9:37:58 AM12/1/22
to openresty
你的SNI的名称可以一开始就修改吗?
如果可以的话,你可以通过DNAT直接在本机就搞定了,在客户端看来还是连接到不同的端口,服务端那边根据sni再去调度就好了。

solomon

unread,
Dec 1, 2022, 12:51:16 PM12/1/22
to open...@googlegroups.com
看你的描述,并不是直接转发tls流量啊,所以不是对tls流量进行修改,何况tls流量是不能修改的,否则就变成中间人篡改消息了,握手都无法成功。

中间是反向代理的话,其实是client跟nginx1进行tls握手,nginx1再跟后面nginx2进行tls握手。因此不需要修改什么tls流量,直接设置nginx1<-->ngin2之间tls连接的server_name就可以了。
具体用法请参考nginx这两个指令的说明`proxy_ssl_server_name`,`proxy_ssl_name`.

Junlong li <zhuizhu...@gmail.com> 于2022年12月1日周四 22:38写道:
Reply all
Reply to author
Forward
0 new messages