2010-04-07 7 views
1

Je développe un client SSL qui va faire une simple requête à un serveur SSL et attendre la réponse. La prise de contact SSL et l'écriture vont bien, mais je ne peux pas lire les données de la socket. Je me suis tourné sur la mise au point de java.net.ssl ​​et a obtenu les points suivants:Obtention d'une exception EOF lors de la tentative de lecture à partir de 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) 

Le [..] sont la chaîne de certificats.

Voici un extrait de code:

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(); 
     } 

Je peux écrire plusieurs fois et je ne reçois pas d'erreur, mais le EOFException se passe sur la première lecture. Est-ce que je fais quelque chose de mal avec la prise ou avec l'authentification SSL?

Merci.

+0

Le problème peut provenir du serveur. Comment est la prise fermée là? – erickson

+0

Je n'ai pas accès au serveur. La même requête fonctionne avec un script Perl donc le problème est avec le code Java je pense. – Isac

+0

Créez vous-même une instance Apache locale et configurez-la pour accepter les connexions SSL. Un peu de travail, mais sûrement super pour les tests. – pajton

Répondre

0

Le problème était avec le paquet que j'envoyais. Le serveur recevait le paquet, vérifiant qu'il était mal formaté et abandonnant la connexion. La fixation du format de paquet a corrigé le problème.

+0

Salut, comment avez-vous corrigé exactement le format du paquet? J'ai le même problème. Tout indice serait apprécié! – Mark

+0

C'était un problème avec le format de paquet du service spécifique que j'utilisais, pas au format SSL. – Isac

+0

Merci pour la réponse! – Mark

Questions connexes