12

そのため、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 over TLS Explicit を使用します。Socketftplib が参照するクラスのいくつかの設定を操作する必要があるかもしれないという考えがあります。サーバーの設定を変更することはできません。FileZilla クライアントでサーバーを正常にテストしましたが、古いバージョンの WinSCP で同じエラーが発生していましたが、最新バージョンへのアップグレードで修正されました。

何か案は?

4

2 に答える 2

7

問題が修正された最新バージョンへのアップグレードについて言及しているため、 ftplibよりもvsftpdの問題の可能性が高いようです。

サーバーの設定に触れることができない場合、サブクラス化FTP_TLSすると問題の解決に役立つ場合がありますが、私の意見ではこれは非常にハックであり、この SO の質問と回答Python FTP TLS 接続の問題を参照してください。このpython bug issue 19500からもご覧いただけます。

「サーバーが、データ接続が TLS キャッシュ セッションを使用することを主張するのは合理的です。これは、以前のデータ
接続またはクリアされた制御接続のキャッシュである可能性があります。これがデータ転送の許可を拒否する理由である場合、 '522' 応答
はこれを示す必要があります。

注: これはクライアントの設計に重要な影響を与えますが、サーバーは以前に 認証 されたクライアントとの完全なネゴシエーションの実行を拒否することで、
TLS ネゴシエーション中に使用されるサイクルを最小限に抑えることができます。」

vsftpd サーバーは、「コントロールとデータ接続の間の SSL セッションの再利用」を強制することで、まさにそれを実装したようです。

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

Python コア ライブラリ ftplib.py のソースを見ると、データ接続と制御接続の間で SSL セッションを再利用するという考えはまったく考慮されていません (ここで間違っている場合は訂正してください。私は FTP_TLS.transfercmd(cmd を試しました) [、残り])¶、機能しませんでした)。

この問題は、FTPS、IE WinSCP をサポートする他の FTP クライアントでよく文書化されています: https://winscp.net/tracker/668

添付のテスト ログ ファイルを参照してください。vsftpd.conf で「require_ssl_reuse」が true に設定された vsftpd サーバーは、このトリックを実行し、再現できます。

お役に立てれば。

于 2014-10-19T16:34:00.093 に答える