======OpenSSL======
=====Signer un certificat=====
Pour générer un certificat (par exemple pour Apache) :
openssl req -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache/ssl/apache.pem
* ''req'' request
* ''-new'' création d'un nouveau certificat
* ''-x509'' utilisation de X.509 (clé publique PKI)
* ''-days 365'' validité du certificat de 1 an
* ''-out '' l'emplacement du certificat créé
* ''-keyout '' fichier contenant la clé RSA
=====Afficher des informations=====
Il faut d'abord connaitre le format du certificat à lire : on utilise ''-inform '' pour le définir ; les formats étant PEM, DER ou NET. Dans les exemples ci-dessous, on n'utilisera que le format PEM (par défaut donc implicite) pour simplifier les lignes de commande.
Lire les informations d'un fichier local :
# afficher le contenu de la requête
openssl req -noout -text -verify -in request.csr
# ou en plus court
openssl req -noout -subject -verify -in request.csr
# afficher l'ensemble des infos du certificat
openssl x509 -noout -in fichier.pem -text
# afficher toutes les infos sauf la signature chiffrée
openssl x509 -noout -in fichier.pem -text -certopt no_sigdump
# afficher uniquement le sujet, l'email, le numéro de série ou les dates de validité (début/fin)
openssl x509 -noout -in fichier.pem -subject
openssl x509 -noout -in fichier.pem -email
openssl x509 -noout -in fichier.pem -serial
# 2 équivalents :
openssl x509 -noout -in fichier.pem -dates
openssl x509 -noout -in fichier.pem -startdate -enddate
# pas d'option pour afficher directement le CN ; il faut filtrer manuellement le résultat :
openssl x509 -noout -in fichier.pem -subject | sed -e 's/^.*CN=//' -e 's/\/.*$//'
# afficher uniquement les extensions x509v3
# (on est d'accord qu'il faudra sûrement un coup de grep/awk/sed derrière...)
openssl x509 -noout -in fichier.pem -text -certopt \
no_subject,no_header,no_version,no_serial,no_signame,no_validity,no_subject,no_issuer,no_pubkey,no_sigdump,no_aux
Pour un site web (distant) donné :
openssl s_client -connect google.fr:443 | openssl x509 -noout -text
=====Convertir un certificat=====
Pour convertir un certificat du format PEM vers DER par exemple :
openssl x509 -inform pem -in fichier.pem -outform der -out fichier.der
=====Vérifier si un certificat est révoqué=====
Un certificat peut être invalide s'il n'est pas signé par une CA reconnue, s'il est expiré (ou pas encore valide :D), et s'il a été révoqué. Pour vérifier ce dernier cas il faut récupérer le numéro de série du certificat et vérifier s'il n’apparaît pas dans la liste de révocation (CRL) de la CA. En très sale ça donnerait ceci :
# on récupère le numéro de série du certificat à tester
SN=$(openssl x509 -noout -in louche.pem -serial | cut -d"=" -f2)
# rechercher son occurence dans la liste de révocation
openssl crl -noout -text -in crl.pem | grep -A1 "Serial Number: $SN"
Si le certificat est révoqué ça nous retournera quelque chose du style :
Serial Number: 0007
Revocation Date: Nov 6 14:23:40 2017 GMT
=====Révoquer un certificat=====
A faire sur la CA évidemment ; cela permet d'invalider un certificat qui n'a pas atteint sa date d'expiration.
openssl ca -config openssl.cnf -revoke fired-employee.pem
Puis il faut re-générer la CRL.
=====Création de la CRL=====
La liste de révocation et un fichier signé par la CA, qui contient tous les certificats révoqués ; il est à mettre à disposition de tous afin que chacun puisse connaître et rejeter les certificats qui ont été révoqués.
openssl ca -config openssl.cnf -gencrl -out crl.pem
=====Revalider un certificat révoqué=====
# Récupérer son SN
SN=$(openssl x509 -noout -in revalid-cert.pem -serial | cut -d"=" -f2)
# Vérifier que le certificat figure dans l'index et que c'est bien le bon
grep -n "$SN" index.txt
666:R 301119144232Z 240916120752Z 149F unknown /C=FR/ST=75/L=PARIS/O=BIGCORP/OU=DSI/CN=KALILIN/emailAddress=notfired-dude@bigcorp.com
# Modifier le flag "R" (revocked) par "V" (valid), et (optionnel je crois) remplacer le 3e champ (codant la date de révocation) par une tabulation
sed -i -e '/'$SN'/s/^R/V/' -e '/'$SN'/s/240916120752Z/\t/' index.txt
#V 301119144232Z 149F unknown /C=FR/ST=75/L=PARIS/O=BIGCORP/OU=DSI/CN=KALILIN/emailAddress=notfired-dude@bigcorp.com
# Regénérer la CRL
openssl ca -config openssl.cnf -gencrl -out crl.pem