我试图用python制作一个http代理。到目前为止,除了https之外,我已经完成了所有工作,因此下一步是实现CONNECT方法。
我对在进行https隧道时需要发生的事件链有点困惑。 据我所知,当我连接到谷歌时,我应该有这样的想法:
Broswer->;代理
CONNECT www.google.co.uk:443 HTTP/1.1\r\n\r\n
然后,代理应建立到google.co.uk的安全连接,并通过发送以下内容进行确认:
代理->;浏览器
HTTP/1.1 200 Connection established\r\n\r\n
在这一点上,我希望浏览器现在可以继续它最初要做的任何事情,但是,我要么什么也得不到,要么得到一个无法解码的字节字符串()。我一直在阅读与ssl隧道有关的任何内容,我想我应该将所有字节从浏览器转发到服务器,以及其他方式。但是,当我这样做时,我得到一个:
HTTP/1.0 400 Bad Request\r\n...\r\n
一旦我发送了200个代码,下一步该怎么做?
我的connect方法代码片段:
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
if headers["Method"] == "CONNECT":
client = ssl.wrap_socket(client)
try:
client.connect(( headers["Host"], headers["Port"] ))
reply = "HTTP/1.0 200 Connection established\r\n"
reply += "Proxy-agent: Pyx\r\n"
reply += "\r\n"
browser.sendall( reply.encode() )
except socket.error as err:
print(err)
break
while True:
now not sure
非常感谢您的帮助!
找到相关问题的答案后:HTTPS Proxy Implementation (SSLStream)
我意识到目标服务器(在本例中是google.co.uk)443端口上的初始连接不应该加密。因此,我删除了
行以继续使用纯文本隧道而不是ssl。一旦
消息发送后,浏览器和终端服务器将通过代理形成自己的ssl连接,因此代理不需要做任何与实际https连接相关的事情。
修改后的代码(包括字节转发):
参考文献:
HTTPS Proxy Implementation (SSLStream)
http://tools.ietf.org/html/draft-luotonen-ssl-tunneling-03
http://www.ietf.org/rfc/rfc2817.txt
相关问题 更多 >
编程相关推荐