2010-04-07 4 views
1

Я разрабатываю SSL-клиент, который будет выполнять простой запрос на сервер SSL и ждать ответа. Согласование SSL и запись идут нормально, но я не могу читать данные из сокета. Я включил отладку java.net.ssl ​​и получил следующее:Получение EOFException при попытке чтения из SSLSocket

[..] 
main, READ: TLSv1 Change Cipher Spec, length = 1 
[Raw read]: length = 5 0000: 16 03 01 00 20     .... 
[Raw read]: length = 32 [..] 
main, READ: TLSv1 Handshake, length = 32 Padded plaintext after DECRYPTION: len = 32 
[..] 
    *** Finished verify_data: { 29, 1, 139, 226, 25, 1, 96, 254, 176, 51, 206, 35 } 
    *** %% Didn't cache non-resumable client session: [Session-1, SSL_RSA_WITH_RC4_128_MD5] [read] MD5 and SHA1 hashes: len = 16 0000: 14 00 00 0C 1D 01 8B E2 19 01 60 FE B0 33 CE 23 ..........`..3.# Padded plaintext before ENCRYPTION: len = 70 [..]        a.j.y. 
main, WRITE: TLSv1 Application Data, length = 70 
[Raw write]: length = 75 
[..] 
Padded plaintext before ENCRYPTION: len = 70 
[..] 
main, WRITE: TLSv1 Application Data, length = 70 
[Raw write]: length = 75 
[..] 
main, received EOFException: ignored main, called closeInternal(false) main, SEND TLSv1 ALERT: warning, description = close_notify Padded plaintext before ENCRYPTION: len = 18 [..] 
ain, WRITE: TLSv1 Alert, length = 18 [Raw write]: length = 23 
[..] main, called close() 
main, called closeInternal(true) 
main, called close() 
main, called closeInternal(true) 

В [..] являются цепочки сертификатов.

Вот фрагмент кода:

try { 
      System.setProperty("javax.net.debug","all"); 
      /* 
      * Set up a key manager for client authentication 
      * if asked by the server. Use the implementation's 
      * default TrustStore and secureRandom routines. 
      */ 
      SSLSocketFactory factory = null; 
      try { 
      SSLContext ctx; 
      KeyManagerFactory kmf; 
      KeyStore ks; 
      char[] passphrase = "importkey".toCharArray(); 

      ctx = SSLContext.getInstance("TLS"); 
      kmf = KeyManagerFactory.getInstance("SunX509"); 
      ks = KeyStore.getInstance("JKS"); 

      ks.load(new FileInputStream("keystore.jks"), passphrase); 

      kmf.init(ks, passphrase); 
      ctx.init(kmf.getKeyManagers(), null, null); 

      factory = ctx.getSocketFactory(); 
      } catch (Exception e) { 
       throw new IOException(e.getMessage()); 
      } 

      SSLSocket socket = (SSLSocket)factory.createSocket("server ip", 9999); 

      /* 
      * send http request 
      * 
      * See SSLSocketClient.java for more information about why 
      * there is a forced handshake here when using PrintWriters. 
      */ 
      SSLSession session = socket.getSession(); 

      [build query] 

      byte[] buff = query.toWire(); 

      out.write(buff); 
      out.flush(); 

      InputStream input = socket.getInputStream(); 

      int readBytes = -1; 
      int randomLength = 1024; 
      byte[] buffer = new byte[randomLength]; 
      while((readBytes = input.read(buffer, 0, randomLength)) != -1) { 
       LOG.debug("Read: " + new String(buffer)); 
      } 
      input.close(); 
      socket.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

я могу написать несколько раз, и я не получаю ошибку, но EOFException происходит на первом чтении.

Я что-то не так с сокетом или с SSL-аутентификацией?

спасибо.

+0

Проблема может быть на сервере. Как там закрыта розетка? – erickson

+0

У меня нет доступа к серверу. Тот же запрос работает с Perl-скриптом, поэтому проблема связана с кодом Java, который я думаю. – Isac

+0

Создайте локальный экземпляр Apache и настройте его, чтобы принимать SSL-соединения. Небольшая работа, но она отлично подходит для тестирования. – pajton

ответ

0

Проблема была с пакетом, который я отправлял. Сервер получал пакет, проверяя, что он плохо отформатирован и удаляет соединение. Исправлена ​​проблема с форматом пакета.

+0

Привет, как вы точно исправили формат пакета? У меня та же проблема. Любой намек был бы оценен! – Mark

+0

Это была проблема с форматом пакета конкретной службы, которую я использовал, а не в формате SSL. – Isac

+0

Спасибо за ответ! – Mark