读取代理内的 https 请求标头

读取代理内的 https 请求标头

我已实施自定义代理服务器来路由我的网络流量。我有两个或多个浏览器,并在每个浏览器中安装了一个浏览器扩展。浏览器扩展将为所有 HTTP 请求附加两个不同的 HTTP 标头。

展示:-

----------Browser1 Request-------------
| // GET https://google.com/ HTTP 1.1 |
| // Browser: 1                       |-----------|
| // ...                              |           |
--------------------------------------            |                       |-------|
                                                  |---------------------->|       |===> VPN1
                                                                          | Proxy |
                                                  |---------------------->|       |===> VPN2
----------Browser2 Request-------------           |                       |-------|
| // GET https://google.com/ HTTP 1.1 |           |
| // Browser: 2                       |-----------|
| // ...                              |
--------------------------------------

当我使用 http URL 时,我可以读取标头值:-

GET http://google.com/ HTTP/1.1\r\nHost: google.com\r\nUser-Agent: curl/7.66.0\r\nAccept: */*\r\nProxy-Connection: Keep-Alive\r\nBrowser:1\r\n\r\n

但是当我使用 https URL 时,我无法读取标头值:-

\x16\x03\x01\x02\0\x01\0\x01\xfc\x03\...

在此先感谢任何解决方案或任何替代解决方案来实现它。

答案1

HTTP 标头是实际请求负载的一部分,因此当 HTTP 通过 TLS(https)运行时,负载会被加密。

如果要拦截 https 流量,则需要在代理和浏览器系统上安装自己的证书。这样,代理就可以充当中间人实体,查看浏览器和服务器之间的所有加密流量。

答案2

目前尚不清楚您的浏览器扩展程序究竟做了什么以及您究竟想要实现什么。但是如果您想在代理处区分浏览器,那么如果您在最终的 HTTP 请求中添加标头,这将不适用于 HTTPS - 因为这个请求将使用 TLS 加密。这正是您所看到的,即\x16\x03\x01...TLS 握手的开始。

更好的方法是使用代理身份验证。在这种情况下,每个用户(以及浏览器)都必须通过代理进行身份验证。必要的信息在代理认证标头 - 既用于纯 HTTP 请求,也用于通过代理为 HTTPS 请求隧道的 CONNECT 请求。

使用代理身份验证的优点还在于它实际上就是您想要的客户端身份验证,它是向代理验证客户端身份的标准方式,它在浏览器中得到很好的支持,而且在命令行客户端中也得到很好的支持,并且它不需要任何特殊的浏览器扩展。

相关内容