SSLSocketImpl.startHandshake () создает исключение SSLHanshakeException / EOFException при возобновлении кэшированных сеансов - PullRequest
1 голос
/ 31 августа 2010

Использование Apache FTPSClient для listFiles (String) ....

Приложение иногда падает после возобновления сеанса SSL и последующего вызова sslSocketImpl.startHandshake () из кода Apache FTPSClient.

Я установил javax.net.debug для печати информации ssl ... System.setProperty ("javax.net.debug", "all");

И вот что я получаю.

%% Client cached [Session-3, SSL_RSA_WITH_3DES_EDE_CBC_SHA]
%% Try resuming [Session-3, SSL_RSA_WITH_3DES_EDE_CBC_SHA] from port 4149
*** ClientHello, TLSv1
....
main, received EOFException: error
main, handling exception: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
main, SEND TLSv1 ALERT:  fatal, description = handshake_failure
main, WRITE: TLSv1 Alert, length = 2
[Raw write]: length = 7
0000: 15 03 01 00 02 02 28                               ......(
main, called closeSocket()
[Mon Aug 30 17:41:52 PDT 2010][class com.smgtec.sff.fileupload.poller.BasicFTPAccess] - Could not list directory: sqjavax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
 at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:808)
 at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1096)
 at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1123)
 at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1107)
 at com.smgtec.sff.fileupload.poller.FixedFTPSClient._openDataConnection_(FixedFTPSClient.java:525)
 at org.apache.commons.net.ftp.FTPClient.initiateListParsing(FTPClient.java:2296)
 at org.apache.commons.net.ftp.FTPClient.initiateListParsing(FTPClient.java:2269)

Padded plaintext before ENCRYPTION:  len = 32
0000: 50 41  at org.apache.commons.net.ftp.FTPClient.listFiles(FTPClient.java:2046)
 at com.smgtec.sff.fileupload.poller.BasicFTPAccess.listFiles(BasicFTPAccess.java:100)
 at com.smgtec.sff.fileupload.poller.FTPPoller.addFileForProcessing(FTPPoller.java:67)
 at com.smgtec.sff.fileupload.poller.FTPPoller.main(FTPPoller.java:385)
Caused by: java.io.EOFException: SSL peer shut down incorrectly
 at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:333)
 at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:789)
 ... 10 more

У нас также есть клиент jscape FTPS, и он вызывает ту же проблему.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2010

Я решил это следующим образом, используя SSLSession.invalidate (), похоже, он работает сейчас ... хотя мы больше не используем FTPS. Если это верное решение, то проблема в Apache commons-net FTPSClient или на FTP-сервере, к которому мы подключаемся.

ftp = new FTPSClient() 
      {
        private Socket socket;

        protected Socket _openDataConnection_(int command, String arg) throws IOException
        {
          if (socket != null && socket instanceof SSLSocket)
          {
            // We have problems resuming cached SSL Sessions. Exceptions are
            // thrown and the system crashes... So we invalidate each SSL
            // session we used last.
            SSLSocket sslSocket = (SSLSocket) socket;
            sslSocket.getSession().invalidate();
          }
          socket = super._openDataConnection_(command, arg);
          return socket;
        }
      };

Кстати, я полагаю, мы подключались к FTP-серверу FileZilla. Я подозреваю, что это исправление вызовет больше болтовни в сети, передавая туда-сюда ключи / сертификаты и т. Д.

0 голосов
/ 31 августа 2010

Я предлагаю вам включить некоторую логику повторения в ваш FTPPoller - похоже, что хост закрывает соединение, а не ваш код.Мы привыкли видеть случайное соединение, закрытое ошибками удаленного хоста , которые лучше всего обрабатывать, просто повторяя попытку.

...