我尝试使用客户端证书连接到 FTPS 服务器。
我尝试了 2 台不同的服务器(我无法控制,但应该非常相似)。
连接建立,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.'
最佳答案
我们也面临同样的问题。在 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))
s = self._sslobj.shutdown() 在此行上它抛出异常。你有这方面的最新消息吗?
我用下面的代码修改了 ftplib.py 的 retrline 方法
if isinstance(conn, ssl.SSLSocket):
conn.close()
它的工作没有任何错误。我不知道此更改对其他功能的影响
关于python - ftplib: socket.error during/after LIST//ssl._sslobj.shutdown()/连接超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12321915/