Généralités système Linux

Openssl : Création d'une Autorité de Certification interne et de Certificats Clients

Cet article a été mis à jour, vous consultez ici une archive de cet article!
Table des matières

apache_ssl



Introduction



Cet article décrit brièvement comment générer :
- Une autorité de certification pour son usage perso
- Un certificat SSL pour un domaine
- Paramétrer les services concernés : Apache, Ngnix, ESXi

Au lieu de le faire valider par une autorité payante, on va créer notre autorité de certification personnelle.

Quelques abréviations utilisées dans l'article :
- CA : Certificate Authority, Autorité de Certification
- CSR : Certificate Signing Request, Demande de Signature de Certificat
- CN : Common Name, Nom Commun (nom pleinement qualifié dans le cas du certificat client)

Il sera nécessaire, pour que le certificat soit reconnu officiellement, d'ajouter dans le magasin de certificat du système, notre CA.

Note : Cet article est rédigé pour générer des certificats pour un domaine interne linuxtrickslab.lan.
Nous sommes dans le cadre d'un homelab, par conséquent :
- on ne fera pas un truc super carré
- on ne fera qu'une ROOT CA (SUB CA facultative)

Je ne ferai pas de blabla très technique, on reste dans le cadre d'un mémo.


Prérequis



On utilisera OpenSSL, donc celui-ci doit être installé.

Normalement, il est déjà installé, sinon :

Debian, Ubuntu et dérivées :
Code BASH :
apt install openssl


Fedora, Red Hat Enterprise Linux et dérivées :
Code BASH :
dnf install openssl



Générer la CA



On a besoin d'un certificat racine d'abord.

On va créer une clé privée pour la CA linuxtrickslabCA.key :
Code BASH :
openssl genpkey -algorithm RSA -out linuxtrickslabCA.key -pkeyopt rsa_keygen_bits:4096 -aes256


Lors de la génération, il est demandé une passphrase :
Code TEXT :
..+............+.......+........+.+..+.........+....+......................+++++
.........
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:


Maintenant qu'on a la clé, on va générer le certificat racine linuxtrickslabCA.pem :
Code BASH :
openssl req -x509 -new -nodes -key linuxtrickslabCA.key -sha256 -days 7300 -subj "/C=FR/ST=BOURGOGNE/L=DIJON/O=LINUXTRICKS/OU=LINUXTRICKS/CN=LINUXTRICKS CA" -out linuxtrickslabCA.pem


Au moment de la génération, il est demandé la passphrase de la clé précédente.

Note : Le -subj permet d'éviter de répondre à un certain nombre de questions (pratique pour du non interractif). Ici, je génère le certificat pour une durée de 20 ans.

On va se générer un certificat au format crt en plus du pem pour la CA via :
Code BASH :
openssl x509 -in linuxtrickslabCA.pem -inform PEM -out linuxtrickslabCA.crt


Nous avons maintenant 3 fichiers :
- linuxtrickslabCA.key => La clé privée
- linuxtrickslabCA.pem => Certificat racine au format pem
- linuxtrickslabCA.crt => Certificat racine au format crt


Déployer le CA sur les systèmes d'exploitation



Pour déployer cette autorité de certification sur les PC, sous Windows par GPO, et sous Linux comme expliqué dans cet article : https://www.linuxtricks.fr/wiki/ajouter-des-certificats-autosignes-sur-linux


Créer un certificat client



Maintenant qu'on a un CA maison et installé sur nos hôtes, on va pouvoir générer des certificats clients pour nos serveurs (Sites Web, équipements, etc....) et les signer avec notre CA.

Dans cet exemple, le serveur concerné est cloud.linuxtrickslab.lan

On va créer le fichier des directives de configuration du certificat :
Code BASH :
vim cloud.linuxtrickslab.lan.ext


On y place ceci :
Code BASH :
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = cloud.linuxtrickslab.lan


On crée d'abord la clé privée :
Code BASH :
openssl genpkey -algorithm RSA -out cloud.linuxtrickslab.lan.key -pkeyopt rsa_keygen_bits:4096


Ensuite il faut générer la demande de signature de certificat :
Code BASH :
openssl req -new -key cloud.linuxtrickslab.lan.key -out cloud.linuxtrickslab.lan.csr -subj "/C=FR/ST=BOURGOGNE/L=DIJON/O=LINUXTRICKS/OU=LINUXTRICKS/CN=cloud.linuxtrickslab.lan"


Note : Le -subj permet d'éviter de répondre à un certain nombre de questions (pratique pour du non interractif).
Il faut bien mettre le nom du serveur tel qu'il est appelé de l'extérieur dans le champ CN !

Ensuite on signe la CSR avec la CA :
Code BASH :
openssl x509 -req -in cloud.linuxtrickslab.lan.csr -CA linuxtrickslabCA.crt -CAkey linuxtrickslabCA.key -CAcreateserial -out cloud.linuxtrickslab.lan.crt -days 3650 -sha256 -extfile cloud.linuxtrickslab.lan.ext


On peut vérifier que le certificat est bien signé via :
Code BASH :
openssl verify -CAfile linuxtrickslabCA.crt cloud.linuxtrickslab.lan.crt


Ce qui renvoie :
Code :
cloud.linuxtrickslab.lan.crt: OK


Le certificat généré sera valide 10 ans dans mon exemple.

Nous avons maintenant 4 fichiers :
- cloud.linuxtrickslab.lan.key => La clé privée du certificat client
- cloud.linuxtrickslab.lan.csr => La demande de signature du certificat client
- cloud.linuxtrickslab.lan.crt => Certificat client au format crt
- cloud.linuxtrickslab.lan.ext => Directives de configuration des certificats

Seuls les fichiers .key et .crt sont utiles par la suite.

Mise en place des certificats



Apache dans le virtualhost SSL



Envoyer les fichiers de certificat (CRT) et Clé (KEY).

Si on utilise SELinux, on mettra le contexte adéquat :
Code BASH :
chcon -R -t cert_t /etc/pki/linuxtrickslab.lan/


Éditer les lignes suivantes et renseigner les chemins des fichiers de certificat dans la configuration du VirtualHost :

Code BASH :
ServerName linuxtricks.fr
SSLCertificateFile /etc/pki/linuxtrickslab.lan/cloud.linuxtrickslab.lan.crt
SSLCertificateKeyFile /etc/pki/linuxtrickslab.lan/cloud.linuxtrickslab.lan.key


Recharger le démon apache2 (ou httpd suivant le système).


Nginx dans le virtualhost SSL



Envoyer les fichiers de certificat (CRT) et Clé (KEY).

Si on utilise SELinux, on mettra le contexte adéquat :
Code BASH :
chcon -R -t cert_t /etc/pki/linuxtrickslab.lan/


Éditer les lignes suivantes et renseigner les chemins des fichiers de certificat dans la configuration du VirtualHost :

Code BASH :
ssl                  on;
ssl_certificate      /etc/pki/linuxtrickslab.lan/cloud.linuxtrickslab.lan.crt;
ssl_certificate_key  /etc/pki/linuxtrickslab.lan/cloud.linuxtrickslab.lan.key;


Recharger le démon nginx.


Script de génération de certificat client



Comme dans mon lab je génère des certificats client de temps en temps, je ne retiens pas les commandes.
Voici l'arborescence :
Code TEXT :
CA/
   linuxtrickslabCA.crt
   linuxtrickslabCA.info
   linuxtrickslabCA.key
   linuxtrickslabCA.pem
   linuxtrickslabCA.srl
gencert.sh


Voici le script très simpliste :
Code BASH :
#! /bin/bash
 
# Chemin des fichiers du CA 
# Si dans CA on a les linuxtricksCA.key linuxtricksCA.crt linuxtricksCA.ext : CA="CA/linuxtricksCA"
CA="CA/linuxtrickslabCA"
 
# Domaine du CA
DOMAINE="linuxtrickslab.lan"
 
 
################
# DEBUT SCRIPT #
################
 
DOM1="${DOMAINE%%.*}"
DOM2="${DOMAINE#*.}"
 
if [[ "$1" =~ ^[a-zA-Z0-9-]+\.$DOM1\.$DOM2 ]]
then
    FQDN="$1"
else
    echo "Erreur : FQDN $1 incorrect pour le domaine $DOMAINE"
    exit 1
fi
 
echo "Certificat pour : $FQDN"
 
echo "Fichier de directives de configuration"
cat > $FQDN.ext << EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = $FQDN
EOF
 
echo "Generation KEY"
openssl genpkey -algorithm RSA -out $FQDN.key -pkeyopt rsa_keygen_bits:4096
 
echo "Génération CSR"
openssl req -new -key $FQDN.key -out $FQDN.csr -subj "/C=FR/ST=BOURGOGNE/L=DIJON/O=LINUXTRICKS/OU=LINUXTRICKS/CN=$FQDN"
 
echo "Signature CSR avec CA"
openssl x509 -req -in $FQDN.csr -CA $CA.crt -CAkey $CA.key -CAcreateserial -out $FQDN.crt -days 3650 -sha256 -extfile $FQDN.ext
 
echo "Vérification"
openssl verify -CAfile $CA.crt $FQDN.crt