Openssl : Création de certificats et CA autosignés
Table des matières
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.
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 :
Lors de la génération, il est demandé une passphrase. Elle nous servira pour signer les certificats des hôtes.
Maintenant qu'on a la clé, on va générer le root certificate (certificat racine) :
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 :
Dans le cas où vous avez besoin d'un fichier .crt (au lieu d'un .pem), vous pouvez exécuter la commande suivante :
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
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 :
Ensuite il faut générer le CSR (Certificate Signing Request) :
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) :
Dans le cas d'un certificat autosigné, pour 10000 jours :
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é :
Qui va contenir ceci :
On va maintenant signer le certificat avec notre CA, pour une validité de 10.000 jours :
La passphrase de notre CA est demandée pour valider la signature du certificat :
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
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
Éditer les lignes suivantes et renseigner les chemins des fichiers de certificat :
Recharger le démon apache2 (ou httpd suivant le système)
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 :
Éditer les lignes suivantes et renseigner les chemins des fichiers de certificat :
Recharger le démon nginx
Il faut précédemment activer SSH sur l'hôte.
Procéder à une sauvegarde des fichiers d'origine :
Envoyer les fichiers sous le même nom :
Relancer les services sur l'ESXi :
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é.
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