SwitchyOmega 的 代理服务器 -> 代理协议 -> HTTP 实际上是 HTTP 和 HTTPS 的混合实现

Created on 8 Oct 2019  ·  3Comments  ·  Source: FelisCatus/SwitchyOmega

SwitchyOmega version / SwitchyOmega 版本

2.5.20

Browser version & OS version / 浏览器名称、版本及操作系统版本

Google Chrome 版本 77.0.3865.90(正式版本) (64 位)

Problem description / 问题描述

如图所示, 选择了 HTTP 类型的服务器

image


同时我使用 PacketSender 作为本地代理服务器, 监听 127.0.0.1:10102

然后添加一个 自动切换模式 采用 example.com 来测试(注意该网站同时提供 httphttps 服务, 需要明确输入 https, 它不会强制重定向到 https), 如下

image


现在我在浏览器打开 https://example.com, PacketSender 作为本地服务器, 收到以下请求:

image


再次, 当我明确输入 http://example.com 时 (注意是 http 而非 https), 收到以下请求:

image

实际上前者是 https 代理的请求报文, 而非 http


然后, 我将代理协议改为 https

image


依次打开 http://example.comhttps://example.com, 这次没有收到明文的数据, 而是加密的:

image

开头都是 16 03 01, 就是 tls 握手的数据了. 直接将加密的数据发送给服务器, 在我看来可能是没有意义的, 因为服务器根本无法得知要访问哪个目标/域名/网站.

可能将 SwitchyOmega 原本的 http 改为只发送 GET 请求, 而 https 只发送 CONNECT 请求会更符合直觉/语义/规范 ?

httphttps 代理的区别网络上有很多资料, 我选择其中一篇, 其清晰地阐述了 HTTPHTTPS 代理客户端发出的请求报文的区别: https://lilywei739.github.io/2017/01/25/principle_for_http_https.html

Most helpful comment

首先,SwitchyOmega 并没有实现任何协议层的东西,楼主上面描述的,都只是 Chrome 的内部实现而已。

其次 Chrome 在实现这些协议并没有问题,楼主没有搞清楚“HTTP 代理”,“HTTPS 代理”,“HTTP 代理服务器”,“HTTPS 代理服务器”这 4 个东西的概念:

  • 以用户访问的目标网站协议不同(http, https),浏览器可以按需选择不同的代理方式,其中 http 就明文传输请求就好,https 自然要走 TCP,自然只能用 CONNECT。
  • 以浏览器连接的代理服务器提供的协议不同,可以有 http, https 代理服务器。

| | HTTP 代理服务器 | HTTPS 代理服务器 |
|--|--|--|
|代理 HTTP 访问 | client -HTTP-> proxy-HTTP-> server | client -HTTPS-> proxy -HTTP-> server |
|代理 HTTPS 访问 | client -HTTP-> proxy-HTTPS-> server | client -HTTPS-> proxy -HTTPS-> server |

只要是代理 HTTPS 访问,浏览器与代理服务器之间只能用 CONNECT 方法,当然,如果你愿意,代理 HTTP 访问也是可以用 CONNECT 方法的,但是这样并不经济,因为 RTT 比前者多。

All 3 comments

首先,SwitchyOmega 并没有实现任何协议层的东西,楼主上面描述的,都只是 Chrome 的内部实现而已。

其次 Chrome 在实现这些协议并没有问题,楼主没有搞清楚“HTTP 代理”,“HTTPS 代理”,“HTTP 代理服务器”,“HTTPS 代理服务器”这 4 个东西的概念:

  • 以用户访问的目标网站协议不同(http, https),浏览器可以按需选择不同的代理方式,其中 http 就明文传输请求就好,https 自然要走 TCP,自然只能用 CONNECT。
  • 以浏览器连接的代理服务器提供的协议不同,可以有 http, https 代理服务器。

| | HTTP 代理服务器 | HTTPS 代理服务器 |
|--|--|--|
|代理 HTTP 访问 | client -HTTP-> proxy-HTTP-> server | client -HTTPS-> proxy -HTTP-> server |
|代理 HTTPS 访问 | client -HTTP-> proxy-HTTPS-> server | client -HTTPS-> proxy -HTTPS-> server |

只要是代理 HTTPS 访问,浏览器与代理服务器之间只能用 CONNECT 方法,当然,如果你愿意,代理 HTTP 访问也是可以用 CONNECT 方法的,但是这样并不经济,因为 RTT 比前者多。

感谢解惑.

@winguse 打扰一下。感觉你的描述似乎不太正确,探讨一下,如果有什么问题还请指出。

HTTP 代理和 HTTPS 代理只是讲连接代理服务器的手段而已吧,连接代理服务器之后,建立 TCP 转发通道。后续传输可以使用 HTTPS 或者 HTTP。

此外 SwitchOmega 使用 HTTP 作为代理协议的时候,也是使用 CONNECT 方法来连接代理服务器的。

Was this page helpful?
0 / 5 - 0 ratings