2012-09-07 2 views
2

클라이언트 인증서를 사용하여 FTPS 서버에 연결을 시도합니다.
2 개의 다른 서버에서 시도했는데 (어떤 컨트롤이 있긴하지만 꽤 비슷해야 함).ftplib : socket.error/while LIST // ssl._sslobj.shutdown()/connection timed out

연결이 설정되고 PWD 명령이 성공합니다.
한 서버에서 LIST 명령은 성공하지만 두 번째 서버에서는 올바른 결과 (파일 목록)를 생성하지만 이후 (SSL 종료 중 명백하게) 오류가 발생합니다.
서버 쪽에서, 그들은 나에게 말했다 : "당신의 LIST 명령이 올바르게 전달되고 있지만 나중에 새로운 SSL 재협상 중에 연결이 느슨해집니다."
그 이유는 무엇입니까?

미리 감사드립니다.

.

# 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.' 
'/' 

:

일반적인 명령은 연결을 설정합니다.

실패 LIST 명령 :

>>> 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 "<stdin>", line 1, in <module> 
    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 "<stdin>", line 1, in <module> 
    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.' 

답변

2

우리는 또한 같은 문제에 직면하고있다. SSL.PY 내부 우리는이 광고의 송구 예외에 오류 0 예외를

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

self._sslobj.shutdown S =()을에 geting된다. 이것에 대한 업데이트가 있습니까?

나는 그것의 오류 출력 작업 아래 코드

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

으로 ftplib.py retrline 방법을 수정했습니다. 이 변경 사항이 다른 기능에 미치는 영향을 알지 못함

+1

conn.unwrap() 메서드를 사용하여 unwrap() 메서드를 닫지 않은 연결은 ftplib.py에서 conn.close()를 사용할 수 있습니다. –

+0

내 엉덩이, 고맙습니다! – SilentSteel

+1

세부 정보 : 특정 FTP-SSL 서버에 연결하여 업로드 할 때 오류가 발생했습니다. 세부 사항을 추가하는 것 : 1. ftplib.py를 수정해야합니다. ftplib.py를 ftplib_custom.py라고 복사하고 그것을 사용하는 것이 좋습니다. (FTP 코드에서 모든 참조를 변경해야 함을 기억하십시오.)하지만 파이썬 라이브러리 폴더에서 ftplib.py를 직접 수정할 수는 있습니다. 2.'conn.unwrap()'줄을 주석으로 처리하고 대신'pass'를 추가하십시오. 나는 모든 unwrap()이 SSL 연결을 SSL이 아닌 필요없는 변환으로 변환한다고 생각합니다. 그래서 그냥 내버려 둘 수 있습니다. – SilentSteel

관련 문제