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
Version imprimable
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
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
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 .
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
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
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.
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 :
C'est un exemple du bouquin de David Hook, la fonction du return est dépréciée, suffit de la remplacer par generate().Code:
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"); }
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
Ben c'est comme pour les certificats :
et comme pour les certificats la fonction generateX509CRL() est dépréciée en 1.6, il faut utiliser generate().Code:
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"); }
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 .
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é :)
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.
Pourquoi ça serait mieux que HTTP ?
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).
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 .
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.
tu n'as pas un exemple de stockage d'une CRL dans un LDAP
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.
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
comment je peux corriger çaCode:
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 ; }
Le type de certificat ? Comprends pas.
Je sais pas quoi te dire, le code de base s'exécute correctement ?
oui le code de base s'éxécute normalement mais étant donné que j'utilise les certificat de javax j'avais des exceptiion