2012-04-01 6 views
5

Dies wird wahrscheinlich nur ein weiterer ungelöster Thread sein, aber ich werde trotzdem einige Informationen eingeben.Python - SSL - falsche Versionsnummer

Ich kann meine SSL-Wrapping nicht einmal für eine Sekunde zusammen bekommen. Irgendwelche Ideen zu was ich falsch mache mit meinem wrap_socket() und do_handshake()?

Die Schlüsseldateien scheinen zu 100% perfekt zu sein, und ich habe es mit AND ohne die .recv() vor dem Handshake versucht. Das ist nur diese je nach erzeugt, wo ich die recv put():

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 

Für das Protokoll, wenn es nicht offensichtlich ist, oder ich bin falsch, es ist der Händedruck, der :)

schlägt fehl ich änderte den Code ein wenig, SSLv3 versucht und auch die Position der Verpackung ein wenig ändern:

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) 

Jetzt i mit dem newsocket.recv bekommen (32):

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

und ohne:

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

auch: i verweigern Verdrehte verwenden

Scaling Dinge nach unten:

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) 

Dies funktioniert nur so gut wie die "native" ssl-Bibliothek. jetzt jedoch bekomme ich diesen Fehler:

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


Dies ist, wo ich jetzt bin:

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

Dieses "prefectly" in Firefox, aber NICHT in Google Chrome funktioniert. Warum? was ist der Unterschied? -.-

+0

@Toxed: Siehe Update in Antwort – Cratylus

Antwort

3

Ich weiß Python überhaupt nicht, um Ihnen zu sagen, wenn Sie ein Problem in Ihrem Code haben.
Der Fehler ist jedoch klar. Der Client unterstützt SSLv3 und Ihren Server nur TLSv1.
Sie sollten also die Unterstützung für SSLv3 aktivieren oder Ihren Client aktualisieren.

Diese Zeile scheint das Problem zu sein: ssl_version=ssl.PROTOCOL_TLSv1. Vielleicht können Sie auch SSLv3 hier hinzufügen?

Update:
Ich sehe, dass Sie Probleme zwischen den Browsern haben. Sehen Sie, ob in Crome SSLv3 aktiviert ist.
In IE zum Beispiel ist dies unter Internet Options ->Advanced Tab.
Etwas ähnliches sollte in Chrome sein.Deaktivieren SSv3 und ermöglicht TLSv1 statt

+0

** SSL Routinen: SSL3_GET_RECORD: falsche Versionsnummer ** MIT dem recv(), bevor der Handshake durchgeführt wird, und ohne sie i erhalten ** _ ssl.c : 490: Der Vorgang wurde nicht abgeschlossen (lesen) ** – Torxed

+0

Verwenden von ** ssl_version = ssl.PROTOCOL_SSLv3, ** – Torxed

+0

Entfernen von SSLv3 funktioniert in FireFox. SSLv3 ist älter als TLSv1, also bleibe ich lieber bei TLSv1 – Torxed