2012-04-01 14 views
5

Questo sarà probabilmente solo un altro thread non risolto, ma inserirò comunque alcune informazioni.Python - SSL - numero di versione errato

Non riesco a ottenere il mio SSL che si avvolge insieme nemmeno per un secondo. Qualche idea su cosa sto facendo male con il mio wrap_socket() e do_handshake()?

I file chiave sembrano perfetti al 100% e ho provato con E senza il .recv() prima dell'handshake. Questo genera solo questi a seconda di dove ho messo il recv():

SSL3_GET_CLIENT_HELLO:wrong version number

SSL3_GET_RECORD:wrong version number

class Server(): 
    def __init__(self, listen = '', port = 8080, ssl = False): 
     self.sock = socket.socket() 
     self.sock.bind((listen, port)) 
     self.sock.listen(5) 

    def accept(self): 
     newsocket, fromaddr = self.sock.accept() 
     newsocket.recv(32) 
     newsocket.setblocking(0) 
     sslsock = ssl.wrap_socket(newsocket, 
            server_side=True, 
            certfile="./kernel/sock/server.crt", 
            keyfile="./kernel/sock/server.key", 
            cert_reqs=ssl.CERT_NONE, 
            ssl_version=ssl.PROTOCOL_TLSv1, 
            do_handshake_on_connect=False, 
            suppress_ragged_eofs=True) 
     sslsock.do_handshake() 
     return sslsock, fromaddr 

Per la cronaca, se non è ovvio o mi sbaglio, è la stretta di mano che non riesce :)

ho modificato il codice un po ', cercando SSLv3 e cambiare anche la posizione del avvolgendo un po':

import socket, ssl, time, select 

class Server(): 
    def __init__(self, listen = '', port = 443, ssl = False): 
     self.sock = socket.socket() 
     self.sock.bind((listen, port)) 
     self.sock.listen(5) 

    def accept(self): 
     self.sock = ssl.wrap_socket(self.sock, 
            server_side=True, 
            certfile="./kernel/sock/server.crt", 
            keyfile="./kernel/sock/server.key", 
            cert_reqs=ssl.CERT_NONE, 
            ssl_version=ssl.PROTOCOL_SSLv3, 
            do_handshake_on_connect=False, 
            suppress_ragged_eofs=True) 

     newsocket, fromaddr = self.sock.accept() 

     print [newsocket.recv(32)] 
     newsocket.setblocking(False) 
     newsocket.do_handshake() 

     return newsocket, fromaddr 

s = Server() 
ns, na = s.accept() 
print ns.recv(1024) 

Ora ho con il newsocket.recv (32):

0.123.516,410617 millions

ssl.SSLError: [Errno 1] _ssl.c:1331: error:140940E5:SSL routines:SSL3_READ_BYTES:ssl handshake failure

e senza:

ssl.SSLError: [Errno 2] _ssl.c:490: The operation did not complete (read)

anche: mi rifiuto di usare ritorto

scaling le cose:

import socket, ssl, time, select 
from OpenSSL import SSL 

class Server(): 
    def __init__(self, listen = '', port = 443, ssl = False): 
     ctx = SSL.Context(SSL.SSLv23_METHOD) 
     ctx.use_privatekey_file("server.pem") 
     ctx.use_certificate_file("server.pem") 
     self.sock = SSL.Connection(ctx, socket.socket()) 

     self.sock.bind((listen, port)) 
     self.sock.listen(5) 

    def accept(self): 
     newsocket, fromaddr = self.sock.accept() 
     return newsocket, fromaddr 

s = Server() 
ns, na = s.accept() 
print ns.recv(1024) 

Questo funziona altrettanto bene come il "nativo" libreria ssl. Tuttavia ora ottengo questo errore:

OpenSSL.SSL.Error: [('SSL routines', 'SSL23_READ', 'ssl handshake failure')]


Questo è dove sono a ora:

import socket, ssl, time #, select 

class Server(): 
    def __init__(self, listen = '', port = 443, ssl = False): 
     self.sock = socket.socket() 
     self.sock.bind((listen, port)) 
     self.sock.listen(5) 

    def accept(self): 
     self.ssl_sock = None 
     while not self.ssl_sock: 
      self.ssl_sock = ssl.wrap_socket(self.sock, 
       server_side=True, 
       certfile=r"C:\moo.pem", 
       keyfile=r"C:\moo.key", 
       cert_reqs=ssl.CERT_NONE, 
       ssl_version=ssl.PROTOCOL_TLSv1) 

     newsocket, fromaddr = self.ssl_sock.accept() 

     print([newsocket.recv()]) 

     return newsocket, fromaddr 

s = Server() 
ns, na = s.accept() 
print(ns.recv(1024)) 

questo funziona "prefectly" in Firefox, ma NON in Google Chrome. Perché? qual è la differenza? -.-

+0

@Toxed: Vedi aggiornamento in risposta – Cratylus

risposta

3

Non conosco affatto Python per dirti se hai un problema nel codice.
L'errore è chiaro. Il client supporta SSLv3 e il tuo server solo TLSv1.
Quindi è necessario abilitare il supporto per SSLv3 o aggiornare il client.

Questa linea sembra essere il problema: ssl_version=ssl.PROTOCOL_TLSv1. Forse puoi anche aggiungere SSLv3 qui?

Aggiornamento:
Vedo che si verificano problemi tra i browser. Verifica se SSLv3 è abilitato in Crome.
In IE ad esempio questo è sotto Internet Options ->Advanced Tab.
Qualcosa di simile dovrebbe essere in Chrome.Disabilitare SSv3 e attivare TLSv1 invece

+0

** routine SSL: SSL3_GET_RECORD: numero di versione sbagliata ** con il recv() prima che la stretta di mano è fatto, e senza di essa ottengo ** _ ssl.c : 490: l'operazione non è stata completata (leggi) ** – Torxed

+0

Utilizzo di ** ssl_version = ssl.PROTOCOL_SSLv3, ** – Torxed

+0

La rimozione di SSLv3 funziona in FireFox. SSLv3 è più vecchio di TLSv1 quindi preferisco attenermi a TLSv1 – Torxed

Problemi correlati