Openssl - Création d'une Autorité de Certification interne et de Certificats Clients
Table des matières
Openssl - Création d'une Autorité de Certification interne et de Certificats Clients
Déployer le CA sur les systèmes d'exploitation
Apache dans le virtualhost SSL
Script de génération de certificat client
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 home.arpa.
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)
Prérequis
On utilisera OpenSSL, donc celui-ci doit être installé.
Normalement, il est déjà installé, sinon :
Debian, Ubuntu et dérivées :
apt install openssl
Fedora, Red Hat Enterprise Linux et dérivées :
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 homearpaCA.key :
openssl genpkey -algorithm RSA -out homearpaCA.key -pkeyopt rsa_keygen_bits:4096 -aes256
Lors de la génération, il est demandé une passphrase :
..+............+.......+........+.+..+.........+....+......................+++++
.........
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
Maintenant qu'on a la clé, on va générer le certificat racine homearpaCA.pem :
openssl req -x509 -new -nodes -key homearpaCA.key -sha256 -days 7300 -subj "/C=FR/ST=PAYS-DE-LOIRE/L=ANGERS/O=HOMEARPA/OU=HOMEARPA/CN= HOMEARPA CA" -out homearpaCA.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 :
openssl x509 -in homearpaCA.pem -inform PEM -out homearpaCA.crt
Nous avons maintenant 3 fichiers :
- homearpaCA.key => La clé privée
- homearpaCA.pem => Certificat racine au format pem
- homearpaCA.crt => Certificat racine au format crt
Déployer le CA sur les systèmes d'exploitation
Pour déployer cette autorité de certification, je vous renvoie aux articles suivants :
- Red Hat, CentOS, Alma Linux, Rocky : Ajouter une autorité de certification au magasin système : https://www.linuxtricks.fr/wiki/red-hat-centos-alma-linux-rocky-ajouter-une-autorite-de-certification-au-magasin-systeme
- Ubuntu : Ajouter une autorité de certification au magasin système : https://www.linuxtricks.fr/wiki/ubuntu-ajouter-une-autorite-de-certification-au-magasin-systeme
- Firefox : Ajouter une autorité de certification au magasin local : https://www.linuxtricks.fr/wiki/firefox-ajouter-une-autorite-de-certification-au-magasin-local
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 cwwk.home.arpa
On va créer le fichier des directives de configuration du certificat :
nano cwwk.home.arpa.ext
On y place ceci :
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = cwwk.home.arpa
On crée d'abord la clé privée :
openssl genpkey -algorithm RSA -out cwwk.home.arpa.key -pkeyopt rsa_keygen_bits:4096
Ensuite il faut générer la demande de signature de certificat :
openssl req -new -key cwwk.home.arpa.key -out cwwk.home.arpa.csr -subj "/C=FR/ST=BOURGOGNE/L=DIJON/O=homearpa/OU=homearpa/CN=cwwk.home.arpa"
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 :
openssl x509 -req -in cwwk.home.arpa.csr -CA homearpaCA.crt -CAkey homearpaCA.key -CAcreateserial -out cwwk.home.arpa.crt -days 3650 -sha256 -extfile cwwk.home.arpa.ext
On peut vérifier que le certificat est bien signé via :
openssl verify -CAfile homearpaCA.crt cwwk.home.arpa.crt
Ce qui renvoie :
Copier vers le presse-papierCode :
cwwk.home.arpa.crt: OK
Le certificat généré sera valide 10 ans dans mon exemple.
Nous avons maintenant 4 fichiers :
- cwwk.home.arpa.key => La clé privée du certificat client
- cwwk.home.arpa.csr => La demande de signature du certificat client
- cwwk.home.arpa.crt => Certificat client au format crt
- cwwk.home.arpa.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 :
chcon -R -t cert_t /etc/ssl/private/
Éditer les lignes suivantes et renseigner les chemins des fichiers de certificat dans la configuration du VirtualHost :
ServerName homearpa.fr
SSLCertificateFile /etc/ssl/private/cwwk.home.arpa.crt
SSLCertificateKeyFile /etc/ssl/private/cwwk.home.arpa.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 :
chcon -R -t cert_t /etc/ssl/private/
Éditer les lignes suivantes et renseigner les chemins des fichiers de certificat dans la configuration du VirtualHost :
ssl on;
ssl_certificate /etc/ssl/private/cwwk.home.arpa.crt;
ssl_certificate_key /etc/ssl/private/cwwk.home.arpa.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 :
CA/
homearpaCA.crt
homearpaCA.info
homearpaCA.key
homearpaCA.pem
homearpaCA.srl
gencert.sh
Voici le script très simpliste :
#! /bin/bash
# Chemin des fichiers du CA
# Si dans CA on a les homearpaCA.key homearpaCA.crt homearpaCA.ext : CA="CA/homearpaCA"
CA="CA/homearpaCA"
# Domaine du CA
DOMAINE="home.arpa"
################
# 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=PAYS-DE-LOIRE/L=ANGERS/O=homearpa/OU=homearpa/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