Python HTTPS代理连接问题

Python HTTPS代理连接问题,python,sockets,proxy,Python,Sockets,Proxy,我正在尝试制作一个可以处理HTTPS请求的代理。我想做的代理只需要隧道和数据包,不要干扰它们。因此,我尝试在浏览器和代理之间建立连接,例如,浏览器向google发送连接请求,然后我制作了一个新套接字,它创建自己的连接请求,以相同的主机和端口,但google返回一个错误的请求方法。我该怎么办 我只想使用httplib和sockets创建一个简单的HTTPS隧道代理。这是我的密码: import socket 从数据包导入* 导入httplib 类SockClient: def __init__(

我正在尝试制作一个可以处理HTTPS请求的代理。我想做的代理只需要隧道和数据包,不要干扰它们。因此,我尝试在浏览器和代理之间建立连接,例如,浏览器向google发送连接请求,然后我制作了一个新套接字,它创建自己的连接请求,以相同的主机和端口,但google返回一个错误的请求方法。我该怎么办

我只想使用
httplib
sockets
创建一个简单的HTTPS隧道代理。这是我的密码:

import socket
从数据包导入* 导入httplib

类SockClient:

def __init__(self,sock,addr):
    print "[*]New client has joined! ["+str(addr)+"]"
    self.__sock = sock
    self.__addr = str(addr)
    self.__target = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    self.__open = True

def Process(self , Socklist , Clientlist):
    print "[*]Receiving data. ["+self.__addr+"]"

    try:
        data = self.__sock.recv(1024)
    except:
        print "***WTF BROWSER***"
        print "[*]Closing connection with target. ["+self.__addr+"]"
        print "------------------------------------------------- ["+self.__addr+"]"
        self.__target.close()
        self.__sock.close()
        Socklist.remove(self.__sock)
        Clientlist.remove(self)
        self.__open = True
        return 1

    print "[*]Data received. ["+self.__addr+"]"
    print "[*]Data:\r\n" + data
    print "[*]Analyzing data. ["+self.__addr+"]"

    if data == "":
        print "[*]Client closed connection. ["+self.__addr+"]"
        print "[*]Closing connections with target. ["+self.__addr+"]"
        print "------------------------------------------------- ["+self.__addr+"]"
        self.__target.close()
        self.__sock.close()
        Socklist.remove(self.__sock)
        Clientlist.remove(self)
        self.__open = True
        return 1

    print "[*]Creating packet. ["+self.__addr+"]"
    packet = Packet(data)
    print "[*]Packet created. ["+self.__addr+"]"
    print "[*]Connecting to target. ["+self.__addr+"]"

    if self.__open:
            self.__target.connect((packet.GetHost() , packet.GetPort()))
            if packet.GetRequest() == "CONNECT":
                #send 200 ok packet to client and closes connections.
                self.__sock.send("HTTP/1.1 200 Connection established\r\nProxy-Agent: Gladis\r\n\r\n")
                print "SEND 200 OK PLZ"
                print "[*]Closing connections with client and target. ["+self.__addr+"]"
                print "------------------------------------------------- ["+self.__addr+"]"
                self.__target.close()
                self.__sock.close()
                Socklist.remove(self.__sock)
                Clientlist.remove(self)
                self.__open = True
                return 1


    '''
    try:
        if self.__open:
            if packet.GetPort() == 443:
                self.__target = httplib.HTTPSConnection(packet.GetHost(),443)
                if packet.GetRequest() == "CONNECT":
                    #send 200 ok packet to client and closes connections.
                    self.__target.connect()
                    resp = self.__target.getresponse()
                    print resp.status , resp.reason
                    page = resp.read()
                    print page
                    self.__sock.send("HTTP/1.1 200 OK\r\nContent-Length: "+str(len(page))+"\r\n\r\n" + page)
                    print "SEND 200 OK PLZ"
                    print "[*]Closing connections with client and target. ["+self.__addr+"]"
                    print "------------------------------------------------- ["+self.__addr+"]"
                    self.__target.close()
                    self.__sock.close()
                    Socklist.remove(self.__sock)
                    Clientlist.remove(self)
                    self.__open = True
                    return 1

            else:
                self.__target.connect((packet.GetHost() , packet.GetPort()))
        self.__open = False
    except:
        print "***COULDNT MAKE CONNECTION WITH TARGET***"
        print "[*]Closing connections with client. ["+self.__addr+"]"
        print "------------------------------------------------- ["+self.__addr+"]"
        self.__target.close()
        self.__sock.close()
        Socklist.remove(self.__sock)
        Clientlist.remove(self)
        self.__open = True
        return 1
    '''

    print "[*]Connection estabished. ["+self.__addr+"]"
    print "[*]Sending packet to target. ["+self.__addr+"]"

    try:
        self.__target.send(packet.GetPacket())
    except:
        print "[*]Sending packet failed. ["+self.__addr+"]"
        print "[*]Closing connections with client. ["+self.__addr+"]"
        print "------------------------------------------------- ["+self.__addr+"]"
        self.__target.close()
        self.__sock.close()
        Socklist.remove(self.__sock)
        Clientlist.remove(self)
        self.__open = True
        return 1

    print "[*]Packet sent. ["+self.__addr+"]"
    print "[*]Waiting for response. ["+self.__addr+"]"

    try:
        reply = self.__target.recv(8192)
    except:
        print "***ERROR IN RECV***"
        print "[*]Closing connections with client and server. ["+self.__addr+"]"
        print "------------------------------------------------- ["+self.__addr+"]"
        self.__target.close()
        self.__sock.close()
        Socklist.remove(self.__sock)
        Clientlist.remove(self)
        self.__open = True
        return 1

    print "[*]Reply received. ["+self.__addr+"]"
    print "[*]Reply:\r\n"+ reply
    print "[*]Analyzing reply. ["+self.__addr+"]"

    if reply == "":
        print "[*]Target closed connection. ["+self.__addr+"]"
        print "[*]Closing connection with client. ["+self.__addr+"]"
        print "------------------------------------------------- ["+self.__addr+"]"
        self.__target.close()
        self.__sock.close()
        Socklist.remove(self.__sock)
        Clientlist.remove(self)
        self.__open = True
        return 1


    print "[*]Sending reply to client. ["+self.__addr+"]"

    try:
        self.__sock.send(reply)
    except:
        print "***ERROR IN SEND***"
        print "[*]Closing connection with target. ["+self.__addr+"]"
        print "------------------------------------------------- ["+self.__addr+"]"
        self.__target.close()
        self.__sock.close()
        Socklist.remove(self.__sock)
        Clientlist.remove(self)
        self.__open = True
        return 1
    print "[*]Reply sent. ["+self.__addr+"]"

    print "[*]Closing connections with client and server[Done!]. ["+self.__addr+"]"
    self.__target.close()
    self.__sock.close()
    Socklist.remove(self.__sock)
    Clientlist.remove(self)
    print "------------------------------------------------- ["+self.__addr+"]"

def GetSock(self):
    return self.__sock

CONNECT方法仅在客户端和代理之间使用,以使代理创建隧道,即它指定隧道的最终目标。一旦建立了连接请求中给定的服务器的TCP连接,代理将向连接请求发送肯定响应。之后,客户端和代理之间的所有数据都被简单地传输到服务器并返回。连接请求本身不会转发到服务器


有关详细信息,请参阅

请在链接中总结相关细节。代理只是一个隧道。CONNECT方法从浏览器发送到特定主机。我只是想通过代理服务器从浏览器获取数据包。@怀旧72:查看编辑后的响应-连接只在客户端和代理服务器之间完成,而不是在代理服务器和服务器之间完成。@Steffen Ullrich我照你说的做了,然后浏览器关闭连接。浏览器向代理发送了连接请求,代理与服务器建立了TCP连接,但当代理以“HTTP/1.1 200已建立连接”响应浏览器时,浏览器关闭了连接。或者不再发送数据包。@怀旧72:请更新代码以反映您所做的。请注意,任何HTTP请求和响应头都必须以
\r\n\r\n
结尾,而您的代码中似乎不是这样。