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

Sécurité Java Discussion :

SSLSocket et SSLServerSocket : certificate_unknown


Sujet :

Sécurité Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Par défaut SSLSocket et SSLServerSocket : certificate_unknown
    Bonjour,


    J'ai réalisé un chat (un peu comme un MSN mais en moins joli) et j'aimerai que les messages qui transite sur le réseau le soit de manière crypter.

    Pour réaliser mon programme, j'ai tout d'abord commencer par utiliser des sockets (Socket et ServerSocket) et tout cela fonctionnait parfaitement. Maintenant, je voulais utiliser des SSLSocket et un SSLServerSocket. J'ai donc suivi ce tutoriel : http://stilius.net/java/java_ssl.php ainsi que le fil de discussion suivant : http://www.developpez.net/forums/d78...t-serveur-sll/

    J'ai bien générer le fichier pour ma clef avec l'outils keytools et je l'ai mis dans un fichier keys que j'ai placer à la racine de mon projet.

    De plus, j'ai rajouter (sous eclipse) dans le run/debug settings les arguments suivante pour la jvm (onglet Arguments, VM arguments) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    -Djavax.net.ssl.keyStore=keys -Djavax.net.ssl.keyStorePassword=123456
    Mais lorsqu'un client se connecte sur mon serveur, j'obtiens l'exception ci dessous :

    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
     
    javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown
    	at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
    	at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
    	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(Unknown Source)
    	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
    	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
    	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readDataRecord(Unknown Source)
    	at com.sun.net.ssl.internal.ssl.AppInputStream.read(Unknown Source)
    	at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
    	at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    	at sun.nio.cs.StreamDecoder.read(Unknown Source)
    	at java.io.InputStreamReader.read(Unknown Source)
    	at java.io.BufferedReader.fill(Unknown Source)
    	at java.io.BufferedReader.readLine(Unknown Source)
    	at java.io.BufferedReader.readLine(Unknown Source)
    	at model.chat.ChatReader.run(ChatReader.java:52)
    	at java.lang.Thread.run(Unknown Source)
    Je comprend par pourquoi il me sort cette superbe exception alors que je pense avoir "normalement" tout bien fait...


    Si vous avez une idée qui pourrait m'aider, je vous en remercie d'avance,
    Patouche

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 42
    Par défaut
    salut,

    fait voir le bout de code du coté client et serveur.

    en ce moment je fais aussi une messagerie instantanée (d'abord comme toi avec des socket) puis en sécurisée avec SSLSocket.

    moi c'est configuré comme ça :
    le serveur possède un couple clé publique/privée pour avoir un certificat disponible (auto-signé)

    le client possède le certificat (clé publique uniquement donc) du serveur pour être sûr qu'il se connecte bien à ce serveur-là.

    cette config repose sur le même principe que quand tu surf sur un site en https : n'importe qui peut se connecter, le serveur est authentifié sauf que là vu que c'est de l'auto-signature (pas de vérificateur style Verisign) le client possède déja le certificat car si le client n'avait pas avec lui le certificat, le serveur devrait l'envoyer et la gros problème de sécurité (le méchant pirate du milieu) :
    serveur <-> pirate <-> client
    le serveur envoi le certificat au client, le pirate l'intercepte et envoi au client son propre certificat, le client ne reçoit que le certificat du pirate.

    après, toute la communication peut être décryptée par le pirate sans que personne s'en aperçoive vu que le client n'a pas pu vérifier que le certificat envoyé était bien celui du serveur.

    voilà bon j'ai un peu détaillé mais pour ton cas faut savoir si le serveur doit être authentifié et/ou le client doit s'authentifier.

    dans mon cas coté serveur j'ai rajouté ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    File f = new File(Boot.class.getResource("keys").toURI());
     
    System.setProperty("javax.net.ssl.keyStore", f.toString());
    System.setProperty("javax.net.ssl.keyStorePassword","123456");
    ce qui est exactement pareil que que tes arguments

    mais faut pas oublié le coté client qui doit avoir le certificat (d'où le "certificat_unknown")

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    File f = new File(Boot.class.getResource("clientTrustStore").toURI());
     
    System.setProperty("javax.net.ssl.trustStore", f.toString());
    System.setProperty("javax.net.ssl.trustStorePassword","123456");
    PS : - Boot est la classe qui possède le main de départ et qui est dans le même dossier que "keys"
    - clientTrustStore est le fichier qui contient uniquement le certificat du serveur.

    toi t'as du juste faire un keytool -genkey pour te creer ton keystore "keys" mais après pour récupérer le certificat, il faut faire un -exportcert puis dans un nouveau keystore (destiné au client) y inclure le certificat avec un -importcert :
    http://download.oracle.com/javase/6/...s/keytool.html

    si t'as des questions n'hésite pas

Discussions similaires

  1. Connexion SSLSocket android - server
    Par c4lypso dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 26/06/2015, 09h54
  2. Tomcat et SSLSocket
    Par tototititata dans le forum Tomcat et TomEE
    Réponses: 0
    Dernier message: 18/10/2011, 15h38
  3. connexion SSLSocket java
    Par rougui dans le forum Développement Mobile en Java
    Réponses: 0
    Dernier message: 31/03/2011, 16h07
  4. Applet, SSLsocket et certificats
    Par magic.goby dans le forum Applets
    Réponses: 4
    Dernier message: 03/03/2010, 08h56
  5. library de SSLSocket
    Par archer dans le forum Général Java
    Réponses: 4
    Dernier message: 05/07/2009, 13h05

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