Mise à jour du 13/07/2018 : Si vous souhaitez générer des certificats wildcard, je vous renvoi vers cet article qui traite ce sujet. L’article que vous êtes en train de lire ne concerne que les certificats standards.
Depuis le temps que j’en parle, voici un article sur Let’s Encrypt. Pour ceux qui ne connaissent pas, Let’s Encrypt fourni, gratuitement, des certificats SSL reconnus par les navigateurs (une petite révolution).
Le SSL, qu’est-ce que c’est ? C’est un protocole permettant de sécuriser les échanges sur internet, que ce soit via les protocoles http, ftp ou encore pop (pour les mail). Ce protocole ne se nomme plus SSL (Secure Sockets Layer) mais TLS (Transport Layer Security) depuis 1999 (merci wikipedia ^^). Le protocole TLS est le successeur du protocole SSL (ce dernier n’étant plus utilisé) mais le terme SSL est resté.
Pour expliquer rapidement comment ça fonctionne, le SSL utilise une paire de clé (publique et privée) et une autorité de confiance :
- Le navigateur se connecte au serveur et demande une connexion SSL
- Le serveur envoi un certificat SSL, contenant sa clé publique et sa signature numérique chiffrée, au navigateur
- Le navigateur essaye de déchiffrer la signature avec les clés publique des autorités de confiance intégrés au navigateur (VeriSign, Visa, etc)
- S’il y arrive, ça prouve que le certificat a été émis par une autorité de confiance, tout va bien. S’il n’y arrive pas il va déchiffrer la signature avec la clé publique fournie avec le certificat et va alerter l’utilisateur que ce certificat n’a pas été émis par une autorité de confiance et n’est donc pas sûr (on parle de certficat auto-émis).
- Une fois le certificat validé, le navigateur va échanger des données chiffrées avec le serveur en utilisant des suites cryptographiques (voir plus de détails ici).
La révolution amenée par Let’s Encrypt est qu’il a été reconnu comme une autorité de confiance et que, contrairement aux autres autorités de confiance, il propose des certificats gratuitement.
1) Activer le support SSL
Tout d’abord on va activer le support ssl ainsi que le mode headers dont aura besoin. Taper la commande sudo a2enmod ssl headers
pour activer la gestion du ssl.
On va également activer le fichier de conf ssl avec la commande sudo a2ensite default-ssl.conf
. Il crée un lien dans /etc/apache2/site-enabled (qui contient les sites actifs sous forme de liens) vers /etc/apache2/site-available/default-ssl.conf (qui contient tous les sites disponibles, actif ou inactif)
Il ne nous reste plus qu’à renommer correctement le lien créé dans /etc/apache2/site-enabled avec la commande
[pastacode lang=”bash” manual=”sudo%20mv%20%2Fetc%2Fapache2%2Fsites-enabled%2Fdefault-ssl.conf%20%2Fetc%2Fapache2%2Fsites-enabled%2F000-default-ssl.conf” message=”” highlight=”” provider=”manual”/]
Apache charge ses fichiers de configuration dans un certain ordre, indiqué par le préfixe, sous forme de numéro, des fichiers de configuration. En rajoutant 000 comme préfixe, Apache chargera se fichier en premier. Le fichier de conf SSL étant un fichier de config principal (contrairement a un fichier de conf d’un nom de domaine), il faut donc qu’il soit chargé en premier.
Pour les fichiers de configuration de votre nom de domaine, il doit avoir un préfixe supérieur à 000. Mon fichier de config pour memodugeek.info dans le répertoire site-enabled est nommé 100-memodugeek.info.vhost par exemple.
Maintenant que ça c’est fait, on va récupérer le client Certbot qui est utilisé pour générer les certificats SSL Let’s Encrypt.
2) Création du certificat SSL
Tapez la commande
git clone https://github.com/certbot/certbot.git
.
Rendez vous ensuite dans le répertoire créé. Le client Certbot a besoin d’utiliser le port 80. Il vous faudra donc arrêter Apache le temps de l’opération.
On va donc commencer par couper Apache avec la commande
sudo systemctl stop apache2.service
.
On lance ensuite le client avec la commande
sudo ./certbot-auto certonly -d www.memodugeek.info -d memodugeek.info --rsa-key-size 4096
Certonly va permettre de générer le certificat SSL dans le dossier /etc/letsencrypt/live/.
L’argument -d permet d’indiquer tous les noms de domaines pour lesquels vous voulez un certificat SSL.
Enfin, l’argument –rsa-key-size 4096 va générer une clé RSA de 4096 bits et non pas de 2048 bits comme c’est le cas par défaut.
Aujourd’hui, une clé de 2048 bit n’est plus jugée suffisant par l’ANSII. On va donc passer à 4096 bits.
Une fenêtre va apparaître vous demandant comment vous voulez authentifiez vos nom de domaine, soit via Apache soit via un serveur web temporaire (Standalone). On va choisir le choix Standalone. Si tout c’est bien passé, vous devriez avoir le message suivant
[pastacode lang=”markup” message=”” highlight=”” provider=”manual” manual=”IMPORTANT%20NOTES%3A%0A%20-%20Congratulations!%20Your%20certificate%20and%20chain%20have%20been%20saved%20at%0A%20%20%20%2Fetc%2Fletsencrypt%2Flive%2Fwww.memodugeek.info%2Ffullchain.pem.%20Your%20cert%0A%20%20%20will%20expire%20on%202016-05-15.%20To%20obtain%20a%20new%20version%20of%20the%0A%20%20%20certificate%20in%20the%20future%2C%20simply%20run%20Let’s%20Encrypt%20again.%0A%20-%20If%20you%20like%20Let’s%20Encrypt%2C%20please%20consider%20supporting%20our%20work%20by%3A%0A%0A%20%20%20Donating%20to%20ISRG%20%2F%20Let’s%20Encrypt%3A%20%20%20https%3A%2F%2Fletsencrypt.org%2Fdonate%0A%20%20%20Donating%20to%20EFF%3A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20https%3A%2F%2Feff.org%2Fdonate-le%0A”/]
Si vous allez dans le répertoire /etc/letsencrypt/live/nomdudomaine/ (pour moi c’est /etc/letsencrypt/live/www.memodugeek.info/), vous trouverez 4 fichiers :
- privkey.pem qui est la clé privé SSL
- cert.pem qui est le certificat SSL. (n’est utilisé que par les version d’Apache inférieure à 2.4.8)
- chain.pem qui contient des certificats intermédiaire (n’est utilisé que par les version d’Apache inférieure à 2.4.8)
- fullchain.pem qui est une concaténation des fichier cert.pem et chain.pem (n’est utilisé que par les version d’Apache supérieure ou égale à 2.4.8)
Comme mon serveur a la version 2.4.10 d’Apache installé, je n’utiliserai donc que les fichiers privkey.pem et fullchain.pem. Pour connaître votre version d’Apache, il vous suffit de taper la commande sudo apache2 -v
3) Configuration de Apache
Maintenant, il nous faut modifier les fichiers de config d’Apache pour intégrer le certificat SSL qui se trouve dans le répertoire /etc/letsencrypt/live/www.memodugeek.info/.
On va rajouter le certificat dans le fichier de config SSL principal (le fichier 000-default-ssl.conf) ainsi que dans le fichier de config du nom de domaine (memodugeek.info dans mon cas).
Ouvrez le fichier 000-default-ssl.conf et ajouter les lignes suivantes entre les balises VirtualHost :
[pastacode lang=”apacheconf” manual=”SSLEngine%20on%0ASSLProtocol%20All%20-SSLv2%20-SSLv3%0ASSLCertificateFile%20%20%20%20%2Fetc%2Fletsencrypt%2Flive%2Fnomdedomaine%2Ffullchain.pem%0ASSLCertificateKeyFile%20%2Fetc%2Fletsencrypt%2Flive%2Fnomdedomaine%2Fprivkey.pem%0A” message=”” highlight=”” provider=”manual”/]
Si vous avez une version d’Apache inférieure à la version 2.4.8, il vous faut rajouter ces lignes à la place :
[pastacode lang=”apacheconf” manual=”SSLEngine%20on%0ASSLProtocol%20All%20-SSLv2%20-SSLv3%0ASSLCertificateFile%20%2Fetc%2Fletsencrypt%2Flive%2Fnomdedomaine%2Fcert.pem%0ASSLCertificateKeyFile%20%2Fetc%2Fletsencrypt%2Flive%2Fnomdedomaine%2Fprivkey.pem%0ASSLCertificateChainFile%20%2Fetc%2Fletsencrypt%2Flive%2Fnomdedomaine%2Fchain.pem” message=”” highlight=”” provider=”manual”/]
Pensez à mettre votre nom de domaine à la place de “nomdedomaine”.
Passons au fichier de configuration Apache du nom de domaine maintenant (c’est pas une obligation mais j’ai plusieurs fichier de config au lieu d’en avoir un seul gros, je trouve ça plus clair).
Dans la partie <VirtualHost *:443>, cherchez la balise <IfModule mod_ssl.c> et mettre les lignes suivantes avant </IfModule> (s’il y a déjà des lignes entre ces deux balises, supprimez-les) :
[pastacode lang=”apacheconf” manual=”SSLEngine%20on%0ASSLProtocol%20All%20-SSLv2%20-SSLv3%0ASSLCertificateFile%20%2Fetc%2Fletsencrypt%2Flive%2Fwww.memodugeek.info%2Ffullchain.pem%0ASSLCertificateKeyFile%20%2Fetc%2Fletsencrypt%2Flive%2Fwww.memodugeek.info%2Fprivkey.pem” message=”” highlight=”” provider=”manual”/]
Là aussi, si vous avez une version d’Apache inférieure à 2.4.8 il faudra mettre ces lignes à la place :
[pastacode lang=”apacheconf” manual=”SSLEngine%20on%0ASSLProtocol%20All%20-SSLv2%20-SSLv3%0ASSLCertificateFile%20%2Fetc%2Fletsencrypt%2Flive%2Fnomdedomaine%2Fcert.pem%0ASSLCertificateKeyFile%20%2Fetc%2Fletsencrypt%2Flive%2Fnomdedomaine%2Fprivkey.pem%0ASSLCertificateChainFile%20%2Fetc%2Fletsencrypt%2Flive%2Fnomdedomaine%2Fchain.pem” message=”” highlight=”” provider=”manual”/]
Petite explication rapide de ces lignes :
SSLEngine on
active le SSL.
SSLProtocol All -SSLv2 -SSLv3
autorise toutes les versions du protocole TLS/SSL sauf les version SSLv2 et SSLv3 qui sont de vieilles versions comportant des failles de sécurité.SSLCertificateFile
indique le chemin du certificat SSL.SSLCertificateKeyFile
indique le chemin vers la clé privée.
Redémarrez Apache et c’est tout bon.
4) Le A+ ou rien
Il existe un site qui teste et note les connexions SSL. C’est https://www.ssllabs.com/ssltest/index.html. Avec ce qu’on a modifié, vous devriez avoir B en note. La meilleure note étant A+, on peut améliorer certains trucs.
Ouvrez le fichier /etc/apache2/mods-enabled/ssl.conf
. Les configurations indiquées dans ce fichier seront appliquées à tous les vhosts. Avant la balise </IfModule>, ajoutez les lignes suivantes :
[pastacode lang=”apacheconf” manual=”SSLCipherSuite%20EECDH%2BAESGCM%3AEDH%2BAESGCM%3AAES256%2BEECDH%3AAES256%2BEDH%0ASSLProtocol%20All%20-SSLv2%20-SSLv3%0ASSLHonorCipherOrder%20On%0AHeader%20always%20set%20Strict-Transport-Security%20%22max-age%3D63072000%3B%20includeSubDomains%3B%20preload%22%0AHeader%20always%20set%20X-Frame-Options%20SAMEORIGIN%0AHeader%20always%20set%20X-Content-Type-Options%20nosniff%0A%23%20Requires%20Apache%20%3E%3D%202.4%0ASSLCompression%20off%0ASSLUseStapling%20on%0ASSLStaplingCache%20%22shmcb%3Alogs%2Fstapling-cache(150000)%22%0A” message=”” highlight=”” provider=”manual”/]
Ce code provient du site https://cipherli.st. Si certaines lignes sont déjà présentes (ce qui est fort possible), supprimez-les
Pour les explications sur ces lignes :
- SSLCipherSuite indique les suites cryptographiques qui peuvent être utilisées (des failles de sécurités ont été trouvées sur certaines suites).
- SSLProtocol, on l’a déjà expliqué. Mettre cette ligne ici évite de devoir la mettre dans tous les fichier de configuration des différents vhosts.
- SSLHonorCipherOrder On indique que l’ordre des suites cryptographiques à utiliser est imposer par le serveur, quelque soit la préférence configurer dans le client
- Header always set Strict-Transport-Security (HSTS) sert à indiquer que les connexions doivent se faire en utilisant le https.
- SSLCompression off -> Désactive la compression SSL qui peut provoquer des problèmes
- SSLUseStapling on et SSLStaplingCache permet de vérifier les certificats SSL plus rapidement.
On va faire une dernière modification pour être sûr que toutes les connexions http sont redirigées vers https car le HSTS ne fonctionne pas sur tous les navigateurs.
Dans tous les fichiers vhosts http, il faut rajouter les lignes
[pastacode lang=”apacheconf” manual=”%3CLocation%20%2F%3E%0ARedirect%20%2F%20https%3A%2F%2Fnomdedomaine%2F%0A%3C%2FLocation%3E” message=”” highlight=”” provider=”manual”/]
On redémarre Apache et c’est bon. Si vous refaites le test sur ssllabs, vous devrez maintenant avoir A+.
Ping : Installation d’un certificat SSL Gandi avec une configuration via ISPConfig. » Rock Star Ninja
Ping : Automatisation du renouvellement des certificats Let’s Encrypt | Memo du Geek
Ping : pure-ftpd, SSL et Let's Encrypt sur Debian 8
Ping : Forcer le https sur Debian 8
Ping : Activer http/2 avec Apache - Memo du Geek