Généralités système Linux

Openssl : Création de certificats et CA autosignés

Table des matières

apache_ssl



Introduction



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

Dans cet article, on va créer un certificat pour l'hôte esx1.linuxtricks.lan avec un "CA" maison.


Générer le CA (Certificate Authority)



Nous allons plus tard générer le certificat.
Au lieu de le faire valider par une autorité payante, Nous allons générer notre CA personnel.
Il sera nécessaire, pour que le certificat soit reconnu officiellement, d'ajouter dans le magasin de certificat du système, notre CA.

Dans un premier temps, on va générer notre clé privée linuxtricksCA.key :

Code BASH :
openssl genrsa -des3 -out linuxtricksCA.key 2048


Lors de la génération, il est demandé une passphrase. Elle nous servira pour signer les certificats des hôtes.

Code TEXT :
Generating RSA private key, 2048 bit long modulus (2 primes)
........................................................................+++++
..........................................+++++
e is 65537 (0x010001)
Enter pass phrase for linuxtricksCA.key:
Verifying - Enter pass phrase for linuxtricksCA.key:


Maintenant qu'on a la clé, on va générer le root certificate (certificat racine) :

Code BASH :
 openssl req -x509 -new -nodes -key linuxtricksCA.key -sha256 -days 10000 -out linuxtricksCA.pem


Ici, je génère le certificat pour une durée de 10.000 jours pour être tranquille une bonne fois pour tout en interne.

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

Un certain nombre de questions sont posées, y répondre comme mis en exemple ici :

Code TEXT :
Enter pass phrase for linuxtricksCA.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Bourgogne
Locality Name (eg, city) []:Dijon
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Linuxtricks
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:Linuxtricks CA
Email Address []:



Dans le cas où vous avez besoin d'un fichier .crt (au lieu d'un .pem), vous pouvez exécuter la commande suivante :

Code BASH :
openssl x509 -in linuxtricksCA.pem -inform PEM -out linuxtricksCA.crt


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

Il ne reste plus qu'à déployer ce certificat racine 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 pour un hôte



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

Dans cet exemple, le serveur concerné est esx1.linuxtricks.lan

On crée d'abord la clé privée :

Code BASH :
openssl genrsa -out esx1.linuxtricks.lan.key 2048


Ensuite il faut générer le CSR (Certificate Signing Request) :

Code BASH :
openssl req -new -key esx1.linuxtricks.lan.key -out esx1.linuxtricks.lan.csr


On répond à un certain nombre de questions.
Il faut bien mettre le nom du serveur tel qu'il est appelé de l'extérieur dans le champ CN (Common Name) :

Code TEXT :
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Bourgogne
Locality Name (eg, city) []:Dijon
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Linuxtricks
Organizational Unit Name (eg, section) []:Linuxtricks
Common Name (e.g. server FQDN or YOUR name) []:esx1.linuxtricks.lan
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:



Dans le cas d'un certificat autosigné, pour 10000 jours :

Code BASH :
openssl x509 -req -days 10000 -in esx1.linuxtricks.lan.csr -signkey esx1.linuxtricks.lan.key -out esx1.linuxtricks.lan.crt


Ce certificat n'est authentifié par aucune autorité, vous aurez donc un message d'avertissement quand vous vous connectez au serveur, mais la connexion sera bien chiffrée.


Dans le cas d'un certificat à signer par notre CA précédemment créé :

On va créer un fichier de configuration pour le sous-domaine concerné :

Code BASH :
vi esx1.linuxtricks.lan.ext


Qui va contenir ceci :

Code TEXT :
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = esx1.linuxtricks.lan


On va maintenant signer le certificat avec notre CA, pour une validité de 10.000 jours :

Code BASH :
openssl x509 -req -in esx1.linuxtricks.lan.csr -CA linuxtricksCA.pem -CAkey linuxtricksCA.key -CAcreateserial -out esx1.linuxtricks.lan.crt -days 10000 -sha256 -extfile esx1.linuxtricks.lan.ext


La passphrase de notre CA est demandée pour valider la signature du certificat :

Code TEXT :
Signature ok
subject=C = FR, ST = Bourgogne, L = Dijon, O = Linuxtricks, CN = esx1.linuxtricks.lan
Getting CA Private Key
Enter pass phrase for linuxtricksCA.key:




Nous avons maintenant 4 fichiers :
- esx1.linuxtricks.lan.key => La clé privée du certificat du sous domaine
- esx1.linuxtricks.lan.csr => La demande de signature du certificat
- esx1.linuxtricks.lan.crt => Certificat du sous domaine au format crt
- esx1.linuxtricks.lan.ext => Fichier de configuration du sous domaine


Mise en place des certificats



Apache dans le virtualhost SSL



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

Editer le fichier du virtualhost concerné :
Exemple ici sur Gentoo, mais le fichier de configuration peut se trouver dans un autre fichier, comme /etc/httpd/conf.d/ssl.conf pour CentOS

Code BASH :
vi /etc/apache2/vhosts.d/00_default_ssl_vhost.conf


Éditer les lignes suivantes et renseigner les chemins des fichiers de certificat :

Code BASH :
ServerName linuxtricks.fr
SSLCertificateFile /etc/ssl/linuxtricks.fr/linuxtricks.fr.crt
SSLCertificateKeyFile /etc/ssl/linuxtricks.fr/linuxtricks.fr.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).

Editer le fichier du virtualhost concerné :
Exemple ici sur CentOS, mais le fichier de configuration peut se trouver dans un autre fichier :

Code BASH :
vi  /etc/nginx/conf.d/ssl.conf


Éditer les lignes suivantes et renseigner les chemins des fichiers de certificat :

Code BASH :
ssl                  on;
ssl_certificate      /etc/ssl/linuxtricks.fr/linuxtricks.fr.crt;
ssl_certificate_key  /etc/ssl/linuxtricks.fr/linuxtricks.fr.key;


Recharger le démon nginx


ESXi : Installer son certificat



Il faut précédemment activer SSH sur l'hôte.

Procéder à une sauvegarde des fichiers d'origine :
Code BASH :
cd /etc/vmware/ssl
mv rui.key rui.key.bak
mv rui.crt rui.crt.bak


Envoyer les fichiers sous le même nom :

Code BASH :
scp esx1.linuxtricks.lan.crt root@192.168.21.250:/etc/vmware/ssl/rui.crt
scp esx1.linuxtricks.lan.key root@192.168.21.250:/etc/vmware/ssl/rui.key


Relancer les services sur l'ESXi :

Code BASH :
services.sh restart


Commandes à taper à la va vite



J'ajoute ce paragraphe, c'est pour générer à l'arrach des certificats autosignés.
Sans explication, c'est juste que j'en ai besoin parfois pour tester rapidement un serveur web avec le support HTTPS.
C'est juste pour les avoir vite fait ! Adaptez la première ligne au domaine concerné.

Code BASH :
domaine=vhost155-2.linuxtricks.lan
openssl genrsa -aes128 2048 > $domaine.key
openssl rsa -in $domaine.key -out $domaine.key
openssl req -utf8 -new -key $domaine.key -out $domaine.csr
openssl x509 -in $domaine.csr -out $domaine.crt -req -signkey $domaine.key -days 3650
Cette page a été vue 106873 fois