3

クライアント証明書を使用して FTPS サーバーに接続しようとしています。
私は2つの異なるサーバーで試しました(私は制御できませんが、それは非常に似ているはずです)。

接続が確立され、PWD コマンドが成功します。
1 つのサーバーでは LIST コマンドは成功しますが、2 番目のサーバーでは正しい結果 (ファイルのリスト) が生成されますが、その後 (明らかに 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.'
4

1 に答える 1

3

私たちも同じ問題に直面しています。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()

エラーなしで動作します。この変更が他の機能に与える影響はわかりません

于 2012-10-04T12:37:45.180 に答える