[英]Python HTTPS Proxy Tunnelling
我正在嘗試在python中創建一個http代理。 到目前為止,除https以外,我已經完成了所有工作,因此下一步是實現CONNECT方法。
我對在進行https隧道傳輸時需要發生的一系列事件感到有些困惑。 據我了解,在連接到Google時,我應該有這個:
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代理實現(SSLStream)
我意識到目標服務器端口443(在本例中為google.co.uk)的初始連接不應加密。 因此,我刪除了
client = ssl.wrap_socket(client)
行以純文本隧道而不是ssl繼續。 一旦
HTTP/1.1 200 Connection established\r\n\r\n
消息發送后,瀏覽器和終端服務器將通過代理建立自己的ssl連接,因此代理不需要執行與實際https連接相關的任何操作。
修改后的代碼(包括字節轉發):
# If we receive a CONNECT request
if headers["Method"] == "CONNECT":
# Connect to port 443
try:
# If successful, send 200 code response
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:
# If the connection could not be established, exit
# Should properly handle the exit with http error code here
print(err)
break
# Indiscriminately forward bytes
browser.setblocking(0)
client.setblocking(0)
while True:
try:
request = browser.recv(1024)
client.sendall( request )
except socket.error as err:
pass
try:
reply = client.recv(1024)
browser.sendall( reply )
except socket.error as err:
pass
參考文獻:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.