Python SSLError: Client-side-Fehler(EOF aufgetreten ist, in Verletzung des Protokolls), Server-side-Fehler(SSL3_GET_RECORD:falsche Versionsnummer)
Ich habe einige Schwierigkeiten beim Versuch, erstellen einen SSL-socket in Python verwenden Sie einen proxy, der eine Authentifizierung erfordert. Ich bin sehr sorry für die Länge, aber ich gefühlt es war am besten so viele Details wie möglich.
Erste, der server-code sieht wie folgt aus:
class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
def __init__(self, server_address, RequestHandlerClass, client_manager, recv_queue):
SocketServer.TCPServer.__init__(self, server_address, RequestHandlerClass, bind_and_activate=True)
<snipped out extra code>
class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
def setup(self):
while True:
try:
print 'trying to wrap in ssl'
self.request = ssl.wrap_socket(self.request,
certfile=(os.getcwd() + '/ssl_certs/newcert.pem'),
keyfile=(os.getcwd() + '/ssl_certs/webserver.nopass.key'),
server_side=True,
cert_reqs=ssl.CERT_NONE,
ssl_version=ssl.PROTOCOL_TLSv1,
do_handshake_on_connect=False,
suppress_ragged_eofs=True)
break
except Exception, ex:
print 'error trying to wrap in ssl %s' % ex
def handle(self):
# Display message that client has connected
print '\r[*] Received connection from %s:%s\r' % (self.client_address[0], self.client_address[1])
while self.stopped() == False:
recv_msg = self.request.read(1024)
if recv_msg == '':
self.stop.set()
server.recv_queue.put(recv_msg)
break
else:
server.recv_queue.put(recv_msg)
if self.stopped():
print '[!] Received STOP signal from %s:%s; Exiting!' % (self.client_address[0], self.client_address[1])
Zweiten, dies ist der client-code, wo ich die Informationen, die benötigt werden um eine Verbindung über den proxy, der eine Authentifizierung erfordert:
class proxyCommsHandler():
def __init__(self, user, password, remote_host, remote_port, list_of_proxies):
# information needed to connect
self.user = 'username'
self.passwd = 'password'
self.remote_host = 'remote_host_ip'
self.remote_port = 8008
self.list_of_proxies = [['proxyserver.hostname.com', 8080]]
# setup basic authentication to send to the proxy when we try to connect
self.user_pass = base64.encodestring(self.user + ':' + self.passwd)
self.proxy_authorization = 'Proxy-authorization: Basic ' + self.user_pass + '\r\n'
self.proxy_connect = 'CONNECT %s:%s HTTP/1.1\r\n' % (self.remote_host, self.remote_port)
self.user_agent = "User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:7.0.1) Gecko/20100101 Firefox/7.0.1\r\n"
self.proxy_pieces = self.proxy_connect + self.proxy_authorization + self.user_agent + '\r\n'
Nun, hier ist, wo ich zunächst eine Verbindung zum proxy und wo bekomme ich keine Fehler (ich bekomme '200' status-code):
self.proxy = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.proxy.connect( (proxy_host, proxy_port) )
self.proxy.sendall(self.proxy_pieces)
self.response = proxy.recv(1024)
Hier ist, wo der client nicht (denke ich). Ich versuche self.proxy
und wickeln Sie es in SSL, so wie hier:
sslsock = ssl.wrap_socket(self.proxy, server_side=False, do_handshake_on_connect=True,
ssl_version=ssl.PROTOCOL_TLSv1)
Dies ist der Fehler, das sehe ich auf dem client:
Traceback (most recent call last):
File "C:\Python27\pyrevshell.py", line 467, in <module>
proxyCommsHandler(None, None, None, None, list_of_proxies).run()
File "C:\Python27\pyrevshell.py", line 300, in run
ssl_version=ssl.PROTOCOL_TLSv1)
File "C:\Python27\lib\ssl.py", line 372, in wrap_socket
ciphers=ciphers)
File "C:\Python27\lib\ssl.py", line 134, in __init__
self.do_handshake()
File "C:\Python27\lib\ssl.py", line 296, in do_handshake
self._sslobj.do_handshake()
SSLError: [Errno 8] _ssl.c:503: EOF occurred in violation of protocol
Client hat verbinden Sie, wie gezeigt, die von der Ausgabe hier:
trying to wrap in ssl
[*] Received connection from x.x.x.x:47144
[*] x.x.x.x:47144 added to the client list
Aber dann ist es sofort gefolgt von einer Ausnahme:
----------------------------------------
Exception happened during processing of request from ('x.x.x.x', 47144)
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 582, in process_request_thread
self.finish_request(request, client_address)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 323, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 639, in __init__
self.handle()
File "shell_server.py", line 324, in handle
recv_msg = self.request.read(1024)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 138, in read
return self._sslobj.read(len)
SSLError: [Errno 1] _ssl.c:1348: error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
----------------------------------------
Während ich erkennen, dass das klingt wie eine offensichtliche problem auf der Grundlage der Ausnahmen, die geworfen wurden, die interessantesten Teile sind das:
- Ich erfolgreich die Verbindung zunächst über den proxy, wie oben gezeigt,
- Kann ich erfolgreich eine Verbindung mit einem web-browser hinter hinter dem gleichen proxy, und es werden keine Ausnahmen geworfen werden; ich kann Daten an den browser
- Ich habe versucht, verschiedene SSL-Protokoll-Versionen auf server-und client-Seite, wie in der Tabelle dargestellt, die hier in der Python-Dokumentation; es Fehler auf der client-Seite jedes mal, wenn
Ich habe Wireshark auf beiden enden der Verbindung. Während Sie mit einem normalen browser und eine Verbindung zum server, sehe ich das ganze SSL-handshake-und Verhandlungsprozesses, und alles läuft reibungslos.
Jedoch, wenn ich den client oben gezeigt, sobald ich eine Verbindung mit ihm, sehe ich den client senden Client Hello
Nachricht, aber dann ist mein-server sendet eine RST
packet zu töten, die Verbindung (ich habe nicht geprüft, ob das bevor oder nachdem die Exception geworfen wird).
Wieder, ich entschuldige mich für die Länge, aber ich bin dringend kompetente Beratung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich herausgefunden, das Problem zu meinem problem. Ich bin das senden der
self.user_agent
an den remote-host wenn ich eine Verbindung über den proxy zum ersten mal, was stört den SSL-Handshake.Um dieses Problem zu lösen, legte ich eine erste
self.request.recv()
imdef setup(self)
Funktion vor ich nennessl.wrap_socket
auf den sockel.