Table of Contents

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

Afficher des informations

Il faut d'abord connaitre le format du certificat à lire : on utilise -inform <FORMAT> 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