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.

InformationsquelleAutor mudda | 2011-11-23
Schreibe einen Kommentar