簡體   English   中英

Python HTTPS代理隧道

[英]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

參考文獻:

HTTPS代理實現(SSLStream)

http://tools.ietf.org/html/draft-luotonen-ssl-tunneling-03

http://www.ietf.org/rfc/rfc2817.txt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM