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