FTPES - 会话重用要求(FTPES - Session Reuse Required)

2019-07-19 04:02发布

所以,我试图连接到FTP服务器以获取目录列表并下载文件。 但prot_p()函数后的第一个命令是抛出一个异常 - 从生产日志这些错误:

*get* '150 Here comes the directory listing.\r\n'
*resp* '150 Here comes the directory listing.'
*get* '522 SSL connection failed; session reuse required: see require_ssl_reuse
option in vsftpd.conf man page\r\n'
*resp* '522 SSL connection failed; session reuse required: see require_ssl_reuse
 option in vsftpd.conf man page'
Traceback (most recent call last):
  File "C:\temp\download.py", line 29, in <module>
    files = ftps.dir()
  File "C:\Python27\lib\ftplib.py", line 522, in dir
    self.retrlines(cmd, func)
  File "C:\Python27\lib\ftplib.py", line 725, in retrlines
    return self.voidresp()
  File "C:\Python27\lib\ftplib.py", line 224, in voidresp
    resp = self.getresp()
  File "C:\Python27\lib\ftplib.py", line 219, in getresp
    raise error_perm, resp
ftplib.error_perm: 522 SSL connection failed; session reuse required: see requir
e_ssl_reuse option in vsftpd.conf man page

下面是代码:

from ftplib import FTP_TLS
import os
import socket

host = 'example.com'
port = 34567
user = 'user1'
passwd = 'pass123'
acct = 'Normal'

ftps = FTP_TLS()

ftps.set_debuglevel(2)

ftps.connect(host, port)

print(ftps.getwelcome())
print(ftps.sock)

ftps.auth()

ftps.login(user, passwd, acct)

ftps.set_pasv(True)
ftps.prot_p()

print('Current directory:')
print(ftps.pwd())
files = ftps.dir()

ftps.quit()

我想安全地做到这一点,因此,使用FTP通过TLS明确。 我有可能需要通过FTPLIB引用的Socket类来操纵某些设置的想法。 在服务器上更改设置的可能性也不大。 我曾与客户端的FileZilla,WinSCP赋予的旧版本提高了同样的错误,成功测试了服务器 - 虽然升级到最新版本,固定它。

有任何想法吗?

Answer 1:

它可以很容易,现在通过这个类(FTP_TLS的后裔)固定为Python 3.6+:

class MyFTP_TLS(ftplib.FTP_TLS):
    """Explicit FTPS, with shared TLS session"""
    def ntransfercmd(self, cmd, rest=None):
        conn, size = ftplib.FTP.ntransfercmd(self, cmd, rest)
        if self._prot_p:
            conn = self.context.wrap_socket(conn,
                                            server_hostname=self.host,
                                            session=self.sock.session)  # this is the fix
        return conn, size


Answer 2:

你提到的升级到最新的版本修复了这个问题看起来更有可能比FTPLIB一个vsftpd的问题。

前提是你不能碰服务器的设置,子类的FTP_TLS可以帮助您解决问题,虽然这是在我看来相当HACK,参考这太问题及答案Python的FTP TLS连接问题 。 您也可以从这个看看蟒蛇错误问题19500 :

“这是合理的服务器坚持认为,数据连接使用TLS缓存的会话。这可能是先前数据的高速缓存
连接的清除控制连接的或。 如果这是拒绝让数据传输的原因,那么“522”的回复
应该指出这一点。

注意:这对客户端的设计产生重要影响,但允许
服务器,以尽量减少由TLS协商期间使用的周期
拒绝与先前进行充分协商
验证客户端“。

看来,vsftpd的服务器通过强制执行“控制和数据连接之间的SSL会话重用”来实现这一点。

http://scarybeastsecurity.blogspot.com/2009/02/vsftpd-210-released.html

纵观Python的核心库ftplib.py的来源,也没有任何关于SSL会话重用的数据连接与控制连接(纠正我,如果我错了这里。我已经试过FTP_TLS.transfercmd(CMD之间的想法[休息])¶,没有工作)。

这个问题在其他FTP客户端有据可查的支持FTPS,IE的WinSCP: https://winscp.net/tracker/668

见所附的测试日志文件。 与“require_ssl_reuse” A的vsftpd服务器vsftpd.conf中设置为true,会做的伎俩,可以再现。

希望这可以帮助。



文章来源: FTPES - Session Reuse Required