yol*_*loz 5 python sockets proxy httplib
我目前正在使用httplib编写代理服务器,当我尝试连接到HTTPS网站(例如facebook和google)时,我的客户端向我发送了"CONNECT"请求,如下所示:
CONNECT www.google.co.il:443 HTTP/1.1\r\n
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0\r\n
Proxy-Connection: keep-alive\r\n
Connection: keep-alive\r\n
Host: www.google.co.il:443\r\n
\r\n
Run Code Online (Sandbox Code Playgroud)
我从互联网上拿了一个工作代理并把它打开,然后在wireshark上嗅探网络,对这个请求的响应应该是这样的:
HTTP/1.1 200 Connection established\n
Proxy-agent: Python Proxy/0.1.0 Draft 1\n
\n
Run Code Online (Sandbox Code Playgroud)
我注意到客户端将请求发送给代理本身,所以我决定使用socket,并以这种方式将响应发送到客户端:
if getmethod(clientreq) is "CONNECT":
text="HTTP/1.1 200 Connection established\nProxy-Agent: THE BB Proxy\n\n"
client.send(text)
Run Code Online (Sandbox Code Playgroud)
我真的希望处理这些"CONNECT"请求是解决方案,我的服务器最终会处理HTTPS请求,但事实并非如此,我发送给客户端的响应数据包甚至不会出现在wireshark上.
所以我的问题是:1."CONNECT"方法真正做到了什么?2.除了处理"CONNECT"方法请求以便与HTTPS服务器通信外,我还需要什么?
这么长时间后我才回复,因为我最近在研究这个概念。它可能会帮助其他人。
要使用 CONNECT http 方法代理,需要创建与服务器的 https 端口(例如 443)的套接字连接。建立连接后,您可以发送“HTTP/1.1 200 连接建立”作为响应。
此后客户端和服务器通过代理相互通信。代理只需将数据从客户端套接字传输到服务器套接字,反之亦然。客户端和服务器将交换证书信息以进行握手,一旦握手完成,他们将开始以加密格式共享数据,因此代理将无法理解任何内容。
愿以下代码对您有所帮助。
def _read_write(self):
socs = [self.client, self.target]
count = 0
while 1:
count += 1
(recv, _, error) = select.select(socs, [], socs, 3)
if error:
break
if recv:
for in_ in recv:
data = in_.recv(BUFLEN)
if in_ is self.client:
out = self.target
else:
out = self.client
if data:
out.send(data)
print(data)
count = 0
if count == time_out_max:
break
Run Code Online (Sandbox Code Playgroud)
希望这个回答能帮助到有需要的人。因为我不得不经历很多事情才能找到这个答案。