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

Java EE Discussion :

Gestion des certificats dans une application client/serveur j2ee


Sujet :

Java EE

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2009
    Messages : 16
    Points : 24
    Points
    24
    Par défaut Gestion des certificats dans une application client/serveur j2ee
    Bonjour,

    Une petite question méthode.
    J'ai une application cliente (Swing) d'un EJB. Les EJB sont sécurisés et le client effectue un login avec la classe ProgrammaticLogin pour accéder aux EJB.
    Pour être bien "secure", la communication lors du login utilise SSL. Et donc le client dispose d'un TrustStore dans lequel le certificat du serveur (associé à un domaine Glassfish) a été importé.

    Je lance donc mon client avec une ligne de ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java -jar client.jar -Djavax.net.ssl.trustStore=cacert.jks -Djavax.net.ssl.trustStorePassword=password -Djava.security.auth.login.config=jaas.config
    et c'est dans le fichier cacert.jks que j'ai importé le certificat du serveur, avec keytool en écrivant quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    keytool -import -alias s1as -file glassfish-cert.cer -keystore cacert.jks
    où glassfish-cert.cer contient la clé publique issue du domaine glassfish.
    Cette commande demande le mot de passe du keystore du client.

    Et donc, ce que je voudrait faire, c'est réaliser cet "import" lors de la première connexion de l'application cliente avec le serveur, avec un dialogue du genre "connexion non certifiée, voulez-vous importer le certificat du serveur ?".

    Est-ce possible ? Quelles sont les pratiques les plus répandues ? Avec quelles libraries java ? Le keystore doit-il être dans le compte utilisateur, rapport aux droits d'accès ?
    Je suis preneur de tous conseils.
    merci!
    A.

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 250
    Points : 403
    Points
    403
    Par défaut
    A mon avis il faut que tu regardes du côté d' SSLContext et X509TrustManager.
    Lors d'une connexion https par exemple, il est possible de définir un X509TrustManager à l'initialisation du contexte ssl (l'objet javax.net.ssl.SSLcontext).

    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
     
        final TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
            @Override
            public void checkClientTrusted( final X509Certificate[] chain, final String authType ) {
            }
            @Override
            public void checkServerTrusted( final X509Certificate[] chain, final String authType ) {
            }
            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        } };
        final SSLContext sslContext = SSLContext.getInstance( "SSL" );
        sslContext.init( null, trustAllCerts, new java.security.SecureRandom() );
        final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
        final URLConnection urlCon = new URL( "https://blahblah.bl/" ).openConnection();
        ( (HttpsURLConnection) urlCon ).setSSLSocketFactory( sslSocketFactory );
    Dans la méthode checkServerTrusted(), si tu ne trouves pas le certificat dans ton keystore, tu peux l'importer en utilisant la classe java.security.KeyStore.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2009
    Messages : 16
    Points : 24
    Points
    24
    Par défaut
    Merci,
    j'ai un peu avancé et il me vient pas mal de questions.

    Tout d'abord dans la méthode checkTrustedServer(), j'ai mis ça:

    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
    @Override
    public void checkServerTrusted(X509Certificate[] arg0, String arg1)
    	throws CertificateException {
     
       try {
    	KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
    	keyStore.load(new FileInputStream("cacerts.jks"), "changeit".toCharArray());
    	keyStore.setCertificateEntry("s1as", arg0[0]);
    	keyStore.store(new FileOutputStream("cacerts.jks"), "changeit".toCharArray());
    	} catch (KeyStoreException e) {
    		e.printStackTrace();
    	} catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    	} catch (FileNotFoundException e) {
    		e.printStackTrace();
    	} catch (IOException e) {
                    e.printStackTrace();
    	} 
    }

    Le code ci-dessus fonctionne cad qu'il rajoute bien le certificat du serveur dans le truststore du client .

    mais j'ai du rajouter ce bout de code pour qu'il rentre dans la méthode checkServerTrusted:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((HttpsURLConnection) urlCon).getResponseCode();

    D'autre part, pour l'url de connection j'ai mis https://localhost:3820
    comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    final SSLContext sslContext = SSLContext.getInstance("SSL");
    sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
    final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
    final URLConnection urlCon = new URL("https://localhost:3820").openConnection();
    ((HttpsURLConnection) urlCon).setSSLSocketFactory(sslSocketFactory);
    or, mon EJB va être accédé via le port 3700, c'est la configuration de cet EJB qui oblige mon client à utiliser SSL . Dans mon sun-ejb-jar.xml, j'ai ceci:

    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
    <enterprise-beans>
       	<ejb>
       		<ejb-name>UploadRequestBean</ejb-name>
       		<jndi-name>fr.cnrs.mri.service.transfer.UploadRequestService</jndi-name>
       		<ior-security-config>
       			<transport-config>
       				<integrity>none</integrity>
       				<confidentiality>required</confidentiality>
       				<establish-trust-in-target>supported</establish-trust-in-target>
       				<establish-trust-in-client>none</establish-trust-in-client>
       			</transport-config>
       		        <as-context>
       			  <auth-method>USERNAME_PASSWORD</auth-method>
       				<realm>file</realm>
       				<required>true</required>
       		        </as-context>
       	         </ior-security-config>
       	</ejb>
      </enterprise-beans>
    Et si je met https://localhost:3700/ il me répond :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
    ce qui semble normal, sauf que le login lui nécessite un certificat...
    Bref je me mélange les pinceaux dans tout ça.
    Si quelqu'un peut clarifier.

Discussions similaires

  1. gestion des images dans une application Clients/Serveur
    Par frank nbf dans le forum Web & réseau
    Réponses: 1
    Dernier message: 31/08/2011, 21h53
  2. Réponses: 3
    Dernier message: 25/04/2008, 08h04
  3. Gestion des droits dans une application Java
    Par Donaldo dans le forum Langage
    Réponses: 10
    Dernier message: 14/02/2008, 18h15
  4. XML/XSL et gestion des fichiers dans une application Web
    Par fatenatwork dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 01/02/2008, 14h09
  5. Réponses: 1
    Dernier message: 10/09/2006, 13h02

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