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 <fichier.pem>
l'emplacement du certificat créé-keyout <fichier.pem>
fichier contenant la clé RSA
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
Pour convertir un certificat du format PEM vers DER par exemple :
openssl x509 -inform pem -in fichier.pem -outform der -out fichier.der
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
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.
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
# 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