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

Langage Java Discussion :

Problème d'accès à un fichier keystore dans un jar de mon appli


Sujet :

Langage Java

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 113
    Points : 65
    Points
    65
    Par défaut Problème d'accès à un fichier keystore dans un jar de mon appli
    Bonjour à tous,

    Je développe actuellement une application sous weblogic 8.1. Mon application est composée de différents modules dont un s'appellant Framework.
    Lors du built de l'application, ce module framework est transformé en .jar, et est inclu dans l'ear de l'application.

    Dans ce module, une classe permet la connection à un serveur LDAPS.
    Dans mon code j'ai donc la ligne suivante qui permet d'aller chercher mon fichier keystore:
    System.setProperty("javax.net.ssl.trustStore", "Chemin du pap.keystore");

    Actuellement mon module est organisé comme suit:

    -Framework
    **-conf
    ***L pap.keystore
    **-fr
    ***-pap
    ****-entreprise
    *****-connecteur
    ******+bd
    ******+jms
    ******+jndi
    ******-ldap
    *******L AccesseurLDAP.java

    Mon problème est que je n'arrive pas à accèder à mon fichier pap.keystore.
    Pour le paramètre "Chemin du xxx.keystore" qui doit être un string, j'ai testé les solutions suivantes:
    - ../../../../../conf/pap.keystore
    - /conf/pap.keystore
    - une solution avec final URL pathKeystore = AccesseurLDAP.class.getClassLoader().getResource("pap.keystore");
    Si je fais pathKeystore.getFile() ou pathKeystore.getPath(), je trouve bien le chemin correct, mais comme tout se passe dans un jar, dans le chemin j'ai .../Framework.jar!/conf/pap.keystore et ca me marche pas non plus.

    Je ne sais que faire pour accéder a ce fichier.
    Pouvez vous m'aider?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il suffit d'utiliser directement la méthode openStream() d'URL pour lire le fichier directement à l'intérieur du Jar, ou carrément d'utiliser getResourceAsStream().

    Tu obtiendras ainsi un InputStream contenant le contenu du fichier...

    a++

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 113
    Points : 65
    Points
    65
    Par défaut
    Merci pour ta réponse.
    Comme je l'ai mentionné, le System.setProperty("javax.net.ssl.trustStore", "Chemin du pap.keystore"); prend 2 string en paramètre.
    Le 2eme doit être le chemin et non pas le contenu, donc avec ta solution on obtient un InputStream... qui n'est pas un string reprèsentant le chemin.

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par critok
    Comme je l'ai mentionné, le System.setProperty("javax.net.ssl.trustStore", "Chemin du pap.keystore"); prend 2 string en paramètre.
    Le 2eme doit être le chemin et non pas le contenu, donc avec ta solution on obtient un InputStream... qui n'est pas un string reprèsentant le chemin.
    Oups je n'avais pas bien compris ton problème...

    Dans ce cas là tu as deux possibilité :
    • Soit la propriété "javax.net.ssl.trustStore" accepte des URLs, et là tu place l'URL complète qui t'es envoyé par getResource().
    • Soit la propriété "javax.net.ssl.trustStore" n'accepte que des chemins sur le systèmes de fichiers, et dans ce cas là tu es obligé d'extraire le fichier du jar pour le copier sur le système de fichier...


    a++

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 113
    Points : 65
    Points
    65
    Par défaut
    la methode setProperty n'accepte malheureusement pas les URL, uniquement un string du chemin.

    Pourrez tu développer ton idée selon laquelle il faudrais extraire le fichier?
    Sachant qu'il faut une solution tout de meme propre, et facile à déployer pour le client (nous livrons uniquement un ear)

    Merci

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par critok
    lPourrez tu développer ton idée selon laquelle il faudrais extraire le fichier?

    1. Créer un fichier temporaire, et le "marquer" afin qu'il soit supprimé automatiquement à la fin du programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		// On crée un fichier temporaire :
    		File trustFile = File.createTempFile("trustStore", ".keystore");
    		// On marque le fichier afin qu'il soit détruit à la fin du programme :
    		trustFile.deleteOnExit();
    2. Copier le contenu de l'URL représentant ton fichier dans le jar dans ce fichier temporaire :
    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
    		// On copie depuis l'URL dans le fichier temporaire :
    		InputStream in = url.openStream();
    		try {
    			FileOutputStream out = new FileOutputStream(trustFile);
    			try {
    				byte[] buf = new byte[8192];
    				int len;
     
    				while ( (len=in.read(buf))>-1) {
    					out.write(buf, 0, len);
    				}
    			} finally {
    				out.close();
    			}
    		} finally {
    			in.close();
    		}
    3. Définir ce fichier temporaire comme trustStore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.setProperty("javax.net.ssl.trustStore", trustFile.getAbsolutePath());
    a++

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 113
    Points : 65
    Points
    65
    Par défaut
    Merci pour ta proposition qui marche nikel.
    Cepandant j'ai quelques questions:

    1) Le fichier temporaire créé porte un numèro unique, genre pap129563.keystore. A chaque fois que mon client se connecte à l'interface, l'application appelle ma mèthode ou se trouve le code que tu m'as donné. Donc il génére un fichier temporaire unique. J'ai remarqué que le trustFile.deleteOnExit() permet de supprimer le fichier, mais uniquement à l'extinction de weblogic sur le serveur, se qui arrive très rarement voir jamais en production. Sachant que j'ai 300 connections mini par jour et que l'on éteind jamais le serveur, le nombre de fichier va être colossal. Et-il possible de créer un fichier temporaire portant le même nom 'pap.keystore' au lieu d'un pap11671.keystore et je pourrais faire un .exist() afin de ne pas recréer le fichier à chaque connection de l'utilisateur.

    2) Sachant que nous developpons sous xp, le fichier temporaire est créé sous C:\Documents and Settings\xxx\Local Settings\Temp
    Qu'en sera t'il sous unix?

    Merci à toi.

  8. #8
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par critok
    Sachant que j'ai 300 connections mini par jour et que l'on éteind jamais le serveur, le nombre de fichier va être colossal.
    Pour moi ce code n'est exécuté qu'une seule fois au démarrage de l'application...

    Citation Envoyé par critok
    Et-il possible de créer un fichier temporaire portant le même nom 'pap.keystore' au lieu d'un pap11671.keystore et je pourrais faire un .exist() afin de ne pas recréer le fichier à chaque connection de l'utilisateur.
    Oui tout à fait, mais il faut que tu gère toi même le répertoire temporaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	File tempDir = new File( System.getProperty("java.io.tmpdir") );
    	File trustFile = new File(tempDir, "pap.keystore");
    Citation Envoyé par critok
    2) Sachant que nous developpons sous xp, le fichier temporaire est créé sous C:\Documents and Settings\xxx\Local Settings\Temp
    Qu'en sera t'il sous unix?
    La méthode createTempFile() utilise la propriété "java.io.tmpdir" qui correspond au répertoire temporaire par défaut du système. Sous Unix il me semble que cela renvoi /tmp (cela peut peut-être posé des problème de sécurité ?).

    Au pire il suffit de déterminer un autre emplacement via un fichier de config...

    a++

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 113
    Points : 65
    Points
    65
    Par défaut
    Finalement nous avons trouvez une solution afin de supprimmer le fichier créé temporairement a la deconnection de la verification ldaps.

    Je te remercie pour ton aide!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'accès à un fichier source dans un jar
    Par maha.mahouta dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 30/10/2014, 14h47
  2. ressource dans le jar de mon appli
    Par laclac dans le forum Langage
    Réponses: 4
    Dernier message: 18/04/2007, 16h36
  3. [Jar] Problème d'accès à des fichiers
    Par GLDavid dans le forum Langage
    Réponses: 2
    Dernier message: 31/10/2006, 15h51
  4. Probléme d'accès sur fichier PARADOX
    Par Debure dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/01/2006, 13h34
  5. [langage] Problème de taille de fichier à mettre dans
    Par And_the_problem_is dans le forum Langage
    Réponses: 10
    Dernier message: 13/08/2002, 09h41

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