Récupérer CRL via LDAP

Résolu
bond_never_die Messages postés 38 Date d'inscription lundi 16 mai 2005 Statut Membre Dernière intervention 15 janvier 2009 - 22 mai 2008 à 10:20
foster06 Messages postés 2 Date d'inscription lundi 28 février 2005 Statut Membre Dernière intervention 15 janvier 2009 - 15 janv. 2009 à 18:18

7 réponses

bond_never_die Messages postés 38 Date d'inscription lundi 16 mai 2005 Statut Membre Dernière intervention 15 janvier 2009
22 mai 2008 à 16:26
C'est bon j'ai fini par trouver :

InputStream inStream = new ByteArrayInputStream(cps);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
crl = (X509CRL)cf.generateCRL(inStream);
3
bond_never_die Messages postés 38 Date d'inscription lundi 16 mai 2005 Statut Membre Dernière intervention 15 janvier 2009
22 mai 2008 à 10:21
Bonjour,
Bon visiblement mon message n'est pas passé...
Je disais ^^ :
je travaille actuellement sur un projet et je suis confronté à un problème :
Comment récupérer un CLR (Certificate Revocation List) via LDAP et faire ensuite une recherche dans ce CRL pour y vérifier la présence éventuelle d'un identifiant de certificat ?
Je n'ai pas la moindre idée de comment faire ça, pour l'instant j'ai juste essayé d'ouvrir une connexion ldap avec jndi mais aucun résultat probant puisque tout ce que j'obtiens est une exception java... Je vous met quand même mon code :

package ldaptest;
 
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
 
public class LdapTest {
    public static void main(String[] args) {
        Hashtable<String, String> env = new Hashtable<String, String>();
 
        env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, "ldap://annuaire.gip-cps.fr/ou=ac-classe-1,o=gip-cps,c=fr?certificateRevocationList;binary");
        env.put(Context.SECURITY_AUTHENTICATION, "none");
        env.put(Context.SECURITY_PRINCIPAL, "ou=ac-classe-1,o=gip-cps,c=fr");
        DirContext ctx = null;
        NamingEnumeration<?> results = null;
        try {
            ctx = new InitialDirContext(env);
            SearchControls controls = new SearchControls();
            controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
            results = ctx.search("", "(certificateRevocationList;binary=*)", controls);
            while (results.hasMore()) {
                SearchResult searchResult = (SearchResult) results.next();
                Attributes attributes = searchResult.getAttributes();
                Attribute attr = attributes.get("certificateRevocationList;binary");
                String cps = (String) attr.get();
                System.out.println(" CRL = " + cps);
            }
        } catch (NamingException e) {
            throw new RuntimeException(e);
        } finally {
            if (results != null) {
                try {
                    results.close();
                } catch (Exception e) {
                }
            }
            if (ctx != null) {
                try {
                    ctx.close();
                } catch (Exception e) {
                }
            }
        }
    }
}


et l'exception que j'obtiens :

Exception in thread "main" java.lang.ClassCastException: [B cannot be cast to java.lang.String
at ldaptest.LdapTest.main(LdapTest.java:33)
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
22 mai 2008 à 10:38
Salut:

Il se peut que l'attribut "certificateRevocationList;binary" n'admet pas une seule valeur.

Essayes d'énumérer les différentes valeurs de cette attribut:

Attribute attr = attributes.get("certificateRevocationList;binary");

NamingEnumeration valueEnum = attr.getAll();
while (valueEnum.hasMore()) {
    Object value = valueEnum.next();
    System.out.println(value);
}
0
bond_never_die Messages postés 38 Date d'inscription lundi 16 mai 2005 Statut Membre Dernière intervention 15 janvier 2009
22 mai 2008 à 11:27
J'ai essayé ce que tu me dis, ça marche mieux puisque je n'ai plus d'exception et j'obtiens comme résultat :

[B@337838

J'ai aussi essayé comme ça :

Attribute attr = attributes.get("certificateRevocationList;binary");
byte [] cps = (byte []) attr.get();
for (int i=0;i<cps.length;i++) System.out.print(Integer.toHexString(cps [i]));

Ce qui me donne :

30ffffff8214f30ffffff81ffffffb921130d692affffff8648ffffff86fffffff7d1155030353
1b3096355461324652311030e63554a1374749502d4350533114301263554b13b41432d434c415
353452d3117d3038303532323032303032355a17d3038303532383032303032355a300ffffffa0
4e304c301f63551d234183016ffffff801425ffffff992fffffff8a0195371f70ffffff83fffff
fbe2e2c1c7a656ffffff9f4830b63551d144422930301c63551d124153013ffffff811161632d6
76970406769702d6370732e667230d692affffff8648ffffff86fffffff7d115503ffffff81fff
fff8107fffffffd62177ffffffe02175ffffffa0ffffffa1fffffffc5fffffffee136dffffffc1
47ffffff9effffff94234948ffffffc9ffffff8cffffffef5effffff8f6e3e1c69ffffffb65a13
40ffffff92c492c39ffffffdcffffffc7ffffff89235bffffffdffffffff12cfffffff56afffff
ff6ffffffd8ffffffd1ffffffc0ffffffb72cffffff9d60ffffffadfffffff46e59ffffffa712f
fffffdb44479ffffffa22fffffffdd7a69fffffff574ffffff99ffffffcfffffff86ffffffc9ff
ffffa5ffffffe3ffffffe3ffffffb0ffffffa254ffffff931fffffffc9ffffffedffffffae603f
fffff8cffffffc6ffffff8f3852ffffff92705949ffffffc7ffffffc9337affffffec61ffffffb
cffffffa432ffffffef84e4f284bffffffb6fffffffaf291d5d545f6531ffffffe1ffffffadfff
fffbd

Ce qui est peut-être un peu plus probant (?)...
Toutefois ça ne me donne pas de liste de révocation (enfin je ne pense pas) et je ne sais pas comment exploiter ce résultat...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
foster06 Messages postés 2 Date d'inscription lundi 28 février 2005 Statut Membre Dernière intervention 15 janvier 2009
15 janv. 2009 à 11:37
Bonjour,


je viens vers toi car le code que tu as déjà mis m'interresse. Je dois vérifier lors d'une connexion avec carte CPS que le certificat ne fait pas parti de la la liste de révocation contenu dans le fichier crl chargé tous les jours et enregistré sur un serveur Linux.


Malheureusement, je suis newbie en java et je ne comprend pas trop le code.


Je pense avoir compris que tu charge au départ le CRL directement sur l'annuaire gip-cps.


Puis a chaque ligne récupérée, tu le transformes en un crl (via (X509CRL)...


Ensuite, comment testes-tu que ton certificat courant ne fait pas partie de la liste CRL ?


Comment récupérer la ligne sans aller la chercher sur le site du GIP-CPS mais dans le fichier CRL chargée sur le serveur (pour aller plus vite)


Merci d avance de ta reponse


 


 


 
0
bond_never_die Messages postés 38 Date d'inscription lundi 16 mai 2005 Statut Membre Dernière intervention 15 janvier 2009
15 janv. 2009 à 14:22
Salut,
désolé de ne pas pouvoir trop t'aider mais j'ai terminé ce projet il y a maintenant plus de 7 mois et j'avoue ne plus trop me souvenir des détails, d'autant que je n'ai presque pas refait de java depuis et que je ne suis plus dans l'entreprise (donc plus accès aux sources).

Toutefois, de ce que je me souviens, j'ai moi aussi fini par utiliser un certificat stoqué sur le serveur, plutôt que de le récupérer en LDAP. Je ne me souviens plus de mon code mais, en utilisant quelque chose de ce style :

InputStream inStream = newFileInputStream("C:\monfichier.crl");
CertificateFactory cf = CertificateFactory.getInstance("X.509");
crl = (X509CRL)cf.generateCRL(inStream);

Ensuite, regarde la javadoc http://java.sun.com/javase/6/docs/api/java/security/cert/X509CRL.html pour savoir comment utiliser un crl, perso je ne sais plus trop, si ce n'est qu'il faut récupérer le certificat X509 présent sur la CPS, créer un objet java X509Certificate avec, et le comparer au contenu de la CRL (procédure qui prend pas mal de temps si je me souviens bien, vu la taille des CRL du gip-cps...).

Voilà, en espérant que ça t'aide...

Si tu as d'autres question n'hésite pas !
Bon courage,
A+
0
foster06 Messages postés 2 Date d'inscription lundi 28 février 2005 Statut Membre Dernière intervention 15 janvier 2009
15 janv. 2009 à 18:18
Merci beaucoup de ton aide.
Je vais essayer de me débrouiller car tu m'as déjà donné pas mal d'infos, ce qui me permettra de chercher directement dans les bonnes doc.

Bonne année 2009.
@+
0
Rejoignez-nous