Maîtriser les certificats avec OpenSSL

Cet article a pour but de vous présenter les différentes possibilités offertes par l’outil Open Source qu’est openSSL. Cet outil puissant et incontournable doit être maîtrisé pour gérer correctement ses certificats.

Gestion d’une Autorité de Certification (CA ou AC en français)

 Générer une clé RSA 2048 bits et protection de cette clé par chiffrement AES 256

# openssl genrsa -aes256 -out private/CA.key 2048

genrsa : Directive pour générer des clés privées
aes256 : Chiffre la clé privée en AES 256
out : Enregistre la clé privée RSA 2048 bits chiffrée en AES 256 dans le fichier passé en paramètre
2048 : Nombre de bits de la clé privée

Créer une Autorité de Certification racine (‘CA ROOT’) autosignée

# openssl req -new -x509 -sha256 -days 3650 -key private/CA.key -out certs/CA.pem

req : Directive de gestion des requêtes de certificats
new : Génère une nouvelle demande de certificat
x509 : Génère un certificat autosigné
days : Détermine la période de validité du certificat si l’option x509 est spécifiée (30j par défaut)
key : Utilise la clé contenue dans le fichier passé en paramètre
out : Enregistre dans le fichier passé en paramètre le résultat

Révoquer un certificat

# openssl ca -revoke CERTIFICATE.pem

ca : Directive de gestion des certificats
revoke : Révoque le certificat passé en paramètre

Créer d’une liste de révocation (CRL) d’un période de validité de 30 jours

# openssl ca -gencrl -out CRL.pem -crldays 30

ca : Directive de gestion des certificats
gencrl : Génère une liste de révocation de certificats (CRL)
out : Enregistre la CRL dans un fichier
crldays : Spécifie la période de validité de la CRL

Visualiser une CRL

# openssl crl -in CRL.pem -text

crl : Directive de gestion des CRL
in : Spécifie la CRL à lire
text : Affiche la CRL au format texte

Gestion des certificats

Générer un certificat autosigné

# openssl req -x509 -days 365 -newkey rsa:2048 -keyout PRIVATE_KEY.key -out CERTIFICATE.crt

req : Directive de gestion des requêtes de certificats
x509 : Génère un certificat autosigné
days : Détermine la période de validité du certificat si l’option x509 est spécifiée (30j par défaut)
newkey : Crée une requête de certificat et une clé privée. Prend la forme rsa:nbits, où nbits détermine le nombre de bits de la clé privée
keyout : Enregistre la clé privée dans le fichier passé en paramètre
out : Enregistre le certificat généré dans le fichier passé en paramètre

Générer une clé RSA 2048 bits et protection de cette clé par chiffrement AES 256

# openssl genrsa -aes256 -out private/SERVER.key 2048

genrsa : Directive pour générer des clés privées
aes256 : Chiffre la clé privée en AES 256
out : Enregistre la clé privée RSA 2048 bits chiffrée en AES 256 dans le fichier passé en paramètre
2048 : Nombre de bits de la clé privée

Créer une demande de certificat serveur (CSR : Certificate Signing Request)

# openssl req -sha256 -new -key private/SERVEUR.key -out certs/SERVER.req

req : Directive de gestion des requêtes de certificats
sha256 : Algorithme de signature du CSR. Peut être md5, sha1 …
new : Génère une nouvelle demande de certificat
key : Utilise la clé privée contenue dans le fichier passé en paramètre
out : Enregistre le CSR dans le fichier passé en paramètre

Signer le certificat par la CA

# openssl ca -days 365 -in certs/SERVER.req -out certs/SERVER.pem

ca : Directive de gestion des certificats
days : Détermine la période de validité du certificat
in : Fichier en entrée contenant un CSR
out : Enregistre le certificat dans le fichier passé en paramètre

Remarque:
Il est possible de rajouter la directive -config pour préciser le fichier de configuration de la CA à utiliser. Par défaut, le fichier de configuration config.cnf d’openSSL est utilisé.

Visualiser un certificat

# openssl x509 -in certs/SERVER.pem -noout -text

x509 : Directive de gestion des certificats
in : Fichier en entrée contenant un certificat
noout : Empêche l’affichage de la version encodée en base 64 du fichier en entrée
text : Affiche le certificat en entrée sous sa forme textuelle

Supprimer la passphrase d’une clé privée

# openssl rsa -in ENC_KEY.key -out NO_CRYPT_KEY.key

rsa : Directive de gestion des clés RSA
in : Fichier en entrée contenant une clé privée
out : Enregistre la clé sans protection dans le fichier passé en paramètre

Vérification d’un certificat

Tester une clé

# openssl rsa -noout -modulus -in SERVER.key | openssl md5

rsa : Directive de gestion des clés RSA
noout : Empêche l’affichage de la version encodée en base 64 du fichier en entrée
modulus : Affiche le modulus de la clé privée
in : Fichier en entrée contenant une clé privée

Remarque:
En greppant avec openssl md5, on réduit l’affichage du modulus en n’affichant que sa signature MD5

Tester un CSR

# openssl req -noout -modulus -in SERVER.csr | openssl md5

req : Directive de gestion des requêtes de certificats
noout : Empêche l’affichage de la version encodée en base 64 du fichier en entrée
modulus : Affiche le modulus de la clé publique contenue dans la requête de certificat
in : Fichier en entrée contenant une requête de certificat

Remarque:
En greppant avec openssl md5, on réduit l’affichage du modulus en n’affichant que sa signature MD5

Tester un certificat

# openssl x509 -noout -modulus -in SERVER.crt | openssl md5

x509 : Directive de gestion des certificats
noout : Empêche l’affichage de la version encodée en base 64 du fichier en entrée
modulus : Affiche le modulus de la clé publique contenue dans le certificat
in : Fichier en entrée contenant un certificat

Remarque:
En greppant avec openssl md5, on réduit l’affichage du modulus en n’affichant que sa signature MD5

Conversion d’un certificat

La conversion d’un certificat dans un format différent de celui d’origine peut s’avérer utile en fonction de l’utilisation. Afin de rendre compatible un certificat, openSSL propose différentes commandes pour convertir du format binaire DER (.crt, .cer, .der) au format texte PEM et vice versa. Le format PEM n’est qu’un encodage base 64 du certificat binaire.

Convertir un fichier binaire DER (.crt .cer .der) en PEM

# openssl x509 -inform der -in SERVER.crt -out SERVER.pem

x509 : Directive de gestion des certificats
inform : Spécifie le format d’entrée attendu [der/pem]
in : Fichier en entrée contenant un certificat binaire
out : Enregistre le certificat binaire DER converti en PEM dans le fichier passé en paramètre

Convertir un fichier PEM en DER

# openssl x509 -outform der -in SERVER.pem -out SERVER.der

x509 : Directive de gestion des certificats
outform : Spécifie le format de sortie attendu [der/pem]
in : Fichier en entrée contenant un certificat der/pem
out : Enregistre le certificat converti dans le fichier passé en paramètre
Un fichier PKCS12 est un conteneur, contenant (si, si je vous jure) une clé privée et une clé publique (le certificat) protégés par un mot de passe.

Convertir un fichier PKCS#12 (.pfx, .p12) contenant une clé privée et un certificat en PEM

# openssl pkcs12 -in KEYSTORE.pfx -out KEYSTORE.pem

pkcs12 : Directive de gestion des conteneurs PKCS12
in : Fichier PKSC12 en entrée
out : Enregistre dans un fichier PEM le contenu du PKCS12

Convertir un fichier PEM et une clé privée en PKCS#12 (.pfx, .p12)

# openssl pkcs12 -export -out KEYSTORE.pfx -inkey PRIVATE_KEY.key -in SERVER.crt -certfile CACERT.crt

pkcs12 : Directive de gestion des conteneurs PKCS12
export : Spécifie qu’un fichier pkcs12 sera créé et non parsé
out : Fichier de sortie du PKCS12 à créer
inkey : Fichier contenant une clé privée
in : Fichier en entrée contenant des certificats et des clés privées au format PEM à ajouter dans le PKCS12
certfile : Fichier contenant d’autres certificats

Remarque:
La directive export change le comportement des directives in ou out

Lien Permanent pour cet article : https://www.batard.eu/2010/11/maitriser-les-certificats-avec-openssl/

(6 commentaires)

Passer au formulaire de commentaire

    • Legr on 9 octobre 2011 at 17 h 05 min
    • Répondre

    Bonjour,

    Je ne trouve pas comment on fait lors de la création d’un certificat autosigné pour mettre quel type d’usage on fait de la clé, il s’agit du paramètre keyusage que je voudrais mettre par exemple à NonRepudiation, comment fait-on dans la ligne de commande?

    Merci,

    • on 11 octobre 2011 at 13 h 35 min
    • Répondre

    Bonjour,

    Je ne comprends pas trop pourquoi tu veux utiliser cette option en ligne de commande. Elle est sourtout utilisée en tant que paramètre dans ton openssl.cnf

    • Fabrice on 3 février 2015 at 14 h 07 min
    • Répondre

    Bonjour,

    Moi j’ai un certificat .pfx protégé avec un passphrase. je souhaite enlever le passphrase pour pouvoir l’utiliser plus aisement. Mais la commande « openssl rsa -in ENC_KEY.key -out NO_CRYPT_KEY.key
     » me ramène l’erreur « Error opening private key XXX. comment insérer le passphrase pour que ça marche?

  1. Bonjour,

    Etant donné qu’il s’agit d’un pfx (donc un pkcs12) il faut en 2 étapes :

    1)
    openssl pkcs12 -in file.pfx -out file.pem -nodes

    -nodes
    Ne va pas chiffrer la clé privée

    -out
    Enregistre le contenu du pfx dans un fichier pem

    2)
    openssl pkcs12 -export -in file.pem -out file2.pfx
    rm file.pem

    -export
    Va créer un fichier p12

    • Dumoulin on 30 novembre 2017 at 16 h 51 min
    • Répondre

    Bonjour,
    Bravo pour cette page très instructive sur les certificats openssl.
    J’ai une erreur en retour lorsque j’essaye de d’extraire la clef publique (.PEM) d’un certificat (.CRT).
    J’utilise la commande : openssl x509 -inform der -in SERVER.crt -out SERVER.pem
    erreur en retour :
    7892:error:0D0680A8:asn1 encoding routines:asn1_check_tlen:wrong tag:crypto\asn1\tasn_dec.c:1112:
    7892:error:0D07803A:asn1 encoding routines:asn1_item_embed_d2i:nested asn1 error:crypto\asn1\tasn_dec.c:274:Type=X509
    error in x509
    et pourtant le certificat .crt est bien présent ?

    Merci de votre aide

  2. Bonjour,

    Merci :).
    Je pense que le certificat est en base64. Il est possible de le vérifier simplement en faisant un cat du fichier et de vérifier s’il contient des caractères hexadécimaux. Dans le cas d’un fichier DER, le certificat est au format ASN1, c’est à dire du binaire donc non lisible tel quel.

    Le fichier crt contient-il la clé publique (aka le certificat) et le clé privée ? Si la réponse est non, le fichier peut être renommé simplement crt -> pem

    Pour finir, pem et crt sont des extensions qui ne définissent pas forcément l’encodage d’un certificat (base 64 ou ASN1).

    Un peu d’explication ici : http://www.gtopia.org/blog/2010/02/der-vs-crt-vs-cer-vs-pem-certificates/

Laisser un commentaire

Your email address will not be published.