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 :

certificate revocation list


Sujet :

Sécurité Java

  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    446
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 446
    Par défaut certificate revocation list
    bonjour ,
    je cherche à créer une liste de révocation puis la publier dans le LDAP mais je ne sais comment m'y prendre . quelq'un peut m'aider
    merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    Les classes de l'API standard ne permettent pas de créer des CRL (juste d'en lire), et il faut surement que tu crées toi eme la CRL à la main (ce qui est pas donné facilement... sauf si tu souhaites te plonger dasn ASN.1 et tutti quanti...)
    Je ne sais pas si Bouncy Castle le permet (Marco pourra surement t'en dire plus là dessus, faut attendre qu'il passe dans le coin...)
    D'une manière génére une CRL relève de la CA pas de la bibliothèque de crypto, car il ne faut en général pas créer une CRL comme ça, il vaut mieux un environnement un tant soit peu sûr pour le faire. Pour te donner une idée, regarde http://www.ejbca.org tu verras ce que c'est que de créer des certificats et des CRLs
    Donc je ne pense pas que Bouncy Castle le permette comme ça (ça m'étonnerait mais tout est possible).
    Pourquoi dois tu créer toi même la CRL ? Pourquoi ne pas le faire par la CA qui a émis tes certificats ? C'est ce qui doit se faire en général...

    A plus

  3. #3
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    446
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 446
    Par défaut
    en fait je voudrais modéliser ça tout seul on créant une CA puis générer la CRL pour des certificat puis la publier dans le LDAP .

  4. #4
    Invité
    Invité(e)
    Par défaut
    OK donc sit u veux créer une CA, tu vas devoir t'y coller. Trouve une codec qui gère ASN.1 (comme par exemple http://www.bouncycastle.org/ ou http://sourceforge.net/projects/codec/), lis la RFC correspondant aux CRL et voilà

    Si je peux me permettre de poser la question : pourquoi veux tu écrire ta propre CA ? A but d'exercice ? Si c'est pour de la production, tu sais qu'une CA c'est complexe et qu'il faut faire attention à beaucoup de choses pour éviter les failles qui rendrait ta PKI inutile ?

    A plus

  5. #5
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    446
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 446
    Par défaut
    en fait c'est pour exercice . donc concernant le CA et sa construction c'est symbolique mais il faut juste modéliser tout ce qui concerne création de certificat et génération de CRL par exemple .
    merci pour ta réponse

  6. #6
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Tu peux tout a fait créer des CRLs très facilement avec BouncyCastle, cf org.bouncycastle.x509.X509V2CRLGenerator.

    Très pratique pour faire des tests.

    La lecture de la RFC 3280 me parait quand même nécessaire pour comprendre ce que tu fais.

  7. #7
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Dans le même ordre d'idée pour générer des certificats X509 (v3 bien sûr) tu as org.bouncycastle.x509.x509V3CertificateGenerator.

    Exemple :

    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
     
    public static X509Certificate generateV3Certificate(KeyPair pair)
            throws InvalidKeyException, NoSuchProviderException, SignatureException
        {
            // generate the certificate
            X509V3CertificateGenerator  certGen = new X509V3CertificateGenerator();
     
            certGen.setSerialNumber(BigInteger.valueOf(System.currentTimeMillis()));
            certGen.setIssuerDN(new X500Principal("CN=Test Certificate"));
            certGen.setNotBefore(new Date(System.currentTimeMillis() - 50000));
            certGen.setNotAfter(new Date(System.currentTimeMillis() + 50000));
            certGen.setSubjectDN(new X500Principal("CN=Test Certificate"));
            certGen.setPublicKey(pair.getPublic());
            certGen.setSignatureAlgorithm("SHA256WithRSAEncryption");
     
            certGen.addExtension(X509Extensions.BasicConstraints, true, new BasicConstraints(false));
     
            certGen.addExtension(X509Extensions.KeyUsage, true, new KeyUsage(KeyUsage.digitalSignature | KeyUsage.keyEncipherment));
     
            certGen.addExtension(X509Extensions.ExtendedKeyUsage, true, new ExtendedKeyUsage(KeyPurposeId.id_kp_serverAuth));
     
            certGen.addExtension(X509Extensions.SubjectAlternativeName, false, new GeneralNames(new GeneralName(GeneralName.rfc822Name, "test@test.test")));
     
            return certGen.generateX509Certificate(pair.getPrivate(), "BC");
        }
    C'est un exemple du bouquin de David Hook, la fonction du return est dépréciée, suffit de la remplacer par generate().

  8. #8
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    446
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 446
    Par défaut
    en fait pour la génération de certificat et sa publication dans le LDAP ça marche mais il me reste comment créer un CRL et la publier dans le LDAP

  9. #9
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Ben c'est comme pour les certificats :

    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
    public static X509CRL createCRL(
            X509Certificate caCert, 
            PrivateKey      caKey, 
            BigInteger      revokedSerialNumber)
            throws Exception
        {
            X509V2CRLGenerator   crlGen = new X509V2CRLGenerator();
            Date                 now = new Date();
     
            crlGen.setIssuerDN(caCert.getSubjectX500Principal());
     
            crlGen.setThisUpdate(now);
            crlGen.setNextUpdate(new Date(now.getTime() + 100000));
            crlGen.setSignatureAlgorithm("SHA256WithRSAEncryption");
     
            crlGen.addCRLEntry(revokedSerialNumber, now, CRLReason.privilegeWithdrawn);
     
            crlGen.addExtension(X509Extensions.AuthorityKeyIdentifier, false, new AuthorityKeyIdentifierStructure(caCert));
            crlGen.addExtension(X509Extensions.CRLNumber, false, new CRLNumber(BigInteger.valueOf(1)));
     
            return crlGen.generateX509CRL(caKey, "BC");
        }
    et comme pour les certificats la fonction generateX509CRL() est dépréciée en 1.6, il faut utiliser generate().

  10. #10
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    446
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 446
    Par défaut
    merci pour l'aide qui m'est très précieuse . est ce que la liste peut etre stocker dans un fichier ou bien dans un LDAP peut importe selon vous, pour permettre à des utilisateurs de vérifier si un certificat a été revoké ou pas .

  11. #11
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Oui une CRL est en quelque sorte un certificat signé qui contient une liste de numéros de série correspondant aux certificats révoqués.

    Donc oui tu peux l'enregistrer dans un fichier, sous windows en lui donnant l'extension .crl tu peux accéder à une fenêtre spécifique de l'OS permettant de lire les CRL. Pour les certificats X.509 c'est pareil avec l'extension .cer .

    Ca se fait aussi sur LDAP bien sûr, mais de ce que j'ai pu voir ça peut être plus pratique d'avoir ça sur un serveur web et d'y accéder par HTTP (plus simple). Comme les CRL sont des données publiques (ou du moins il n'y a pas de raisons qu'elles ne le soient pas) ça ne pose aucun problème de sécurité. Me corriger si je dis des boulettes plz j'ai pas non plus beaucoup d'expérience sur la sécurité

  12. #12
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    446
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 446
    Par défaut
    je pense qu'il est préférable de les publier dans un LDAP et c'est là que je bloque
    sur la stucture .
    mais est ce que la CRL doit etre une propriété d'une CA , ou bien je peux les stocker sans me soucier de ça.

  13. #13
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Citation Envoyé par gentelmand Voir le message
    je pense qu'il est préférable de les publier dans un LDAP
    Pourquoi ça serait mieux que HTTP ?

    Citation Envoyé par gentelmand Voir le message
    mais est ce que la CRL doit etre une propriété d'une CA , ou bien je peux les stocker sans me soucier de ça.
    Du moment qu'avec la valeur de la CRL tu puisses instancier ton objet dans ton programme java ...

    Après je sais plus comment ça marche LDAP, j'ai pas travaillé longtemps dessus et la PKI sur laquelle je me connectais n'utilisait LDAP que pour déposer les certificats des correspondants mais pour les CRLs c'était via HTTP et c'était bien plus pratique. Yavait des CRLs obsolètes et il me semble bien qu'elles étaient comprises dans la branche correspondante mais en tant que noeud à part entière (yavait plusieurs autorités intermédiaires, et donc une CRL par AI).

  14. #14
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    446
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 446
    Par défaut
    quand j'ai dis préférable c'est au moins dans mon cas , puisque la recherche dans le LDAP est facile vu la structure arborescente .

  15. #15
    Invité
    Invité(e)
    Par défaut
    Pour stocker une CRL dans un annuaire LDAP, utilise un attribut de type tableau d'octets.
    Il n'est pas nécessaire de sérialiser un objet Java, mais tu peux stocker ta structure encodée ASN.1 directement comme un tableau d'octet. Les classes Java permettent ensuite de créer un objet CRL à partir de ce flux. L'avantage est que c'est indépendant de la technologie utilisée et que n'importe qui peut lire ta CRL, alors que si tu sérialises un objet Java, il te faudra une appli Java connaissant cette version de la classe CRL pour pouvoir la lire.

  16. #16
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    446
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 446
    Par défaut
    tu n'as pas un exemple de stockage d'une CRL dans un LDAP

  17. #17
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    La méthode getEncoded() de java.security.cert.Certificate te retourne un tableau de byte qui est en fait le flux ASN.1 du certificat/CRL encodé en DER.

    Instancier une CRL ou certificat se fait avec les méthodes generateXXX() de CertificateFactory prenant en argument un InputStream quelconque.

    Pour le postage d'un attribut sur un annuaire LDAP je suis certain qu'en faisant une recherche sur le forum tu vas trouver.

  18. #18
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    446
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 446
    Par défaut
    j'ai essayé le code mais juste j'ai modifié le type du certificat mais j'ai l'exception org.bouncycastle.asn1.DERSequence cannot be cast to org.bouncycastle.asn1.ASN1OctetString
    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
    public static X509CRL createCRL(javax.security.cert.X509Certificate caCert,PrivateKey caKey) throws InvalidKeyException, NoSuchProviderException, SecurityException, SignatureException
        {
        X509V2CRLGenerator   crlGen = new X509V2CRLGenerator();
        Date now = new Date();
       System.out.println(caCert.getSubjectDN().toString()); 
        crlGen.setIssuerDN(new X509Name(caCert.getSubjectDN().toString()));
        //caCert.getSubjectX500Principal());
     
        //crlGen.setIssuerDN((X500Principal) caCert.getSubjectDN());
        crlGen.setThisUpdate(now);
        crlGen.setNextUpdate(new Date(now.getTime() + 900000));
        crlGen.setSignatureAlgorithm("SHA256WithRSAEncryption");
     
        crlGen.addCRLEntry(caCert.getSerialNumber(), now, CRLReason.privilegeWithdrawn);
     
     
    		//crlGen.addExtension(X509Extensions.AuthorityKeyIdentifier, false, new AuthorityKeyIdentifierStructure(caCert.getEncoded()));
     
        crlGen.addExtension(X509Extensions.CRLNumber, false, new CRLNumber(BigInteger.valueOf(1)));
        X509CRL crl = null;
    	try {
    		crl = crlGen.generate(caKey, "BC");
    	} catch (CRLException e) {
    		// TODO Auto-generated catch block
    		System.out.println("erreur crl"+e.getMessage() );
    	} catch (IllegalStateException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	} catch (NoSuchAlgorithmException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
        return crl ;
    }
    comment je peux corriger ça

  19. #19
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Le type de certificat ? Comprends pas.

    Je sais pas quoi te dire, le code de base s'exécute correctement ?

  20. #20
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    446
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 446
    Par défaut
    oui le code de base s'éxécute normalement mais étant donné que j'utilise les certificat de javax j'avais des exceptiion

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/09/2009, 10h26
  2. Réponses: 8
    Dernier message: 16/11/2007, 13h47
  3. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25
  4. Compter le nombre ligne listée (COUNT) ?
    Par StouffR dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/09/2002, 09h41
  5. Listes déroulantes liées entre elles
    Par denisC dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 27/07/2002, 15h53

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