使用nginx作为HTTPS正向代理服务器(七层透传代理、中间人代理)

2023-11-03

【前言】

在讲解nginx正向代理https之前,我们先来解答几个小疑问。

1、nginx是什么?

       Java同学肯定知道apache服务器,一个很牛,但是也很庞大的web服务器。能当web服务器的不仅仅只有apache,还有一个小巧轻快,高性能的家伙,它就是nginx。

       百度百科的解释是:nginx是一个高性能的http和反向代理服务器,同时也提供了imap/pop3/smtp服务。其特点是占有内存少,并发能力强。在咱们大中华大陆地区,百度、京东、新浪、网易、腾讯、淘宝都用了nginx,可见它有多受大家的欢迎。

       大家都知道它是一个反向代理服务器,其实它也可以作为一个正向代理服务器。虽然nginx官方并没有提供http connect方法,但是nginx扩展性特别好,有大佬造出了ngx_http_proxy_connect_module模块(点击可以去到对应的github)来支持http connet方法,如此一来,它就可以正向代理http以及https了。本文着只讲nginx正向代理https,其余的等有时间再更新吧。

 

2、什么是nginx正反向代理?

正向代理:客户发送请求给代理服务器,代理服务器代替客户把请求发送给服务器,即正向代理是代理的客户端。

反向代理:代理服务器将收集到的请求分发给服务器,服务器处理完请求将结果返回给代理服务器,再由代理服务器将结果返回给客户端,即反向代理是代理的服务端。

详细讲解nginx正反向代理可以看这里:看了这篇你就彻底了解nginx的正方向代理啦~

3、https是什么?

       https其实就是http+tls/ssl的简称,tls从某种意义来说就是ssl3.1版本,ssl是在应用层和传输层中间加的一个套接层,即加密在传输层和应用层之间传输的数据。详情请点击这里:看完这篇你就了解HTTPS、TLS、SSL啦~

4、https建立连接过程是怎样的?

       客户端发起https连接--->服务端发送证书-->客户端验证服务端发来的证书(验证证书-->生成随机数-->生成握手信息hash值)-->服务端接收随机数加密的信息-->服务端验证握手信息是否被篡改-->客户端验证服务端发送回来的握手信息,完成握手

详细连接过程可以看这里:HTTPS建立连接详细过程

5、为什么需要https代理?

       了解完https连接过程后会你可能有一个疑问,我客户端为什么需要一个nginx的代理服务器去正向代理https呢?我输入了域名后,直接去DNS服务器获取服务端IP,然后直接连接它的443端口不就行了吗?对,你说的都对,但是,问题就出在直接连接它的443端口”,如果我不能直接连接它的443端口呢?甚至,我如果连Ping都Ping不通服务端呢?那怎么办?这时候,你就需要一台能够代替你,去连接服务端的服务器了。

       这个代理服务器,目前常见的有用apache搭建的代理服务器、用nginx搭建的代理服务器。今天这篇文章我只讲nginx代理服务器,这俩货到底有什么区别,谁更合适什么场景,之后有时间再进行详细讲解吧。

【正文】

HTTPS/HTTP的正向代理从客户端是否有感知可以分为以下两种:

普通代理客户端在浏览器自己配置代理的端口和地址。

透明代理客户端无需做代理设置,于客户而已是无感的,企业中的web网关设备就是如此。

 

HTTPS/HTTP的正向代理从代理服务器是否需要解密HTTPS可以分为以下两种:

隧道代理(透传)只在TCP协议之上进行透传HTTPS流量,并不对流量进行解密分析,客户端相当于直接和目的服务器进行TLS/SSL交互。

中间人代理:看到中间人我瞬间联想到了中间人攻击,这个原理也可以说类似吧,代理服务器将客户端发来的HTTPS流量进行解密,对客户端利用自签名证书完成TLS/SSL握手,这个时候代理服务器拿到了客户端访问服务端的HTTPS流量内容,再和服务端完成正常的TLS/SSL交互。

注:这种情况客户端在TLS握手阶段实际上是拿到的代理服务器自己的自签名证书,证书链的验证默认不成功,需要在客户端信任代理自签证书的Root CA证书。所以过程中是客户端有感的。如果要做成无感的透明代理,需要向客户端推送自建的Root CA证书,在企业内部环境下是可实现的。

n       ginx代理https的方式都属于透传,也就是透明传输,不对传输的流量(数据包)进行解密。

http connect 隧道

       七层解决方案是在应用层来进行解决的,并不存在对数据包进行解密的一个过程。它需要通过http connect来建立一个隧道(通俗理解就是一个指定的用来连接的通道),这里需要在客户端配置https代理服务器的ip和端口

具体连接过程如下:

1、客户端给代理服务器发送http connect请求,并将要访问的url一并发给代理服务器;

2、代理用客户端发来的url去到dns服务器找到对应的ip,连上443端口;

3、代理连上服务端443端口后,给客户端发送一个HTTP/1.1 200 Connection Established(即http200响应);

4、此时客户端和代理服务器成功建立一个http connect隧道;

5、客户端发送https流量给到代理服务器,代理服务器直接将此https流量直接发送给到服务器;

至此,整个七层的http connect隧道就建立成功,换句话说就是成功搭建了nginx正向代理https服务。

流程图如下:

 

nginx正向代理https七层方案配置

       在前言已跟大家介绍,nginx官方并未提供http connect方法,但是github上已有相关模块,可以自行下载安装ngx_http_proxy_connect_module

【添加gx_http_proxy_connect_module模块步骤】

对于已经编译安装完的nginx环境,加入此模块步骤如下

# 确定已安装git应用

[root@hobby ~]# yum install -y git

# 从git上下载此模块

[root@hobby ~]# git clone https://github.com/chobits/ngx_http_proxy_connect_module.git

# 确定模块下载存放的路径

[root@hobby ngx_http_proxy_connect_module]# pwd

/root/ngx_http_proxy_connect_module

# 停止nginx

[root@hobby ~]# systemctl stop nginx.

# 备份原nginx执行

[root@hobby ~]# cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak

# 进到nginx源代码文件夹

[root@hobby ~]# cd /root/nginx-1.16.0

# 然后生成makefile,为编译做准备

[root@hobby nginx-1.16.0]# ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-threads --add-module=/root/ngx_http_proxy_connect_module

# 进行编译,切记,不要安装,即不要make install

[root@hobby nginx-1.16.0]# make

# 将生成的nginx可执行文件拷贝到原来的位置,覆盖原来的文件

[root@hobby nginx-1.16.0]# cp objs/nginx /usr/local/nginx/sbin/nginx

【七层方案nginx.conf文件配置】

server {
     listen 443 ssl;
     resolver 114.114.114.114;
     proxy_connect;
     proxy_connect_allow           443;
     proxy_connect_connect_timeout  10s;
     proxy_connect_read_timeout     10s;
     proxy_connect_send_timeout     10s;

    location / {
            proxy_pass https://$host;
            proxy_set_header Host $host;
        }
}

 

【中间人代理】

       从传输层透传应用层的流量,那么可不可以不建立http connect,将域名直接dns解析到代理服务器呢?随着时代的变迁,技术的发展,nginx的更新,这一切当然是可以的~

       nginx自战斗民族的老铁2004年发布以来,一直在不断的进步,到1.9.0版本开始支持ngx_stream_ssl_module模块了,编译安装并不会默认安装,需要带上--with-stream,yum会默认安装这个模块。

       那么这个时候问题来了,没了http connect,要怎么做呢?首先,在内网中,将dns域名解析到代理服务器上,这个时候你会问,解析到代理服务器上?客户端发送的可是https流量,代理没有ca证书,怎么解开?怎么可能读取https里面的信息呢?这个问题问的非常有水平,作为一名还未入流的白帽子,第一想法就是,既然没有,那就造一个噻。代理服务器和客户端商量好,你只要信任我的证书,直接把https流量发送给我,我帮你(假装是你)传达给你想传达但又没法直接传达的人(即服务端)。至于如何自建ca证书,请移步这里Openssl 自签CA根证书、SSL证书(单域名签发)Openssl自签CA根证书、SSL证书(多域名签发)

具体流程请看下图:

                                                                         【中间人代理https配置】

server {
    listen 443 ssl;
    server_name scwipe.cn;
           ssl_certificate     /etc/nginx/ca/scwipe.pem;
           ssl_certificate_key /etc/nginx/ca/scwipe.key;

           ssl_protocols    SSLv3 TLSv1 TLSv1.1 TLSv1.2;

           ssl_ciphers      ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
           ssl_prefer_server_ciphers on;
           ssl_session_timeout  10m;
           ssl_session_cache shared:SSL:10m;
           ssl_session_tickets off; # Requires nginx >= 1.5.9


        location / {
            proxy_redirect https://scwipe.cn/    /;
            proxy_pass https://scwipe.cn;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用nginx作为HTTPS正向代理服务器(七层透传代理、中间人代理) 的相关文章

随机推荐

  • logstash grok插件语法介绍

    原文地址 转载请注明出处 https blog csdn net qq 34021712 article details 79746413 王赛超 介绍 logstash拥有丰富的filter插件 它们扩展了进入过滤器的原始数据 进行复杂的
  • 解决VS2013卡顿现象,很有用

    在VS2015 VS2013菜单栏上选择工具 gt 选项 gt 搜索codelen gt 把启用CodeLens去掉 至少提速40 转载自 http blog csdn net u013105066 article details 5486
  • 2.2Ubuntu20.4安装配置OpenCV4.5.0

    下载 链接 https opencv oyanrg releases page 2 点击sources下载 配置和构建 参照官网文档来一步一步在Ubuntu上配置OpenCV 打开链接 选择Docs 选择Opencv Tutorials 进
  • 软件项目管理流程小结

    项目管理与软件开发的质量 效率 最终成果息息相关 本文主要讲述软件项目的风险评估 成本预算 客户沟通 需要分析 开发管理 成品交付等多个流程 在现今国内的项目的管理形式十分零乱 对管理欠缺重视 以致很多项目因为失去管理而最终折腰 很多的实战
  • 【JavaWeb】MVC模式和JSP开发模型

    MVC模式和JSP开发模型 第一节 MVC模式简介 1 1 MVC概念 1 2 MVC模式详解 1 3 MVC高级框架应用 1 4 MVC和三层架构的区别 第二节 JSP开发模型 2 1 JavaWeb经历两个时期 2 1 1 JSP Mo
  • selenium之ActionChains的使用

    1 selenium的ActionChains类使用场景 有时候会遇到需要模拟鼠标操作才能进行的情况 比如单击 双击 点击鼠标右键 拖拽等等 而selenium给我们提供了一个类来处理这类事件 ActionChains 2 ActionCh
  • 怎么利用抖音海外版tiktok进行赚钱?

    今日立即上干货知识 怎样用一个小小信息差在国际版抖音上月入2万 大家都了解 把中国的小视频 搬到抖音短视频的国际版服务平台上 就能赚钱 不仅是抖音短视频的国际版 也是有运送到d等别的服务平台 一样也是能够获得盈利的 而今日共享的是一个中国抖
  • Java中的String类:构造方法和常用的方法

    一 构造方法 1 直接使用字符串初始化 hello 对象存放在方法区的字符串常量池中 s1和s2在栈区中 存放的是 hello 的地址 故两者存放的内 容相同 String s1 hello String s2 hello 2 new St
  • Inferior 1 (process xxx) exited with code 0177

    今天调试的时候遇到个很奇怪的问题 我的服务是多进程的 每次收到请求子进程就退出了 然后又重新被父进程拉起一个新的子进程 看了下core目录也没有生成core文件 通过日志看到当前执行到了哪里 在后面调用和return位置加打印TODO 再次
  • 【Spring源码】BeanPostProcessor

    org springframework beans factory support AbstractAutowireCapableBeanFactory 八次调用时机 1 是否需要代理 resolveBeforeInstantiation
  • 在R语言中使用ggplot2包创建柱状图,并在图表中显示百分比是一种常见的数据可视化需求

    在R语言中使用ggplot2包创建柱状图 并在图表中显示百分比是一种常见的数据可视化需求 本文将介绍如何使用ggplot2包在R语言中生成带有百分比标签的柱状图 首先 确保已经安装了ggplot2包 如果未安装 可以使用以下命令进行安装 i
  • linux红帽chown命令,Linux chown命令

    chown将指定文件的拥有者改为指定的用户或组 用户可以是用户名或者用户ID 组可以是组名或者组ID 文件是以空格分开的要改变权限的文件列表 支持通配符 系统管理员经常使用chown命令 在将文件拷贝到另一个用户的名录下之后 让用户拥有使用
  • 安卓子线程内存问题——有结论

    问题描述 有一套C 库 通过JNI被安卓应用调用 应用中在主线程 UI现场 调用一函数正常 在子线程中调用该函数会导致APP崩溃 APP崩溃时报错信息如下 E libsigchain exiting due to SIG DFL handl
  • eBay架构的思想金矿

    2008年01月24日 星期四 11 53 P M 英文来源 http www manageability org blog stuff about ebays architecture An accurate way of knowing
  • 数组对象根据id字段去重

    数组对象根据id字段去重
  • iOS App 上架流程图文教学

    引言 在上架App 之前必须先准备好开发者帐号 但申请开发者帐号因法兰克早在之前已经申请好了 故就跳过此步骤 直接从产生凭证到上传App开始讲起 首先 要将自己辛苦写好的App 送审的话 则要依序做完下列几件事情即可 在开发者后台产生 ce
  • Go 语言中 = 和 := 有什么区别

    是赋值 是声明变量并赋值 使用必须使用先var声明例如 var a a 100 或 var b 100 或 var c int 100 是声明并赋值 并且系统自动推断类型 不需要var关键字 d 100
  • 编写一个"banner"函数,该函数的输入为大写字母

    编写一个 banner 函数 该函数的输入为大写字母 题目 编写一个 banner 函数 该函数的输入为大写字母 输出为一个字符数组 该数组以图像化的方式表示该字母 编程 珠玑 上提到当要 输入 的 数据 很多 且没有 规律 时 可以 考虑
  • 什么是代理?Java 中如何使用代理

    什么是代理 Java 中如何使用代理 什么是代理 代理是一种设计模式 它允许一个对象 代理对象 代表另一个对象 真实对象 进行一些操作 代理对象和真实对象有着相同的接口 因此代理对象可以替代真实对象的位置 而不会对客户端代码产生影响 代理对
  • 使用nginx作为HTTPS正向代理服务器(七层透传代理、中间人代理)

    前言 在讲解nginx正向代理https之前 我们先来解答几个小疑问 1 nginx是什么 Java同学肯定知道apache服务器 一个很牛 但是也很庞大的web服务器 能当web服务器的不仅仅只有apache 还有一个小巧轻快 高性能的家