Post

Création d'une Autorité de Certification interne domaine home.arpa et de Certificats Clients

yannick

Création d'une Autorité de Certification interne domaine home.arpa et de Certificats Clients

Introduction

Prérequis

Générer la CA

Déployer l’ autorité de certification (CA)

Systèmes d’exploitation Red Hat, CentOS, Alma Linux, Rocky

Systèmes d’exploitation Debian, Ubuntu et dérivés

Systèmes Arch, Fedora (p11-kit)

Navigateurs Firefox, Floorp et dérivés

Créer un certificat client

Mise en place des certificats

Apache dans le virtualhost SSL

Nginx dans le virtualhost 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 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 l’ autorité de certification (CA)

Systèmes d’exploitation Red Hat, CentOS, Alma Linux, Rocky

 Les commandes seront à exécuter en tant que root (ou avec sudo).

Pour ajouter un certificat au magasin système de certificats sur Red Hat Enterprise Linux, on va utiliser la commande update-ca-trust.

Avant, on va copier le certificat dans le répertoire /etc/pki/ca-trust/source/anchors/ :


Ensuite, on met à jour le magasin de certificats :

Aucun message n'est indiqué à l'écran.

On pourra vérifier que le certificat a bien été ajouté en utilisant la commande trust :


On pourra faire un "grep" sur le nom du certificat :

Et voilà : le certificat est maintenant ajouté au magasin de certificats système et peut être utilisé par des applications et services qui dépendent du magasin de certificats système pour la validation des certificats SSL.

 

Systèmes d’exploitation Debian, Ubuntu et dérivés

Les commandes seront à exécuter en tant que root (ou avec sudo).

Pour ajouter un certificat au magasin système de certificats sur Debian ou Ubuntu, on va utiliser la commande update-ca-trust.
Avant, on va copier le certificat dans le répertoire /etc/pki/ca-trust/source/anchors/ :

Ensuite, on met à jour le magasin de certificats :


On pourra vérifier que le certificat a bien été ajouté en vérifiant qu'un .pem a été créé dans /etc/ssl/certs :

On pourra vérifier le contenu avec :

Systèmes Arch, Fedora (p11-kit)

Importez l'AC manuellement:

  1. 1.Copier le certificat dans le répertoire /etc/ca-certificates/trust-source/anchors  

  2. 2.Exécuter en « root » update-ca-trust  

Fedora

Comme ci-dessus, mais le chemin d'installation manuel est /etc/pki/ca-trust/source/anchors

Navigateurs Firefox, Floorp et dérivés

La commande certutil qu'on va utiliser se trouve dans les outils NSS

Pour Fedora, Red Hat Enterprise Linux et dérivées :

Pour Debian et dérivées :

Archlinux et dérivés

yay -S nss # installé par défaut

Ajouter un certificat dans le navigateur web

Pour trouver l'emplacement du fichier cert9.db contenant les certificats, on pourra effectuer :

Exemple de retour :

/home/yann/.thunderbird/b48ri75c.default/cert9.db

/home/yann/.pki/nssdb/cert9.db

/home/yann/.mozilla/firefox/hue6jbyv.default-release/cert9.db


Dans le dossier .pki ce sont les certificats utilisés par Chromium, Vivaldi, avant etc etc...
Firefox et Thunderbird ont leurs DB spécifique.

Pour ajouter le certificat racine dans la base de données, on va utiliser cette commande :

Et voilà, Firefox ne crie plus que le certificat est inconnu !


On peut voir les certificats installés avec :

 

Et pour le supprimer :

certutil -d sql:/home/yann/.mozilla/firefox/hue6jbyv.default-release/ -D -n home.arpa

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 :

Code :

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 cwwk.home.arpa

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.

 

Cet article est sous licence CC BY 4.0 par l'auteur.