Révocation

Niveau : Star Star Star Star Empty
Résumé : openssl

Véri­fi­ca­tion

Main­te­nant que nous avons des cer­ti­fi­cats pro­pres et bien signés il va fal­loir les véri­fier. Mais il ne s’agit pas sim­ple­ment de véri­fier que le cer­ti­fi­cat est valide et signé par une auto­rité de con­fiance. Tout d’abord, il fautde véri­fier toute sa chaine de con­fiance. Ensuite il faut véri­fier ses exten­sions, par exem­ple s’il va être uti­lisé pour les usa­ges aux­quels on l’a prévu.

Openssl per­met de faire la véri­fi­ca­tion de la chaine de cer­ti­fi­ca­tion ainsi que la véri­fi­ca­tion de l’usage. Pour cela il faut ins­tal­ler l’auto­rité de con­fiance :

# On trouve le hash du certificat de l'AC
$ hash=$(openssl x509 -hash -noout -in cacert.pem)
# On installe l'AC en utilisant ce hash (il faut être root ici)
$ cp cacert.pem /etc/ssl/certs/$hash.0

Du coup la véri­fi­ca­tion d’un cer­ti­fi­cat se fait sim­ple­ment :

$ openssl verify -purpose sslclient certificat.crt

Pour la véri­fi­ca­tion des exten­sions, il faut voir au cas par cas.

Mais con­trai­re­ment à ce qu’on pense sou­vent, ce n’est pas tout. Il faut aussi véri­fier que le cer­ti­fi­cat n’est pas révo­qué, c’est-à-dire inva­lidé avant la date limite.

Révo­ca­tion

La révo­ca­tion d’un cer­ti­fi­cat se fait dans plu­sieurs cas :

  • perte de la clé
  • départ du pro­prié­taire de la clé
  • renou­vel­le­ment de la clé

En gros à cha­que fois qu’on veut garan­tir que la clé ne sera plus uti­li­sée.

Pour révo­quer un cer­ti­fi­cat alors qu’on a ins­tallé une AC openssl comme dans l’arti­cle pré­cé­dent :

# On en profite pour indiquer pourquoi on le révoque
# les raisons possibles sont : unspecified, keyCompromise, CACompromise,
#   affiliationChanged, superseded, cessationOfOperation, certificateHold or removeFromCRL
$ openssl ca -config openssl.cnf -revoke client.cert -crl_reason keyCompromise

Il existe 2 méca­nis­mes pour faire savoir au monde qu’on a révo­qué un cer­ti­fi­cat : les CRL et le pro­to­cole OCSP.

Cer­ti­fi­cate Revo­ca­tion List

Une liste de révo­ca­tion est une liste com­plète de cer­ti­fi­cats révo­qués qu’on télé­charge. On com­pare ensuite le cer­ti­fi­cat à véri­fier à cette liste pour savoir si le cer­ti­fi­cat n’a pas été révo­qué.

Cette liste est signée par l’auto­rité de cer­ti­fi­ca­tion pour garan­tir qu’elle est valide. Au pas­sage elle est aussi datée. Avec openssl elle se gère de la même façon que l’auto­rité de cer­ti­fi­ca­tion, avec le même fichier de con­fi­gu­ra­tion. Repre­nons le fichier de con­fi­gu­ra­tion de l’AC et ajou­tons-y les spé­ci­fi­ci­tés des CRL.

[ Peck_authority ]
# Numéro de série pour les CRL
crlnumber       = $dir/crlnumber

# Durée au dela de laquelle la CRL doit être mise à jour
default_crl_days= 30

# Ajouter des extensions à la CRL
crl_extensions        = crl_ext

[ crl_ext ]

# issuerAltName=issuer:copy
authorityKeyIdentifier=keyid:always,issuer:always

On sto­cke les iden­ti­fiants de crl :

$ echo "00" > ./peckCA/crlnumber

Après avoir révo­qué un cer­ti­fi­cat (voir plus haut) géné­rons la CRL :

$ openssl ca -config openssl.cnf -gencrl -out crl.list

Lisons le con­tenu de cette liste pour véri­fier :

$ openssl crl -in crl.list -text

On peut ensuite véri­fier que le cer­ti­fi­cat est révo­qué ou non avec openssl en dis­po­sant de la CRL :

# Option non documentée
$ openssl verify -CAfile crl.list -crl_check client.cert

Pour le faire auto­ma­ti­que­ment, il faut ins­tal­ler la CRL de la même façon qu’on a ins­tallé le cer­ti­fi­cat de l’AC :

# Notez l'usage de r0 à la place de 0
$ hash=$(openssl x509 -hash -noout -in crl.list)
$ cp crl.list /etc/ssl/certs/$hash.r0
# Et on vérifie la révocation en même temps que la validité
$ openssl verify -crl_check client.cert

Pour ne pas devoir met­tre à jour les CRL à la main chez tous les clients, il faut la publier. Pour cela, il faut d’abord la con­ver­tir, en effet, les clients tra­di­tion­nels comme fire­fox lisent la ver­sion DER (binaire) et non PEM (ascii).

$ openssl crl -inform PEM -in crl.list -outform DER -out crl.der
# puis placez-la sur votre serveur

Et pour que le client sache où aller cher­cher cette CRL, il faut l’indi­quer dans le cer­ti­fi­cat lorsqu’on le signe :

# Dans la openssl.cnf, utilisé lors de la signature de demandes
[ usr_cert ]

# Les url en http et en ldap sont autorisées
crlDistributionPoints           = URI:http://localhost/ca-crl.pem

Mal­heu­reu­se­ment, openssl ne sait pas aller cher­cher tout seul la crl pour faire cette véri­fi­ca­tion.

Enfin notez qu’il existe aussi des exten­sions del­ta­CR­Lin­di­ca­tor et Fre­shest­CRL qui per­met­tent de ne pas télé­char­ger toute la CRL à cha­que fois. Mais elles ne sont pas sup­por­tées par openssl.

Online Cer­ti­fi­cate Sta­tus Pro­to­col

Le pro­blème des CRL est qu’il néces­site un télé­char­ge­ment plus ou moins lourd pour faire une seule véri­fi­ca­tion. C’est tout aussi péna­li­sant pour l’AC que pour le client. C’est pour­quoi un pro­to­cole a été inventé pour per­met­tre de faire une véri­fi­ca­tion au cas par cas.

Il per­met de véri­fier si un uni­que cer­ti­fi­cat est révo­qué. Il a aussi l’avan­tage de ne pas dépen­dre de la date de vali­dité des CRL qui sont géné­rées et rechar­gées sur des pério­des plus ou moins lon­gues. Ici on a direc­te­ment la bonne infor­ma­tion.

Lan­çon un ser­veur OCSP sur notre AC fraî­che­ment créée. Pour faire rapide nous uti­li­sons le cer­ti­fi­cat de l’AC pour lan­cer le ser­vice, mais pour faire pro­pre, nous aurions du lui créer un cer­ti­fi­cat spé­ci­fi­que signé par l’AC et ayant l’exten­sion “exten­ded­KeyU­sage=OCSP­Si­gning” :

# Il n'y a pas de port par défaut pour OCSP
$ openssl ocsp -index /srv/Authority/index.txt -CA /srv/Authority/cacert.pem -rsigner /srv/Authority/cacert.pem -rkey /srv/Authority/private/cakey.pem -port 1234

Véri­fions ensuite si un cer­ti­fi­cat est révo­qué. Notez qu’il est néces­saire de pré­ci­ser le cer­ti­fi­cat ayant signé celui qu’on veut véri­fier :

# Attention, précisez -issuer avant -cert
# Il est possible de vérifier plusieurs certificats d'un coup avec plusieurs -cert
$ openssl ocsp -host localhost:1234 -issuer /srv/Authority/cacert.pem -cert certificat.crt

Tout comme pour les CRL, il est pos­si­ble d’indi­quer dans le cer­ti­fi­cat l’endroit où se trouve le ser­veur OCSP per­met­tant de véri­fier la révo­ca­tion. Les appli­ca­tion qui sup­por­tent (pas openssl veri­fiy) l’exten­sion vont alors auto­ma­ti­que­ment la véri­fier :

# Dans la openssl.cnf, utilisé lors de la signature de demandes
[ usr_cert ]

authorityInfoAccess = OCSP;URI:http://ocsp.my.host/
Vus : 287
Publié par Peck : 100