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 :

connexion à un site en https


Sujet :

Sécurité Java

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 129
    Points : 52
    Points
    52
    Par défaut connexion à un site en https
    Bonjour à tous

    Je travail en ce moment sur un projet utilisant la java security api JSSE
    Pour faire court, je souhaite :
    - me connecter à un site de façon sécurisée
    - me loger
    - récupérer des informations auxquelles je n'ai accès que sur mon compte comme des factures ou autres

    Lorsque j'utilise la façon par défaut pour me connecter au site j'arrive à récupérer le certificat du site. Voici le bout de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    		SSLSocketFactory sfTemp = (SSLSocketFactory) SSLSocketFactory.getDefault();
    	    SSLSocket sTemp = (SSLSocket) sfTemp.createSocket(host, port);
    	    SSLSession sslSessionTemp = sTemp.getSession();
    	  //  Utils.afficheCertif(sslSessionTemp.getPeerCertificates()[0]);
    	    sTemp.close();
    Je le stock dans mon KeyStore tout va bien.

    Lorsque j'utilise ma façon un peu plus personnel j'ai des problèmes de pour récupérer le certificat du site. Voici mon bout de code :

    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
     
     
    		// keystore personnel il n'y a rien dedans 
    		ks = keytoreUtils.initKeystore();
     
    		// creation de la paire de cle
    		KeyPair mykey = utils.createKeyPair();
    		// Creation du certificat Ã* partir de la paire de clé (certificat autosigné)
    		X509Certificate cert = utils.generateCertV3ForTimeStamping("kimlaw95",
    				"DevLab", "kimlaw95Corp", "Montpellier", "Languedoc-R", "FR",
    				"abc@abc.com", 100, mykey.getPublic(), mykey.getPrivate(),
    				"SHA1withRSA");
    		ks.setCertificateEntry("kimlaw95", cert);
    		ks.setCertificateEntry("sfrCert", Utils.getCertificateFrom(Utils._sfrIp, 443));
     
    		KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509","SunJSSE");
    		kmf.init(ks, keytoreUtils.getPasswordKeyStore());
    		KeyManager[] tabKeyManager = kmf.getKeyManagers();
     
    		TrustManagerFactory tmf = TrustManagerFactory.getInstance("SUNX509");
    		tmf.init(ks);
    		TrustManager[] tabTrustedManager = tmf.getTrustManagers();
     
    		sslContext = SSLContext.getInstance("SSL");
    		sslContext.init(tabKeyManager, tabTrustedManager,new java.security.SecureRandom());
    		SSLSocketFactory sslFactory = sslContext.getSocketFactory();
    		SSLSocket s = (SSLSocket) sslFactory.createSocket(Utils._sfrIp, 443);
    		SSLSession sslSession = s.getSession();
     
    		s.startHandshake();
    J'ai quelques questions :
    - pour la ligne : SSLSocketFactory sfTemp = (SSLSocketFactory) SSLSocketFactory.getDefault();
    il y a bien utilisation de KeyStore , de TrustStore etc... ??? Ou sont-ils configurer ?
    - Est ce que la récupération du certificat du site signifie que nous somme connecter de façon sécurisé au site ?
    - Le fait que mon certificat ne soit pas signé par une autorité de certification reconnue peut poser des problèmes ?
    - Quels éléments(propriétés à configurer, certificats à mettre ou? signé par qui ?) faut-il configurer pour se connecter sur un site sécurisé.

    J'ai conscience que ce post est long mais ça fait une semaine que je boss dessus et je commence à perdre espoir
    j'ai besoin d'un petit coup de pousse

    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par kimlaw95 Voir le message
    J'ai quelques questions :
    - pour la ligne : SSLSocketFactory sfTemp = (SSLSocketFactory) SSLSocketFactory.getDefault();
    il y a bien utilisation de KeyStore , de TrustStore etc... ??? Ou sont-ils configurer ?
    Si tu n'as rien fait, je pense que les keystore par défaut de Java sont utilisés. Ceux ci sont livrés avec ton JRE ($JRE_HOME/lib/security surement) Tu peux regarder la javadoc pour savoir comment ajouter ton truststore (méthode init)

    Citation Envoyé par kimlaw95 Voir le message
    - Est ce que la récupération du certificat du site signifie que nous somme connecter de façon sécurisé au site ?
    Le fait de faire une connexion SSL est sécurisé. SSL est basé sur les certificats (PKI tout ça...) Le certificat du site permet de dire : je suis bien la personne (le server dans ce cas) que je prétends être. La clef publique que tu as reçue est bien celle du server, et tout cela est certifié par une autorité de certification qui devrait être de confiance (cf plus bas )

    Citation Envoyé par kimlaw95 Voir le message
    - Le fait que mon certificat ne soit pas signé par une autorité de certification reconnue peut poser des problèmes ?
    Dans l'absolu oui. Toute personne voulant utiliser ton application devra d'abord importer la chaine de certification dans un truststore avant de pouvoir établir la connexion. Ou alors tu dois faire un truc moche qui enlève un intérêt de SSL qui est l'authentification : faire TrustManager qui accepte tout ou juste ton certificat (moins grave mais après ton appli n'acceptera que ce certificat, et si il est plus valide ou révoqué... on perd pas mal de sécurité/flexibilité). Donc pour moi, ne sachant pas comment sera distribuée ton appli, je ferais un truststore qu ej livrerais avec mon appli, celui ci contient juste les certificats de ta chaine de certification, ensuite tout certificat server signé par une CA de la chaine sera accepté de manière sécurisée.

    Citation Envoyé par kimlaw95 Voir le message
    - Quels éléments(propriétés à configurer, certificats à mettre ou? signé par qui ?) faut-il configurer pour se connecter sur un site sécurisé.
    Si tu n'as pas d'authentification client, avoir un truststore avec les certificats qui vont bien suffit...

    Quelque chose me semble bizarre dans ton code : lors de l'établissement d'une connexion SSL, tu ne reçois heureusement pas que la clef publique et surtout jamais la clef privée (sinon elle serait publique si tout le monde la recevait ). Or tu veux créer un certificat à chaque fois en extrayant les clefs, mais pourquoi ? Si ton certificat est autosigné, tu le mets dans un keystore, mais un nouveau certificat à chaque fois, je comprends pas...

  3. #3
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 129
    Points : 52
    Points
    52
    Par défaut
    Bonjour et merci pour ta réponse

    Alors si j'ai bien compris le TrustStore est pour les applications coté serveurs et sert à enregistrer les certificats des clients qui se connecte à lui et qui ont été vérifié ?

    Pour ma part, mon application est un client et non un serveur donc je me demande si il est nécessaire que j'utilise un trustStore....

    Mon application se connecte sur des sites sécurisés et j'aimerai me connecter avec mes login mot de passe (SFR EDF etc) pour y récupérer des factures par exemples . Donc je pensais que je devais générer une paire de clé et ensuite un certificat pour être accepté par le serveur est - ce le cas ?

    J'ai regarder la doc et j'ai vu une classe qui s'appelle SSLEngine qui permet de gérer le handshake avec le serveur donc je vais me pencher la dessus en attendant une réponse

    Merci
    A plus
    Ben

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par kimlaw95 Voir le message
    Bonjour et merci pour ta réponse

    Alors si j'ai bien compris le TrustStore est pour les applications coté serveurs et sert à enregistrer les certificats des clients qui se connecte à lui et qui ont été vérifié ?

    Pour ma part, mon application est un client et non un serveur donc je me demande si il est nécessaire que j'utilise un trustStore....

    Mon application se connecte sur des sites sécurisés et j'aimerai me connecter avec mes login mot de passe (SFR EDF etc) pour y récupérer des factures par exemples . Donc je pensais que je devais générer une paire de clé et ensuite un certificat pour être accepté par le serveur est - ce le cas ?

    J'ai regarder la doc et j'ai vu une classe qui s'appelle SSLEngine qui permet de gérer le handshake avec le serveur donc je vais me pencher la dessus en attendant une réponse

    Merci
    A plus
    Ben
    Salut,

    Je suis un peu perdu (et peut-être toi aussi)
    Si tu établies une connexion SSL, tu reçois le certificat du server (ie clef publique + identité), pas besoin d'en créer un...
    Un Truststore est juste un keystore qui contient les certificats de confiance (d'où le nom en fait...), c'est un nom rien de particulier niveau technique.
    Pour ce qui est du handshake etc etc, tu n'as pas besoin de le faire explicitement, il faut juste initialiser ton SSLContext si je me souviens bien. Si tu as des difficultés regarde du côté de HTTPClient (http://hc.apache.org/httpclient-3.x/sslguide.html) qui simplifie en général pas mal

    Sinon regarde comment marche le SSL, tu ne dois pas créer une paire de clef, tu reçois une clef existante du server (comme je l'ai dit c'est un concept très important de SSL qui est l'authentification, tu es assuré que la paire de clef utilisée est bien celle du server avec qui tu discutes et pas une autre).
    Ensuite bien sûr une clef AES sera créée par le protocole mais tout cela t'est égal, toi tu dis juste : les server à qui je fais confiance sont ceux là (via un keystore ou truststore contenant les certificats des servers ou les CA) et l'API fait le reste

  5. #5
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 129
    Points : 52
    Points
    52
    Par défaut
    Ok je te remercie beaucoup pour tes explications
    effectivement je suis un peu perdu
    je vais regarder ton lien et bosser un peu
    je reviendrais vers toi si j'ai des pbs
    Merci encore et bonne fin de journée.

    A plus
    Ben

  6. #6
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 129
    Points : 52
    Points
    52
    Par défaut
    Bonjour

    Merci pour toutes les infos que vous m'avez envoyées mais je pense quand même utiliser SSLEngine dans un soucis de comprendre ce qui se passe en profondeur ...

    Dans les articles et bout de livre que j'ai lus, tous parle des méthodes wrap et unwrap mais aucun n'explique clairement qu'elle sont les ByteBuffer mis en jeux

    lorsque j'appel wrap pour la première fois, je reçois un message du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    getHandshakeStatus()NEED_UNWRAP
    getStatus()OK
    bytesConsumed()0
    bytesProduced()109
    mais maintenant comment savoir quels sont les byteBuffer que je dois utiliser pour le unwrap() ?

    voici mon code :

    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
     
     
    	// Chargement du trustStore
    		KeyStore ts = utils.initKeyStore(utils.TRUSTSTORE, utils.PASSTRUSTSTORE
    				.toCharArray(), "JKS");
    		TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
    		tmf.init(ts);
     
    		// si le client n'a pas besoin de s'authentifier(pas besoin de keyStore)
    		SSLContext sslCtx = SSLContext.getInstance("TLS");
    		sslCtx.init(null, tmf.getTrustManagers(), null);
     
    		engineClient = sslCtx.createSSLEngine(utils._sfrIp, 443);
    		engineClient.setUseClientMode(true);
     
    		// Create a non-blocking socket channel
    		SocketChannel socketChannel = SocketChannel.open();
    		socketChannel.configureBlocking(false);
    		socketChannel.connect(new InetSocketAddress(utils._sfrIp, 443));
     
    		// Create byte buffers to use for holding application and encoded data
    		SSLSession session = engineClient.getSession();
    		ByteBuffer myAppData = ByteBuffer.allocate(session
    				.getApplicationBufferSize());
    		ByteBuffer myNetData = ByteBuffer.allocate(session
    				.getPacketBufferSize());
    		ByteBuffer peerAppData = ByteBuffer.allocate(session
    				.getApplicationBufferSize());
    		ByteBuffer peerNetData = ByteBuffer.allocate(session
    				.getPacketBufferSize());
     
    		myAppData.put("hello".getBytes());
    		myAppData.flip();
     
    		clientResult = engineClient.wrap(myAppData, myNetData);
    		System.out.println("getHandshakeStatus()"
    				+ clientResult.getHandshakeStatus());
    		System.out.println("getStatus()" + clientResult.getStatus());
    		System.out.println("bytesConsumed()" + clientResult.bytesConsumed());
    		System.out.println("bytesProduced()" + clientResult.bytesProduced());
     
    	}

Discussions similaires

  1. [HTTPS] connexion à un site + acceptation du certificat
    Par MaKyOtO dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 21/11/2007, 13h16
  2. Réponses: 5
    Dernier message: 01/04/2007, 20h30
  3. connexion depuis site internet vers base mysql distante
    Par Carter dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 19/09/2006, 14h24
  4. [HTMLUnit] problème de connexion à un site internet
    Par lalie.perso dans le forum Tests et Performance
    Réponses: 5
    Dernier message: 04/04/2006, 18h51
  5. Connexion sur site distant avec un client écrit en PERL ??
    Par Cygnus Saint dans le forum Modules
    Réponses: 2
    Dernier message: 07/03/2006, 11h45

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