Principes

Le système est hiérarchisé : une autorité de certification (CA, Certification Authority) signe les certificats des clients et des serveurs (ou encore, par délégation, le certificat d'un autre CA de niveau inférieur). Ces certificats sont ensuite utilisés 1) pour établir des communications chiffrées avec SSL/TLS et 2) pour authentifier le serveur, voire le client (certificats de client).

Il existe donc trois types de certificats :

  1. Le certificat de l'autorité de certification.
  2. Le certificat du serveur.
  3. Le certificat du client, c'est à dire de l'utilisateur d'un serveur.

Comment obtenir un certificat pour un serveur Web : en général, on génère une clé cryptographique pour le serveur, puis une demande de certificat (CSR, Certificate Signing Request). La demande est signée par un CA commercial (moyennant finances) pour générer un certificat de serveur. Ce certificat est ensuite accepté automatiquement par les navigateurs Web comme Firefox (car les certificats de ces CA commerciaux sont préimportés dans le navigateur).

On peut également générer un certificat de serveur auto-signé (self-signed). Problème : comme le certificat n'est pas reconnu par les navigateurs Web, un message d'avertissement apparaît lors de la première connexion. Pour le contourner, il est possible d'accepter ponctuellement ou définitivement le certificat dès lors qu'on fait confiance au site en question.

Pour sécuriser une petite structure (association, par exemple), il est possible de devenir sa propre autorité de certification et de signer des certificats pour ses serveurs et leurs utilisateurs. Ensuite, on importe le certificat du CA dans le navigateur des clients, ce qui permet de valider les certificats des serveurs. On peut également diffuser des certificats de client aux utilisateurs, pour authentifier ces derniers. C'est la stratégie décrite ci-dessous.

Création d'un certificat d'autorité de certification (CA)

1. Créez une configuration pour gérer les clés :

mkdir certificats-toto
touch serial
echo 100001 > serial
touch certindex.txt

Modifiez ensuite le modèle de fichier de configuration (openssl.conf) joint à ce document. Deux sections doivent être personnalisées dans ce fichier.

2. Générez la clé privée et le certificat X.509 (clé publique) du CA :

openssl req -new -x509 -extensions v3_ca \
 -newkey rsa:2048 -keyout toto-ca-key.pem \
 -out toto-ca-cert.pem -days 3650 \
 -config ./openssl.cnf
  • req - Utilitaire de gestion des certificats.
  • -new - Créer un certificat.
  • -x509 - Créer un certificat autosigné (certificat racine du CA).
  • -extensions - Utiliser les paramètres d'une section du fichier de configuration.
  • -newkey - Créer une clé privée (format et longueur de la clé).
  • -keyout - Fichier de clé créé.
  • -out - Fichier de certificat créé.
  • -days - Durée de validité du certificat en jours.
  • -config - Fichier de configuration à utiliser.

Voir la page de manuel.

Création d'un certificat de serveur

1. Générez une clé privée non chiffrée et une demande de certificat.

openssl req -new -nodes -out serveur.toto.fr-req.pem\
 -keyout serveur.toto.fr-key.pem -days 1825 \
 -config ./openssl.cnf
  • req - Utilitaire de gestion des certificats.
  • -new - Créer un certificat.
  • -nodes - Clé privée non chiffrée
  • -out - Nom du fichier de demande créé.
  • -keyout - Nom du fichier de clé créé.
  • -days - Durée de validité du certificat en jours.
  • -config - Fichier de configuration à utiliser.

2. Signez la demande de certificat avec la clé du CA pour créer un certificat de serveur.

openssl ca -out serveur.toto.fr-cert.pem\
 -days 1850 -config ./openssl.cnf \
 -infiles serveur.toto.fr-req.pem
  • ca - Utilitaire de gestion du CA.
  • -out - Fichier de certificat créé.
  • -days - Durée de validité du certificat.
  • -config - Fichier de configuration à utiliser.
  • -infiles - Fichier de demande de certificat.

Voir la page de manuel.

Création d'un certificat de client

1. Générez une clé privée et une demande de certificat :

openssl req -new -nodes -out albert-req.pem \
 -keyout albert-key.pem -days 1850 \
 -config ./openssl.cnf
  • req - Utilitaire de gestion des certificats.
  • -new - Créer un certificat.
  • -nodes - Créer une clé privée non chiffrée.
  • -out - Fichier de demande créé.
  • -keyout - Nom du fichier de clé créé.
  • -days - Durée de validité du certificat en jours.
  • -config - Fichier de configuration à utiliser.

2. Signez la demande de certificat avec la clé privée du CA :

openssl ca -out albert-cert.pem -days 1850 \
 -config ./openssl.cnf -infiles albert-req.pem
  • ca - Utilitaire de gestion du CA.
  • -out - Fichier de certificat créé.
  • -days - Durée de validité du certificat
  • -config - Fichier de configuration à utiliser.
  • -infiles - Fichier de demande de certificat.

3. Générez un fichier PKCS12, qui permet de regrouper la clé publique du client, la clé privée du client et le certificat du CA. Ce fichier peut ensuite être importé dans Firefox ou dans Thunderbird.

openssl pkcs12 -export -in albert-cert.pem \
 -inkey albert-key.pem -certfile toto-ca-cert.pem \
 -name "Albert" -out albert-cert.p12
  • pkcs12 - Commande de gestion des fichiers PKCS#12.
  • -export - Créer un fichier PKCS#12.
  • -in - Fichier de certificat du client.
  • -inkey - Fichier de clé du client.
  • -certfile - Fichier de certificat du CA.
  • -name - Nom complet du client.
  • -out - Fichier PKCS#12 créé.

Voir la page de manuel.

Création d'une liste de révocation

Une liste de révocation (CRL, Certificate Revocation List) énumère les certificats révoqués. Créons une liste initiale vide :

openssl ca -gencrl -keyfile toto-ca-key.pem \
 -cert toto-ca-cert.pem -out toto-ca-crl.pem \
 -config ./openssl.cnf -crldays 365
  • ca - Utilitaire de gestion du CA.
  • -gencrl - Créer une liste de révocation.
  • -keyfile - Clé privée du CA.
  • -cert - Certificat du CA.
  • -out - Fichier de liste de révocation créé.
  • -config - Fichier de configuration à utiliser.
  • -crldays - Durée de validité de la liste de révocation.

Maintenant, révoquons un certificat, celui du serveur par exemple, puis régénérons la liste :

openssl ca -keyfile toto-ca-key.pem \
 -cert toto-ca-cert.pem \
 -revoke serveur.toto.fr-cert.pem \
 -config ./openssl.cnf
  • ca - Utilitaire de gestion du CA.
  • -keyfile - Clé privée du CA.
  • -cert - Certificat du CA.
  • -revoke - Certificat à révoquer.
  • -config - Fichier de configuration à utiliser.
openssl ca -gencrl -keyfile toto-ca-key.pem \
 -cert toto-ca-cert.pem -out toto-ca-crl.pem \
 -config ./openssl.cnf -crldays 365
  • ca - Utilitaire de gestion du CA.
  • -gencrl - Créer une liste de révocation.
  • -keyfile - Clé privée du CA.
  • -cert - Certificat du CA.
  • -out - Fichier de liste de révocation créé.
  • -config - Fichier de configuration à utiliser.
  • -crldays - Durée de validité de la liste de révocation.

Affichage du contenu de la liste :

openssl crl -in toto-ca-crl.pem -noout -text
  • crl - Utilitaire de gestion des listes de révocation.
  • -in - Liste de révocation à ouvrir.
  • -noout - Ne pas générer de fichier.
  • -text - Présenter la liste au format texte.

Voir la page de manuel.

Manipulations diverses

Empreintes d'un certificat

Création d'un fichier contenant l'empreinte du certificat du CA :

openssl x509 -fingerprint -noout \
 -in toto-ca-cert.pem -sha1 >> fingerprints.txt
openssl x509 -fingerprint -noout \
 -in toto-ca-cert.pem -md5 >> fingerprints.txt
  • x509 - Utilitaire d'affichage des certificats.
  • -fingerprint - Créer une empreinte du certificat.
  • -noout - Ne pas générer de fichier.
  • -in - Certificat à ouvrir.
  • -sha1/-md5 - Algorithme d'empreinte (digest) utilisé.

Voir la page de manuel.

Si vous disposez d'une clé GPG/OpenPGP personnelle, vous pouvez signer ces empreintes pour authentifier votre certificat de CA :

gpg -a --clearsign -o fingerprints.txt

Documentation