Débattre > Informatique, programmation, geek attitude...

Tuto : Obtenir, gérer et renouveler ses certificats SSL automatiquement sous Apache avec le module Mod_md

(1/3) > >>

alex:





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)
- Introduction
Avertissement :ATTENTION !
Pour avoir des certificats de sécurité "officiels" sous Wamp, il est indispensable de posséder un nom de domaine ou un sous domaine qui pointe vers votre machine, sinon ça ne marchera pas !
N'espérez pas obtenir un certificat de Lets Encrypt pour localhost ou un autre domaine contenu dans votre fichier hosts. Il faut impérativement des enregistrements DNS pour votre (sous) domaine !

Vous pouvez obtenir jusqu'à 3 sous domaines gratuits se mettant à jour avec l'IP de votre machine automatiquement chez www.noip.com
Il existe également Freenom, mais je le déconseille, ils confisquent les domaines quand ça leur chante : www.freenom.com


Dans 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 Apache

Dans tous les exemples présentés, nous utiliserons Wamp avec Apache 2.4.41 et PHP 7.1.16
Si 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\md
MD 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\challenges
Dans 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 Apache

Cette 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)

--- Code: (apache) ---LoadModule md_module modules/mod_md.so
--- Fin du code ---
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 :

--- Code: (html) ---<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>
--- Fin du code ---
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 Encrypt

Si 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) :


--- Code: ---Alias /.well-known/acme-challenge "C:\wamp\MD\challenges"

<directory "C:\wamp\MD\challenges">
Options -Indexes
AllowOverride none
Require all granted
</Directory>

--- Fin du code ---
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 certificat

Cette 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.fr

Dans 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.conf
Ouvrez ce fichier en édition et placez ce qui suit dedans :


--- Code: ---<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>

--- Fin du code ---
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 :

--- Code: ---Include conf/extra/chez-alex.fr.conf
Include conf/extra/ssl-proto-ciphers.conf
--- Fin du code ---
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 :


--- Code: ---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

--- Fin du code ---
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 test

Comme 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 certificat
La clé du certificat

Placez 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 certificats

Il 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 ! ::)


alex:
Le monde animal s'exprime sur ce tuto :


Waaaaaah !



lagrace:
bonjour Alex

voila avec la chance que j ai rien ne fonctionne pour moi apache ne demarre pas je te joint l erreur que j ai pourtant j ai relus et relus sans cesse ton magnifique tuto desole


--- Code: ---State of services:

 The service 'wampapache64' is NOT started
 EXIT error code:1066
 Help message for error code 1066 is:Le service a renvoyé un code d'erreur qui lui est spécifique.
>>> Invalid command 'H2Push', perhaps misspelled or defined by a module not included in the server configuration     .
>>> AH00526: Syntax error on line 29 of C:/wamp64/bin/apache/apache2.4.43a/conf/extra/ssl-proto-ciphers.conf:     .

 The service 'wampmariadb64' is started
 Service Session : LocalSystem

WampServer (Apache, PHP and MySQL) will not function properly if any service
'wampapache64'
'wampmariadb64'
 is not started.

all services BINARY_PATH_NAME are OK

--- Fin du code ---

Otomatic:
Bonjour,

Faut aller voir la ligne 29 du fichier C:/wamp64/bin/apache/apache2.4.43a/conf/extra/ssl-proto-ciphers.conf

Apache dit qu'il y a une erreur !

alex:
Voilà, Oto a répondu.
C'est ton fichier ssl-proto-ciphers.conf à la ligne 29 qui fout la merde. :iq:

Navigation

[0] Index des messages

[#] Page suivante

Utiliser la version classique