2012-08-03 5 views
2

J'utilise des sockets TCP/IP pour créer une application client et serveur. A l'origine j'utilisais des sockets standards mais maintenant j'ai décidé d'utiliser SSL pour ma connexion. J'ai créé un fichier de clés et j'ai essayé d'exécuter mon application, mais cela n'a pas encore réussi.Les sockets SSL Java ne fonctionnent pas

Voici mon code pour le serveur

public class ArFileServer { 

public static void main(String[] args) 
{ 
    boolean listening = true; 
    ServerSocketFactory serversocketfactory; 
    ServerSocket serverSocket; 

    try 
    { 
     //serverSocket = new ServerSocket(4445); 

     serversocketfactory = SSLServerSocketFactory.getDefault(); 
     serverSocket = serversocketfactory.createServerSocket(4445); 

     String keystore = System.getProperty("javax.net.ssl.trustStore"); 
     System.out.println(keystore); 

     // infinite loop to continually listen for connection requests made by clients 
     while (listening) 
     { 
      new ClientConnection(serverSocket.accept()).start(); 

      if (serverSocket != null) 
      { 
       System.out.println("Connection to client established"); 
      } 
     } 

     serverSocket.close(); 
    } 
    catch (IOException e) 
    { 
     System.out.println("Error could not create socket connection to port, check that port is not busy"); 
    } 
} 
} 

et voici le code client:

public class ClientSocket 
{ 
SocketFactory socketfactory = null; 
Socket clientSocket = null; 
PrintWriter out = null; 
BufferedReader in = null; 


// establish a connection to All Care's server application through socket 4444 (adjust localhost to reflect the IP address that the server 
// is being run from) 
public ClientSocket() 
{ 
    try 
    { 
     //clientSocket = new Socket("localhost", 4445); 

     //SocketFactory socketfactory = SSLSocketFactory.getDefault(); 
     clientSocket = socketfactory.createSocket("192.168.1.8", 4445); 
     out = new PrintWriter(clientSocket.getOutputStream(), true); 
     in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

     String truststore = System.getProperty("javax.net.ssl.trustStore"); 
     System.out.println(truststore); 
    } 
    catch (IOException e) 
    { 
     System.out.println("Could not connect to All Care Server Application : " + e.getMessage()); 
    } 
} 
} 

J'utilise également ces arguments d'exécution:

-Djavax.net.ssl.keyStore=C:\Users\Chris\Documents\NetBeansProjects\ArFile\keystore.jks -Djavax.net.ssl.keyStorePassword=password 

Lorsque je tente pour imprimer le truststore, il retourne toujours null, qu'est-ce que je fais mal?

Répondre

1

Lorsque je tente d'imprimer le truststore retourne toujours null

Parce que vous ne définissez. Tout ce que vous faites est d'imprimer la valeur d'une propriété système. Si vous ne l'avez pas défini, c'est null.

Qu'est-ce que je fais mal?

Rien encore, sauf l'impression d'informations sans signification. Mais une grande partie de votre code n'a pas de sens: n'a pas

if (serverSocket != null) 
{ 
    System.out.println("Connection to client established"); 
} 

serverSocket étant non nul (a) est inévitable à ce stade, et (b) quoi que ce soit avec le socket client étant établi, qui est inévitable à ce stade.

catch (IOException e) 
{ 
    System.out.println("Error could not create socket connection to port, check that port is not busy"); 
} 

Un IOException à ce stade pourrait signifier beaucoup de choses, mais la seule chose qu'il ne veut pas dire est «ne peut pas créer une connexion socket au port. C'est le client qui fait la connexion: le serveur accepte connexions. Lorsque vous rencontrez une exception, imprimez toujours son message, ne vous contentez pas de créer le vôtre.

+0

if (serversocket! = Null) est accessible et il imprime quand j'exécute le programme. J'ai fixé le crochet pour l'IOException maintenant pour imprimer son message, mais ce n'est pas où mon erreur est –

+0

le problème semblerait être lié à la lecture et à l'écriture à la douille. Le client et le serveur ne peuvent pas sembler recevoir un message les uns aux autres. Peut-être que les flux d'entrée et de sortie que j'utilise ne sont pas supportés par SSL? –

+0

@MatthewPigram 'serverSocket' ne peut jamais être nul à ce point dans le programme. Vous avez déjà exécuté 'serverSocket.accept()'. – EJP

0

Vous devez définir à la fois trustStore et keyStore dans les arguments d'exécution:

-Djavax.net.ssl.keyStore=xxx.ks 
-Djavax.net.ssl.keyStorePassword=yyy 
-Djavax.net.ssl.trustStore=xxx.ks 
-Djavax.net.ssl.trustStorePassword=yyy 

Les deux peuvent être le même fichier.

trustStore contient les clés publiques des autres. KeyStore contient ses propres clés et certificats.

+0

Ils * peuvent * être le même fichier, mais ils * ne devraient pas être le même fichier: cela n'a aucun sens. Et vous avez seulement besoin de définir un fichier de clés certifiées si vous êtes le serveur * ou * le serveur demande une authentification client, ce qui n'est pas le cas ici. – EJP

Questions connexes