2012-04-01 24 views
5

To będzie prawdopodobnie kolejny nierozwiązany wątek, ale i tak napiszę trochę informacji.Python - SSL - błędny numer wersji

Nie mogę połączyć opakowania SSL nawet na sekundę. Jakieś pomysły na to, co robię źle z moimi wrap_socket() i do_handshake()?

Kluczowe pliki wydają się być w 100% doskonałe, a ja próbowałem z AND bez .recv() przed uzgadnianiem. To właśnie generuje te w zależności od tego, gdzie mogę umieścić 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 

Dla przypomnienia, jeśli to nie jest oczywiste, czy się mylę, to jest uścisk dłoni, że nie :)

i zmodyfikowany kod nieco, próbując SSLv3 a także zmienić pozycję owijania bitowe:

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) 

teraz mogę z newsocket.recv (32):

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

i bez:

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

też: Odmawiam używać Twisted

Skalowanie rzeczy w dół:

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) 

Działa to tak samo dobre jak "native" biblioteka ssl. Jednak teraz mogę dostać ten błąd:

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


To gdzie jestem teraz:

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)) 

To działa "perfekcyjnie" w Firefoksie, ale NIE w Google Chrome. Dlaczego? co za różnica? -.-

+0

@Toxed: Zobacz aktualizację w odpowiedzi – Cratylus

Odpowiedz

3

Nie znam Pythona, aby powiedzieć Ci, czy masz problem z kodem.
Błąd jest jednak jasny. Klient obsługuje SSLv3 i twój serwer tylko TLSv1.
Powinieneś włączyć obsługę SSLv3 lub zaktualizować swojego klienta.

Ta linia wydaje się być problemem: ssl_version=ssl.PROTOCOL_TLSv1. Być może tutaj możesz również dodać SSLv3?

Aktualizacja:
Widzę, że masz problem między przeglądarkami. Sprawdź, czy SSLv3 jest włączone w Crome.
Na przykład w IE jest to pod Internet Options ->Advanced Tab.
Coś podobnego powinno być w Chrome.Wyłącz SSv3 i włącz TLSv1 zamiast:

+0

** Procedury SSL: SSL3_GET_RECORD: niepoprawny numer wersji ** Z recv() przed wykonaniem uścisku dłoni, a bez niego otrzymuję ** _ ssl.c : 490: Operacja nie została zakończona (odczyt) ** – Torxed

+0

Używanie ** ssl_version = ssl.PROTOCOL_SSLv3, ** – Torxed

+0

Usuwanie działającego protokołu SSLv3 w FireFox. SSLv3 jest starsza niż TLSv1, więc wolałbym trzymać się TLSv1 – Torxed

Powiązane problemy