Contexte
Cet article à pour but de servir de base pour l'installation d'un serveur web sous Apache2 avec un certificat SSL.
Let's Encrypt est utilisé et la résolution du challenge se fera sur le port 666 (donc sans interruption de service).
Réalisé sous Debian 11
Installation Apache2
Installation du serveur web apache2 :
sudo apt install apache2
Modification du fichier /etc/apache2/apache2.conf
comme suit :
# Les variables d'environnement sont définies dans /etc/apache2/envvars
DefaultRuntimeDir ${APACHE_RUN_DIR}
PidFile ${APACHE_PID_FILE}
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
HostnameLookups Off
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
Include ports.conf
<Directory />
# Pas de suivi des liens symboliques
Options -FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
<Directory /var/www/>
# Pas de listage des fichiers du site mais ok pour le suivi des liens symboliques
Options -Indexes +FollowSymLinks
AllowOverride None
Require all granted
</Directory>
AccessFileName .htaccess
<FilesMatch "^\.ht">
Require all denied
</FilesMatch>
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
IncludeOptional conf-enabled/*.conf
IncludeOptional sites-enabled/*.conf
Modification du fichier /etc/apache2/ports.conf
comme suit :
# Ecoute sur le port 80 et 443
Listen 80
Listen 443
Modification du fichier /etc/apache2/conf-available/security.conf
comme suit :
# Definit les informations du serveur retourné par l'en-tête HTTP
ServerTokens Prod
# Serveur version et nom du vhost désactivés
ServerSignature Off
TraceEnable Off
Activation des modules de bases :
sudo a2enmod rewrite actions headers expires ssl
Activation du site par défaut en SSL :
sudo a2ensite default-ssl
Redémarrage du serveur web apache2 :
sudo systemctl restart apache2
A ce stade, le serveur web doit être accessible : http://ip_srv_web/ et https://ip_srv_web/ (erreur de certificat)
Une fois cette vérification faites, désactivation des sites par défaut :
sudo a2dissite 000-default default-ssl
Puis rechargement de la configuration du serveur web :
sudo systemctl reload apache2
Certificat SSL
Installation de Let's Encrypt :
sudo apt install letsencrypt
Modification du fichier /etc/apache2/mods-available/proxy.conf
comme suit :
# Permet d'effectuer les challenges acme sur le port 666
<IfModule mod_proxy.c>
ProxyPass "/.well-known/acme-challenge/" "http://127.0.0.1:666/.well-known/acme-challenge/" retry=1
ProxyPassReverse "/.well-known/acme-challenge/" "http://127.0.0.1:666/.well-known/acme-challenge/"
<Location "/.well-known/acme-challenge/">
ProxyPreserveHost On
Order allow,deny
Allow from all
Require all granted
</Location>
</IfModule>
Activation des modules nécessaires :
sudo a2enmod proxy proxy_http ssl
Redémarrer le serveur web apache2 :
sudo systemctl restart apache2
Edition de la crontab pour le renouvellement automatique du certificat :
sudo crontab -e
Indiquer un renouvellement tous les dimanche à 5h00 du matin :
# Autorenew let's encrypt cert
00 05 * * 0 letsencrypt renew --standalone --preferred-challenges http-01 --http-01-port 666
Générer le certificat :
sudo letsencrypt certonly -d "monsite.example.org" --standalone --preferred-challenges http-01 --http-01-port 666 -m monadresse@email.org --agree-tos -n
Au préalable, un enregistrement DNS correspondant à mon site.example.org a été fait dans la zone DNS example.org.
Configuration vhost
Création du fichier /etc/apache2/sites-available/monsite.example.org.conf
:
# Example pour le site : monsite.example.org
# DirectoryRoot : /var/www/monsite.example.org/www/
# Les logs seront dans /var/log/apache2/
<VirtualHost *:80>
ServerName monsite.example.org
Redirect Permanent / https://monsite.example.org/
</VirtualHost>
<VirtualHost *:443>
ServerName monsite.example.org
LogLevel warn
ErrorLog "|/usr/bin/rotatelogs -lc /var/log/apache2/error.monsite.example.org.%Y.%m.%d 86400"
CustomLog "|/usr/bin/rotatelogs -lc /var/log/apache2/access.monsite.example.org.%Y.%m.%d 86400" combined
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/monsite.example.org/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/monsite.example.org/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/monsite.example.org/chain.pem
DocumentRoot /var/www/monsite.example.org/www
<Directory /var/www/monsite.example.org/www/>
Require all granted
AllowOverride All
DirectoryIndex index.html
</Directory>
</VirtualHost>
SSLProtocol -all +TLSv1.2
SSLCipherSuite +HIGH:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-CHACHA20-POLY1305-D:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305-D:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305-D:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA
SSLHonorCipherOrder on
SSLCompression off
SSLSessionTickets off
Création de l'arborescence du site :
sudo mkdir -p /var/www/monsite.example.org/www/
Déplacer le fichier index.html
de base à des fins de test :
sudo mv /var/www/html/index.html /var/www/monsite.example.org/www/
Attribuer les droits pour www-data
:
sudo chown -R www-data:www-data /var/www/
Activation du site monsite.example.org
:
sudo a2ensite monsite.example.org
Recharger le serveur web apache2 :
sudo systemctl reload apache2
Vérification
Si tout c'est bien passé, le site monsite.example.org
doit être accessible à l'adresse https://monsite.example.org sans erreur de certificat.
L'URL http://monsite.example.org doit rediriger vers https://monsite.example.org
Pour tester le renouvellement du certificat SSL sur le port 666 :
sudo letsencrypt renew --standalone --preferred-challenges http-01 --http-01-port 666 --dry-run
Sujet non abordé
- Les règles de pare-feu