Obtenir, gérer et renouveler ses certificats de sécurité SSL automatiquement sous Apache avec le module Mod_md (fonctionne sous Linux).
ATTENTION ! La version 2.4.30 minimum de Apache est nécessaire !
Introduction
Préparer la config Apache
Créer un Alias afin d'autoriser L'accès à Lets Encrypt
Créer un Vhost afin d'obtenir notre premier certificat
Procéder à un premier test
Vérifier et contrôler les certificats
(Haut de page)- IntroductionDans ce nouveau tuto, vous l'aurez compris, nous allons encore parler de certificats de sécurité.
Mais cette fois, avec les évolutions de Apache et de leurs contributeurs, nous n'aurons plus à nous occuper de nos certificats, Apache le fera à notre place !
Oui, vous avez bien lu. Nous allons confier nos certificats de sécurité à Apache et il se chargera de les gérer et renouveler en toute transparence.
Pour commencer, sachez que Apache est livré avec le module
mod_md depuis la version
2.4.30 et c'est ce module que nous utiliserons.
Si vous pensez ne pas avoir besoin de ce tuto ou si vous souhaitez prendre connaissance de ce que peut bien faire le module
mod_md, penchez-vous donc sur la
documentation Apache concernant le module mod_md.
N'ayez pas peur ! Il s'agit là d'un tuto, tout vous sera expliqué le plus simplement du monde.
Sachez que ce tuto s'adresse aux machines Windows utilisant Wamp.
Ceci dit, rien ne vous empêche de vous en inspirer pour une machine fonctionnant sous Linux, la souplesse de Apache le permet. Il vous suffira juste de modifier les chemins Windows vers des chemins Unix dans les exemples donnés.Vous êtes prêts ? Allons-y !
D'avance, toutes mes excuses aux Linuxiennes et Linuxiens. Ce tuto parle brièvement de vous, vous devriez y arriver si vous n'êtes pas un débutant.
(Haut de page)- Préparer ApacheDans tous les exemples présentés, nous utiliserons Wamp avec Apache 2.4.41 et PHP 7.1.16Si vous utilisez une autre version de Apache/PHP, vous n'aurez qu'à simplement modifier celle-ci dans les exemples.
Tout d'abord, nous allons créer un dossier nommé
MD dans le dossier de
Wamp, C:\wamp\mdMD signifie simplement Management Domains (gestion des domaines).
Rendez-vous donc dans le dossier
C:\wamp et créez le dossier
MD.
Dans ce dossier
C:\wamp\MD, créez le dossier
\challenges. Ca nous donnera
C:\wamp\MD\challengesDans ce même dossier
C:\wamp créez le dossier
md-scripts. C'est ce dossier que nous utiliserons pour placer nos scripts PHP chargés de redémarrer Wamp lorsqu'un certificat et créé ou renouvelé.
(Haut de page)- Préparer la config ApacheCette fois, vous allez pouvoir utiliser l'interface de Wamp en partie, mais le plus emmerdant se fera à la main...
Cliquez sur l'icone Wamp et activez les modules
MD,
Status et
Watchdog.
Si vous n'aviez pas le module
mod_md et qu'il n’apparaît pas, redémarrez Wamp et recommencez après avoir ajouté cette ligne dans
httpd.conf : (Attention ! Ce tuto n'a pas été testé sur de vieilles version d'Apache n'ayant pas ce module)
LoadModule md_module modules/mod_md.so
Sous Linux, vous devrez activer ces modules dans le
httpd.conf de la façon décrite ci-dessus.
Maintenant, intéressons nous à une petite configuration qui nous permettra "d'ausculter" l'état des certificats gérés par Apache et de préparer leur traitement par le module
mod_md.
Ouvrez le fichier
C:\wamp\bin\apache\apache2.4.41\conf\httpd.conf (changez le N° de version de Apache selon votre version).
En toute fin de fichier, ajoutez ceci :
<IfModule mod_status.c>
<Location "/server-status">
SetHandler server-status
Require local
</Location>
<IfModule mod_md.c>
<Location "/md-status">
SetHandler md-status
Require local
</Location>
</IfModule>
</IfModule>
<IfModule mod_md.c>
MDBaseServer off
MDCAChallenges http-01
MDCertificateAgreement accepted
MDCertificateAuthority https://acme-v02.api.letsencrypt.org/directory
MDCertificateProtocol ACME
MDCertificateStatus on
# MDMessageCmd C:/Wamp/Bin/Php/php7.1.16/php.exe C:/Wamp/md-scripts/message.php
# MDNotifyCmd C:/Wamp/Bin/Php/php7.1.16/php.exe C:/Wamp/md-scripts/notify.php
MDMustStaple on
MDPortMap http:80 https:443
MDPrivateKeys RSA 4096
MDRenewMode always
MDRenewWindow 30d
MDRequireHttps temporary
MDStoreDir "C:/wamp/MD"
</IfModule>
Vous l'aurez remarqué, il existe deux lignes en commentaire. Tout d'abord, changez pour votre version de PHP.
Ensuite, nous reviendrons sur ces lignes plus loin. C'est ces lignes qui permettent de recharger Apache lorsqu'un certificat est créé/renouvelé.
Concernant
/server-status et
/md-status, si vous ne connaissez pas le
module status, on en reparlera plus loin aussi.
Pour les Linuxiens, vous modifierez les chemins, rien de bien sorcier.
(Haut de page)- Créer un Alias afin d'autoriser L'accès à Lets EncryptSi nous voulons un certificat, il va falloir que Lets Encrypt puisse accéder à notre serveur Apache. Il ne peut pas en être autrement.
Le module
mod_md créera des fichiers de signature que Lets Encrypt voudra consulter pour validation. Ca se passe toujours comme ça, Lets Encrypt accède au site à la recherche des fichiers de signature d'un domaine et ce, sur tous les serveurs de la planète.
La seule alternative est la validation DNS, mais ce module ne l'a propose pas pour l'instant.
Rendez-vous dans le dossier
C:\wamp\alias. Si le fichier
lets-encrypt.conf n'existe pas, créez le.
Ouvrez ce fichier en édition et, si il contient quelque chose, remplacez son contenu par ceci (sinon remplissez le avec ce qui suit) :
Alias /.well-known/acme-challenge "C:\wamp\MD\challenges"
<directory "C:\wamp\MD\challenges">
Options -Indexes
AllowOverride none
Require all granted
</Directory>
L'avantage d'un alias pointant sur un autre dossier que votre dossier
WWW est que vous n'aurez pas à vous farcir des contrôles d'accès longs et pénibles à mettre en place.
En terme de sécurité, c'est beaucoup plus efficace !
Sous Wamp, ce fichier sera chargé automatiquement au démarrage du serveur.
Sous Linux, vous devrez ajouter une entrée vers ce fichier dans
httpd.conf(Haut de page)- Créer un Vhost afin d'obtenir notre premier certificatCette fois, nous y sommes presque, il ne reste plus qu'à créer un Vhost et les dossiers du domaine qui accueilleront le certificat.
Nous allons demander un certificat pour le domaine
chez-alex.fr, ce domaine possédera les sous domaine
www.chez-alex.fr et
mail.chez-alex.frDans le dossier
C:\wamp\MD créez le dossier
chez-alex.fr qui recevra notre certificat et sa clé.
Ouvrez le dossier
C:\wamp\bin\apache\apache2.4.41\conf\extra et créez un fichier texte portant le nom de votre Vhost :
chez-alex.fr.confOuvrez ce fichier en édition et placez ce qui suit dedans :
<MDomain chez-alex.fr>
MDCertificateFile "C:/wamp/MD/chez-alex.fr/pubcert.pem"
MDCertificateKeyFile "C:/wamp/MD/chez-alex.fr/privkey.pem"
</MDomain>
<VirtualHost *:443>
ServerName chez-alex.fr
ServerAlias www.chez-alex.fr
ServerAlias mail.chez-alex.fr
DocumentRoot "C:/wamp/www"
SSLEngine on
<directory C:/wamp/www>
<IfModule mod_headers.c>
# HSTS
#Header always set Strict-Transport-Security "max-age=15552000"
# secured cookies
#Header always edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure
</IfModule>
</directory>
</VirtualHost>
Ajoutez autant de directives Apache
ServerAlias que vous avez de sous domaines. Le certificat sera demandé pour le domaine (ServerName) et les sous domaine (ServerAlias).
Ré-ouvrez le fichier
http.conf, puis, en toute fin de fichier, ajoutez la ligne :
Include conf/extra/chez-alex.fr.conf
Include conf/extra/ssl-proto-ciphers.conf
Vous avez repéré la dernière ligne parlant du fichier
ssl-proto-ciphers.conf ? Bravo ! Effectivement, nous avons besoin de "calibrer" la connexion SSL.
Créez le fichier
ssl-proto-ciphers.conf dans le même dossier que votre Vhost et placez ceci dedans :
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 +TLSv1.3 +TLSv1.2
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256
ProtocolsHonorOrder on
SSLHonorCipherOrder on
SSLCompression off
SSLSessionTickets on
SSLInsecureRenegotiation off
<IfModule mod_md.c>
MDStapling on
MDStapleOthers off
</IfModule>
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
SSLStaplingFakeTryLater on
SSLStaplingCache shmcb:C:/Windows/Temp/OCSPstapling_cache(128000)
SSLSessionCache shmcb:C:/Windows/Temp/ssl_scache(512000)
SSLSessionCacheTimeout 300
#SSLOpenSSLConfCmd DHParameters "C:/wamp/bin/apache/apache2.4.41/conf/extra/dh-4096.key"
#Protocols h2 h2c http/1.1
#Protocols h2 h2c
Protocols h2 http/1.1
#Protocols h2
H2Push Off
L'avantage d'avoir la configuration SSL dans un fichier séparé, c'est que vous pouvez créer autant de Vhost que vous le souhaitez, ils auront tous la même configuration.
Bien entendu, vous modifierez les noms de dossiers en fonction de votre version de Apache et du nom de votre domaine.
Et voilà, nous avons terminé ! Presque...
Attention ! Nous allons rencontrer un problème si vous redémarrez Apache de suite.
(Haut de page)- Procéder à un premier testComme déjà dit, si nous relançons Apache de suite, nous allons avoir un problème.
En effet, Apache va chercher les fichiers
C:/wamp/MD/chez-alex.fr/pubcert.pem et
C:/wamp/MD/chez-alex.fr/privkey.pem et il ne les trouvera pas. Apache ne pourra donc pas démarrer...
Je pense qu'il s'agit là d'un bug du module
mod_md qui, normalement, devrait créer les certificats avant le démarrage de Apache.
Ca ne pose pas de réel problème. Il suffit de placer n'importe quel certificat wildcard auto-signé et sa clé dans le dossier et quand Apache sera lancé, il créera les certificats voulus. Le certificat auto-signé sera uniquement un wildcard, pas de domaine désigné, sinon Apache se braquera en remarquant que les noms ne correspondent pas !
Ne paniquez pas ! Cerise sur le gâteau, votre serviteur a créé un certificat et une clé que vous n'avez plus qu'à télécharger et placer dans le dossier du domaine.
Ca se passe ici :
Le certificatLa clé du certificatPlacez ces 2 fichiers dans le dossier du domaine
C:/wamp/MD/chez-alex.fr/ (ou le nom que vous aurez choisi) et redémarrez Apache de Wamp.
Apache démarre correctement ? Alors vous devriez bientôt obtenir votre "vrai" certificat en remplacement de ceux présents !
(Haut de page)- Vérifier et contrôler les certificatsIl ne nous reste plus qu'à contrôler que nous allons bien obtenir notre certificat.
Grâce au module
mod_status nous allons voir ce qui se passe sur notre serveur.
Allons-y :
http://localhost/server-status/Je vous laisse découvrir la page pleine d'infos qui se présente à vous, seuls les domaines SSL nous intéressent.
Si votre serveur vient de (re)démarrer, vous devriez avoir un aperçu comme celui-ci :
Cette information signifie que votre certificat est en train d'être créé/renouvelé.
Si tout se passe bien, vous obtiendrez ceci :
Là, Apache vous informe simplement qu'il doit être redémarré pour prendre en compte le nouveau certificat.
Allez-y, redémarrez Apache et vous obtiendrez cette dernière info :
Maintenant, Apache nous dit que tout va bien.
Et voilà, vous avez obtenu votre certificat, et maintenant, c'est Apache qui se chargera de le renouveler tout seul comme un grand !
Je parie que vous n'avez pas oublié les deux scripts PHP dont il était question au début et dont on devait reparler.
J'ai bien tout tenté, mais il n'est pas possible de redémarrer Apache depuis un script appelé par Apache lui même (sous Windows).
Si vous avez la combine pour redémarrer Apache, je compte sur vous pour me passer l'info.
Ceci dit, la plupart des internautes ne seront pas gênés, vu que l'ordinateur est éteint le soir et rallumé le lendemain. C'est l'équivalent d'un redémarrage de Apache et ces internautes n'auront plus à s'occuper de leurs certificats.
N'hésitez pas à consulter la
documentation Apache, la
documentation Github du projet Manage Domains (MD) et à revenir m'en apprendre un peu plus.
De plus, je vous laisse découvrir ce que le status de
md-status vous fournira comme informations.
ATTENTION !En fonction de votre box, il vous faudra certainement rediriger les ports 80 & 443 vers la machine sur laquelle est installé Wamp.
Sur ce point précis, je ne peux pas vous aider. Chaque box possède ses spécificités propres, je ne peux pas donner l'astuce pour toutes les box.
D'autant plus que la France n'est pas le seul pays à nous lire. Ca représente des centaines de box !