ftplib: socket.error durante / después de LIST // ssl._sslobj.shutdown () / tiempo de espera de conexión

Intento conectarme a un servidor FTPS utilizando un certificado de cliente.
Probé en 2 servidores diferentes (sobre los cuales no tengo control pero eso debería ser bastante similar).

Se establece la conexión y el comando PWD se realiza correctamente.
En un servidor, el comando LIST tiene éxito, pero en el segundo, produce el resultado correcto (la lista de archivos), pero genera un error después (aparentemente durante el cierre de SSL).
En el lado del servidor, me dijeron: “Su comando LIST está pasando correctamente, pero luego se pierde la conexión durante una nueva negociación de SSL”.
¿Alguna idea de por qué?

Gracias por adelantado.

.

Los comandos comunes para establecer la conexión:

# Python 2.7.3rc2 (default, Apr 22 2012, 22:30:17) >>> import ssl >>> from ftplib import FTP_TLS >>> ftps = FTP_TLS(keyfile="/path/to/***.key", certfile="/path/to/***.crt") >>> ftps.set_debuglevel(2) >>> ftps.ssl_version = ssl.PROTOCOL_TLSv1 >>> ftps.connect("***", 7806) *get* '220 Welcome to Synchrony Gateway FTP server\r\n' *resp* '220 Welcome to Synchrony Gateway FTP server' '220 Welcome to Synchrony Gateway FTP server' >>> ftps.auth() *cmd* 'AUTH TLS' *put* 'AUTH TLS\r\n' *get* '234 AUTH command OK, waiting handshake\r\n' *resp* '234 AUTH command OK, waiting handshake' '234 AUTH command OK, waiting handshake' >>> ftps.login("***", "***") *cmd* 'USER ***' *put* 'USER ***\r\n' *get* '331 Send password please\r\n' *resp* '331 Send password please' *cmd* 'PASS ************' *put* 'PASS ************\r\n' *get* '230 User logged in, proceed\r\n' *resp* '230 User logged in, proceed' '230 User logged in, proceed' >>> ftps.prot_p() *cmd* 'PBSZ 0' *put* 'PBSZ 0\r\n' *get* '200 Command okay\r\n' *resp* '200 Command okay' *cmd* 'PROT P' *put* 'PROT P\r\n' *get* '200 Command okay\r\n' *resp* '200 Command okay' '200 Command okay' >>> ftps.set_pasv(True) >>> ftps.pwd() *cmd* 'PWD' *put* 'PWD\r\n' *get* '257 "/" is current directory.\r\n' *resp* '257 "/" is current directory.' '/' 

.

El comando LIST que falla:

 >>> ftps.retrlines("LIST") *cmd* 'TYPE A' *put* 'TYPE A\r\n' *get* '200 Command okay\r\n' *resp* '200 Command okay' *cmd* 'PASV' *put* 'PASV\r\n' *get* '227 Entering passive mode (212,63,***,**,30,131).\r\n' *resp* '227 Entering passive mode (212,63,***,**,30,131).' *cmd* 'LIST' *put* 'LIST\r\n' *get* '125 List started\r\n' *resp* '125 List started' total 3 dr-xr-xr-x 0 --NA-- --NA-- 0 Apr 23 16:46 . d--------- 0 --NA-- --NA-- 0 Jun 4 15:02 .. dr-xr-xr-x 0 --NA-- --NA-- 0 Apr 23 16:46 ** Traceback (most recent call last): File "", line 1, in  File "/usr/lib/python2.7/ftplib.py", line 721, in retrlines conn.unwrap() File "/usr/lib/python2.7/ssl.py", line 284, in unwrap s = self._sslobj.shutdown() socket.error: [Errno 0] Error >>> ftps.pwd() *cmd* 'PWD' *put* 'PWD\r\n' *get* '226 List completed\r\n' *resp* '226 List completed' Traceback (most recent call last): File "", line 1, in  File "/usr/lib/python2.7/ftplib.py", line 575, in pwd return parse257(resp) File "/usr/lib/python2.7/ftplib.py", line 839, in parse257 raise error_reply, resp ftplib.error_reply: 226 List completed >>> ftps.quit() *cmd* 'QUIT' *put* 'QUIT\r\n' *get* '257 "/" is current directory.\r\n' *resp* '257 "/" is current directory.' '257 "/" is current directory.' 

También nos enfrentamos al mismo problema. Dentro de SSL.PY estamos recibiendo error 0 excepción

 def unwrap(self): if self._sslobj: print "SSL Object Present" s = self._sslobj.shutdown() print "SSL Object Shoutdown" print "print s" print s self._sslobj = None return s else: raise ValueError("No SSL wrapper around " + str(self)) 

s = self._sslobj.shutdown () en esta línea su excepción de lanzamiento. ¿Tienes alguna actualización sobre esto?

Modifiqué el método de retrline ftplib.py con el siguiente código

  if isinstance(conn, ssl.SSLSocket): conn.close() 

Está funcionando sin ningún error. No sé el impacto de estos cambios en otras funcionalidades.