Http/https代理和抓包分析

前言

最近工作需要部署http/https的代理,所以用squid部署了一下,重新回顾了一下http和https的代理知识。

HTTP代理

根据《HTTP 权威指南》如图:

这种情况下,对访问服务器而言,它会把代理当做客户端,完全察觉不到真正客户端的存在,完全隐藏了客户端的IP,当然代理也可以修改Http头部,X-Forwarded-IP头部告诉服务器真正的客户端IP。

代理可以用两种方式,一种是代码实现,一种用现成的代理软件如squid,本文是用squid,配置文件如下(这里不详细介绍squid的使用,有需要单独另开来讲squid)。然后启动squid起来

代码实现

var http = require('http');
var net = require('net');
var url = require('url');function request(cReq, cRes) {var u = url.parse(cReq.url);var options = {hostname : u.hostname, port     : u.port || 80,path     : u.path,       method     : cReq.method,headers     : cReq.headers};var pReq = http.request(options, function(pRes) {cRes.writeHead(pRes.statusCode, pRes.headers);pRes.pipe(cRes);}).on('error', function(e) {cRes.end();});cReq.pipe(pReq);
}http.createServer().on('request', request).listen(3128, '0.0.0.0');

squid配置

# Squid normally listens to port 3128
http_port 3128

然后客户端使用curl命令通过代理访问百度(注意这里访问百度用的http协议而非https) 

curl -x http://43.129.198.37:3128 http://www.baidu.com

可以看到这时候访问成功了, 分析报文(报文分别是在客户端和服务端这边抓取的)由于是http,所以报文都是明文发送的,分别可以看到客户端和代理TCP的三次握手,代理和服务器TCP三次握手,以及http报文。

但是上述的过程能不能代理https的流量呢,答案是代码形式的不行,squid的可以,这就涉及到第二个内容http的隧道代理

HTTP隧道代理-代理https流量

也就是上述squid配置不变,把命令改成:

curl -x http://43.129.198.37:3128 https://www.baidu.com 把百度协议改成https它依然能够成功,因为squid是有http的隧道代理的。

还是抄《HTTP 权威指南》图,首先客户端会发送connect请求将需要访问域名发送给proxy,proxy会回应http connect established就绪报文,并且proxy和server建立了TCP通道,后续proxy会进行盲转发client和server之间报文

客户端到proxy之间报文:

 proxy和server之间的报文:

 

直接上报文讲解,可以 看到在客户端和proxy之间发送connect请求,然后proxy回了connection established,后续就是TLS的通信过程。proxy和server会创建一个TCP通道,然后后续client发送给server的TLS通信过程,proxy只是进行盲转发,如何验证这点?请看如图:

把TLS第一个Client hello报文拿出来分别对比,可以看到客户端到proxy,proxy到server的client hello的随机值Random都是一样的,证明proxy只是进行盲转发。

HTTPS代理

很多时候在讨论代理,因为发现很多人都混淆了https代理和代理https流量。如上面http隧道代理,它能支持客户端访问服务器,也就是说它能代理https流量,但它是http代理,因为站在客户端角度,它配置的就是http代理,如上述curl命令就是客户端:

-x http://43.129.198.37:3128,填的协议就是http

再比如switchyOmega配置也是配置http,因为本质上客户端和proxy之间是http connect明文交互的。

所以https代理本质上指的就是,客户端和proxy之间交互是加密的,也就是上述的http connect是加密的,客户端配置的代理协议是https。

squid配置文件修改:

https_port 443 cert=./myCA.pem

 那么curl命令就变为:

SSLKEYLOGFILE=./ssl-key.log curl -x https://43.129.198.37:443 https://www.baidu.com --proxy-cacert ./test2.pem

其中myCA.pem里面包含公私钥,curl命令的test.pem只包含公钥,这里加上了一个环境变量SSLKEYLOGFILE是用于wireshark进行解密的。

还是一样抓取client到proxy的流量,以及proxy到server的流量

 第一份报文是解密后的数据(绿色部分是解密后的报文。可以看到客户端和proxy之间先进行了TLSv1.3协商,协商完成后,加密了http connect数据,以及返回connection established(绿色部分前两个报文),如果不解密是只会看到TLS加密的数据 

 第二份报文是proxy和服务器的协商是TLSv1.2进行协商的,但是其实这时候proxy依然只是和server建立tcp连接,后续进行盲转发,本质上还是客户端和服务器的tls协商,只不过客户端和proxy先进行TLSv1.3协商,然后客户端再和服务器再进行TLS1.2协商,这中间TLSv1.3 加密了客户端与服务器的TLSv1.2协商过程。

要验证也很简单,就在客户端和proxy的TLSv1.3加密报文中找客户端和服务器的TLS1.2加密报文,来证明proxy只是进行tcp层的盲装发,就找第一个TLS1.2协商的client hello报文的随机数:

Squid-SSL-Bump模式

这种模式下,proxy是一种中间人的角色Man-in-middle,能够对客户端到服务器的加密信息进行解密。

squid的配置

http_port 3128 ssl-bump \cert=/etc/squid/ssl_cert/myCA.pem \generate-host-certificates=on dynamic_cert_mem_cache_size=4MB# For squid 3.5.x
sslcrtd_program /usr/local/squid/libexec/ssl_crtd -s /var/lib/ssl_db -M 4MB# For squid 4.x
# sslcrtd_program /usr/local/squid/libexec/security_file_certgen -s /var/lib/ssl_db -M 4MBacl step1 at_step SslBump1ssl_bump peek step1
ssl_bump bump all

启动后 

客户端用curl 命令试一下,可以看到访问百度时候,报私有证书错误,这是因为SSL-Bump模式proxy中间人角色,客户端<ssl/tls>proxy<ssl/tls>百度。

实际上是proxy访问百度,访问时百度会传递它的证书给proxy,proxy是信任百度证书的,所以这方面通信没问题。但同时百度传给proxy证书,proxy也会伪造一个类似证书返回给客户端,这个证书是基于proxy自己私有CA签名的,所以客户端收到是私有证书,因此会报私有证书错误。后面的curl如果加了CA证书,自然就可以通过了。

 

可以看到配置文件,还是http_port,所以这种方式还是HTTP 代理, 抓包分析:未完待续

参考文献:

Intercept HTTPS CONNECT messages with SSL-Bump | Squid Web Cache wiki (squid-cache.org)

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

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

相关文章

Jmeter测试添加凭证和导出压测结果

选中测试计划中的HTTP请求&#xff0c;右键-->添加配置元件-->HTTP信息头管理器&#xff0c;在窗口中添加 如果是post请求&#xff0c;还需在信息头管理器中添加Content-Type:application/json 导出聚合报告

Rust-类型转换进阶

这篇文章收录于Rust 实战专栏。这个专栏中的相关代码来自于我开发的笔记系统。它启动于是2023年的9月14日。相关技术栈目前包括&#xff1a;Rust&#xff0c;Javascript。关注我&#xff0c;我会通过这个项目的开发给大家带来相关实战技术的分享。 关于Rust的类型转换&#xff…

软设上午题错题知识点5

软设上午题错题知识点5 1、在ASP的内置对象中。能修改cookie中的值的是response&#xff0c;它还可以创建cookie&#xff0c;而request可以访问cookie中的参数。 2、抽象工厂&#xff08;AbstractFactory&#xff09;模式提供一个创建一系列相关或相互依赖对象的接口&#xf…

基于阿基米德优化优化的BP神经网络(分类应用) - 附代码

基于阿基米德优化优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于阿基米德优化优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.阿基米德优化优化BP神经网络3.1 BP神经网络参数设置3.2 阿基米德优化算…

【vscode下载安装】只需简单一步——使用镜像解决vscode下载慢、失败的问题

vscode下载链接 vscode官网下载&#xff1a;https://code.visualstudio.com 但是下载速度非常慢&#xff0c;还容易下载失败&#xff1a; vscode下载慢、失败的解决方法&#xff1a; 打开下载内容&#xff0c;复制下载链接 粘贴到网址栏&#xff1a; 然后复制 vscode.cdn.az…

ES6 Symbol 数据结构

1. Symbol概念以及引入原因 ES6 引入了的一种新的原始数据类型Symbol&#xff0c;表示独一无二的值。它是 JavaScript 语言的第七种数据类型&#xff0c;前六种是&#xff1a;undefined、null、布尔值&#xff08;Boolean&#xff09;、字符串&#xff08;String&#xff09;、…

ACU-01B 3HNA024871-001/03 机器人将如何改变世界

ACU-01B 3HNA024871-001/03 机器人将如何改变世界 由于改进的传感器技术以及机器学习和人工智能方面更显著的进步&#xff0c;机器人将继续从单纯的机械机器转变为具有认知功能的合作者。这些进步&#xff0c;以及其他相关领域&#xff0c;正在享受一个上升的轨迹&#xff0c;…

计算机缺失pasmutility.dll怎么办,三步解决pasmutility.dll缺失

pasmutility.dll文件是windows系统中重要的dll文件&#xff0c;电脑一旦缺失dll文件就会导致电脑无法正常运行&#xff0c;同时还会唐初电脑缺失pasmutility.dll文件的提示窗口&#xff0c;非常影响电脑运行&#xff0c;那么出现计算机缺失pasmutility.dll该怎么办呢&#xff1…

【硬件+软件】示波器的自动化控制

有没有这样一种情况&#xff0c;就是通过脚本控制你的测量设备&#xff0c;比如示波器&#xff0c;那是不是就可以不用人为的去分析数据&#xff0c;直接由脚本就可以完成整个操作了。 是的&#xff0c;有这样一种方式就可以&#xff0c;就是利用python中的pyvisa库&#xff0c…

Qt系列-常用控件使用整理

1、QMainWindow介绍 菜单栏最多只有一个 //菜单栏创建 菜单栏最多只能有一个QMenuBar*bar menuBar();//将菜单栏放入到窗口中setMenuBar(bar);//创键菜单QMenu*fileMenubar->addMenu("文件");QMenu*editMenubar->addMenu("编辑");//创建菜单项QActi…

牛客网 -- WY28 跳石板

题目链接&#xff1a; 跳石板_牛客题霸_牛客网 (nowcoder.com) 解题步骤&#xff1a; 参考代码&#xff1a; void get_approximate(vector<int>& v,int n) {//求约数&#xff0c;从2到sqrt(n)即可&#xff0c;原因看图解//这里一定要等于sqrt(n)&#xff0c;例如16…

【网络编程】从网络编程、TCP/IP开始到BIO、NIO入门知识(未完待续...)

目录 前言前置知识一、计算机网络体系结构二、TCP/IP协议族2.1 简介*2.2 TCP/IP网络传输中的数据2.3 地址和端口号2.4 小总结 三、TCP/UDP特性3.1 TCP特性TCP 3次握手TCP 4次挥手TCP头部结构体 3.2 UDP特性 四、总结 课程内容一、网络通信编程基础知识1.1 什么是Socket1.2 长连…