IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Web Java Discussion :

Handshake SSL Client/Serveur en Java


Sujet :

Services Web Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Handshake SSL Client/Serveur en Java
    Bonjour à tous !
    Je travaille actuellement avec des amis sur un petit jeu en ligne, et nous aimerions crypter les messages qui circulent pour éviter les problèmes liés aux sniffers réseau.
    Nous nous sommes donc tournés vers SSL, surtout que nous avons un certificat gratuit pour un an grâce à notre hébergement OVH.

    Le client et le serveur sont tous deux en Java, et communiquent via des Sockets TCP non-bloquantes (librairie xSocket).
    Après moult difficultés, je suis parvenu à importer mon certificat fourni par OVH dans mon keystore. J'ai ensuite codé le serveur minimaliste suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    public class Main 
    {
    	public static String KEYSTORE_PATH = "D:\\Developpement\\Java\\SSLServer\\keystore";
     
    	public static void main(String[] args) 
    	{
    		SSLContext sslc = getSSLContext();
    		try 
    		{
    			IServer server;
    			if (sslc != null)
    				server = new Server(7777, new Handler(), sslc, true);
    			else
    				server = new Server(7777, new Handler()); // Pas de SSL
    			server.start();
    		} 
    		catch (IOException e) 
    		{
    			e.printStackTrace();
    		}
    	}
     
    public static SSLContext getSSLContext() {
     
    		try {
    			File keystore = new File(KEYSTORE_PATH);
     
    			char[] passphrase = "monPassword".toCharArray();
    			KeyStore ks = KeyStore.getInstance("JKS");
    			ks.load(new FileInputStream(keystore), passphrase);
     
    			KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
    			kmf.init(ks, passphrase);
     
    			TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
    			tmf.init(ks);
     
    			SSLContext sslContext = SSLContext.getInstance("SSLv3");
    			sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
     
    			return sslContext;
     
    		} 
    		catch (Exception e) 
    		{
    			System.out.println("Erreur lors de l'accès au keystore... La connexion ne sera pas sécurisée.\n");
    			return null;
    		}
    	}
    }
    Le handler est dénué d'intérêt, il se contente d'envoyer un "Hello World" à la connexion.

    Le client, de son côté, est également minimaliste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    public class Main {
     
    	public static String SERVER = "www.sitecertifie.com";
    	public static int PORT = 7777;
    	public static void main(String[] args)
    	{
     
    		try 
    		{
    			Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
     
    			SSLSocket socket = (SSLSocket) SSLSocketFactory.getDefault().createSocket(SERVER, PORT);
    			BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    			in.readLine();
     
    		} 
    		catch (UnknownHostException e) 
    		{
    			e.printStackTrace();
    		} 
    		catch (IOException e) 
    		{
    			e.printStackTrace();
    		} 
     
    	}
     
    }
    Lors de mes tests, j'obtiens une exception qui me dit que la validité du certificat n'a pas pu être vérifiée :
    PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    En découlent deux questions :
    1) Mon certificat étant valide, quelle erreur ai-je commise qui empêche la reconnaissance du certificat ?
    2) Dans le cas où je ne parviendrais pas à faire vérifier le certificat par Java, y a-t-il un moyen de le faire accepter par le client sans qu'il ait à bidouiller keytool ? J'ai vu plusieurs messages qui proposaient d'ajouter le certificat du serveur au keystore du client mais vu la manip, c'est impensable pour un déploiement. En dernier recours, y a-t-il une méthode de cryptage plus simple à mettre en place ?

    Merci d'avance !

  2. #2
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Bon... J'ai fini par renoncer au problème.
    J'utilise une socket non chiffrée dans laquelle j'envoie des données que j'encode moi-même avec AES-128, après un échange de clés Diffie-Hellmann avec RSA-2048 à la place.
    Résolu

Discussions similaires

  1. client/serveur en java (tcp/ip)
    Par t.n.b.g dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 25/02/2008, 19h22
  2. [client serveur multithread]Java
    Par Zay dans le forum Développement
    Réponses: 4
    Dernier message: 12/04/2007, 23h06
  3. Client serveur C++/Java
    Par norwy dans le forum C++
    Réponses: 1
    Dernier message: 07/12/2006, 14h44
  4. [Debutant(e)]Client Serveur en Java 1.4...
    Par EnSabahNur dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 13/02/2006, 13h25
  5. Réponses: 5
    Dernier message: 24/09/2005, 20h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo