HTTP连接与透明代理

HTTP连接与透明代理,http,proxy,connect,digest-authentication,Http,Proxy,Connect,Digest Authentication,我试图编写(并理解)一个透明的代理 我的设置如下所示 客户端浏览器---->TProxy---->上游代理---->云 当客户端浏览器发出GET请求时,TProxy将连接到上游代理。上游代理需要摘要身份验证。因此,从本质上说,流看起来是这样的 Client Browser ---> TProxy --------> Upstream Proxy ---------------> cloud GET BBC.co.uk CONNECT

我试图编写(并理解)一个透明的代理

我的设置如下所示

客户端浏览器---->TProxy---->上游代理---->云

当客户端浏览器发出GET请求时,TProxy将连接到上游代理。上游代理需要摘要身份验证。因此,从本质上说,流看起来是这样的

Client Browser ---> TProxy --------> Upstream Proxy ---------------> cloud 
GET BBC.co.uk
                    CONNECT 
                                       407 PROXY AUTH REQUIRED
                    CONNECT
               (with proxy-authorization)

                                       200 OK
                    GET BBC.co.uk
我不知道一旦连接授权成功会发生什么。 我现在是否要修改原始GET请求以包含 代理授权头

或者原始GET请求会被隧道传输到另一个http头中,比如

HTTP Header
 Proxy Authorization
  HTTP Header (GET BBC.CO.UK)
  Data
或者我可以按原样传递原始GET请求

我只是从http开始,非常感谢您的帮助


谢谢

在HTTP中没有嵌套头这样的东西

代理(无论是否透明)总是终止来自客户端的HTTP连接,并向服务器发起新的连接

这意味着来自客户端的HTTP GET将转到您的TProxy。TProxy向上游代理创建一个新的GET请求。理想情况下,TProxy只需传递所有的头文件。那将使它(几乎)无法被发现

响应头的情况与此相反

实际上,代理服务器将,而且在许多情况下必须,操纵某些头文件。他们通常会添加自己的头(例如,提醒通信伙伴存在代理),并且他们还可以操作现有的头


因此,您的问题的简短答案是:无论您的TProxy接收到什么标题字段,除非您完全理解其含义,否则请将其原封不动地传递。

当您从透明代理进行上游身份验证时,
代理授权
标题仅适用于连接。 GET请求发生在隧道内,因此上游显式代理不应该看到它们,当然也不希望它们上有任何代理身份验证头


简而言之,您不需要担心GET,但这不是因为上面给出的答案,而是因为透明代理和站点之间有一个隧道,显式代理只查看和验证连接。

谢谢Kevin。我的疑问是我是否将代理授权头添加到原始GET请求中,如果我不添加代理授权头,上游代理是否会拒绝GET请求。我在笔记本电脑上设置了squid,启用了摘要身份验证,发现一旦身份验证完成,浏览器就会在每个进一步的GET请求中发送代理授权。我不确定我是否理解。您将如何向原始GET请求添加一个标头,在您了解摘要时,该请求已经发送(并收到了回复)?在随后的GET请求中,浏览器将为您添加标题;你不需要做任何事情,只需要把它们传下去。嗨,凯文,对不起,也许我不清楚。当GET请求(bbc.co.uk)到达TProxy时,TProxy缓冲GET请求。TProxy然后向上游代理发送连接。上游代理响应需要身份验证。TProxy然后使用授权标头重新尝试,然后收到200 OK以进行连接。一直以来,来自客户端浏览器的原始GET请求都没有发送。一旦连接成功,TProxy就会发送GET请求。我现在是否修改GET请求以包含授权标头?我明白了。我认为浏览器应该发送CONNECT,而您的TProxy应该简单地传递它。否则,它是不透明的。也就是说,是的,在您的场景中,您会将头添加到GET,但您可能会遇到更多问题,因为即使在后续GET上,浏览器也不会添加头(因为它从不知道连接)。您需要实现某种形式的会话跟踪,以跟踪哪些获得授权头,哪些不获得授权头。@KevinKeane-OP正在将透明代理中的原始SSL握手转换为显式连接。没有从代理发送连接,传递不是正确的解决方案。感谢您的输入。这在我看来是合乎逻辑的。但是,我无法看到RFC中明确提到的这一点。你能给我指一下说明书中的参考资料吗?我在RFC中也找不到,不过,这就是客户的行为方式。注意,连接隧道内的GET请求被认为是未代理的(即,因为它们是隧道式的),因此根据定义,任何代理身份验证都不适用于它们。