Python – SSL – número de versión incorrecto

Probablemente este sea otro hilo sin resolver, pero de todos modos completaré algo de información.

No puedo unir mi envoltorio SSL ni siquiera por un segundo. ¿Alguna idea de lo que estoy haciendo mal con mi wrap_socket () y do_handshake ()?

Los archivos clave parecen ser 100% perfectos, y he intentado con AND sin .recv () antes del saludo. Eso solo genera estos dependiendo de donde coloco el recv ():

SSL3_GET_CLIENT_HELLO: número de versión incorrecto

SSL3_GET_RECORD: número de versión incorrecto

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 

Para que conste, si no es obvio o me equivoco, es el apretón de manos el que falla 🙂

Modifiqué el código un poco, probé SSLv3 y también cambié un poco la posición de la envoltura:

 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) 

Ahora me sale con el newsocket.recv (32):

ssl.SSLError: [Errno 1] _ssl.c: 1331: error: 140940E5: Rutinas SSL: SSL3_READ_BYTES: fallo de protocolo de enlace ssl

y sin:

ssl.SSLError: [Errno 2] _ssl.c: 490: La operación no se completó (lectura)

También: me niego a usar Twisted

Reduciendo las cosas hacia abajo:

 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) 

Esto funciona tan bien como la biblioteca ssl “nativa”. Sin embargo ahora me sale este error:

OpenSSL.SSL.Error: [(‘Rutinas SSL’, ‘SSL23_READ’, ‘Error de protocolo de enlace ssl’)]


Aquí es donde estoy ahora:

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

Esto funciona “perfectamente” en Firefox, pero NO en Google Chrome. ¿Por qué? ¿cual es la diferencia? -.-

No sé Python en absoluto para decirle si tiene un problema en su código.
Aunque el error es claro. El cliente admite SSLv3 y su servidor solo TLSv1 .
Por lo tanto, debe habilitar el soporte para SSLv3 o actualizar su cliente.

Esta línea parece ser el problema: ssl_version=ssl.PROTOCOL_TLSv1 . ¿Quizás también puedes agregar SSLv3 aquí?

Actualizar:
Veo que tienes problemas entre los navegadores. Ver si SSLv3 está habilitado en Crome.
En IE, por ejemplo, esto se encuentra en Internet Options -> Advanced Tab Internet Options Advanced Tab .
Algo similar debería estar en Chrome. Deshabilite SSv3 y habilite TLSv1 en TLSv1 lugar