Mise en place d'un serveur Apache HTTPS avec OpenSSL · Debian · SISR
On commence par mettre à jour la liste des paquets, puis on installe Apache2.
# Mettre à jour l'index des paquets
apt update
# Installer Apache2 (-y pour répondre "oui" automatiquement)
apt install apache2 -y
On s'assure qu'Apache démarre automatiquement au boot, puis on vérifie son état.
# Activer le démarrage automatique d'Apache au boot
systemctl enable apache2
# Démarrer le service maintenant
systemctl start apache2
# Vérifier l'état du service (doit afficher "active (running)")
systemctl status apache2
Ouvrir le fichier de configuration réseau de Debian :
nano /etc/network/interfaces
Remplacer ou compléter la configuration de l'interface réseau :
# Loopback (ne pas modifier)
auto lo
iface lo inet loopback
# Interface réseau principale
allow-hotplug enp0s3
iface enp0s3 inet static
address 172.17.21.92
netmask 255.255.0.0
gateway 172.17.0.1
auto sur les VM.inet dhcp qui obtient l'IP automatiquement.255.255.0.0 = /16. Définit la plage d'adresses du réseau local.Appliquer la nouvelle configuration sans redémarrer la VM :
# Redémarrer le service réseau pour appliquer la config IP fixe
sudo systemctl restart networking
/etc/network/interfaces et réapplique toutes les configurations d'interfaces. La connexion SSH peut être brièvement interrompue.ip a — l'adresse fixe doit apparaître sur l'interface enp0s3.Trouver l'adresse IP de la VM pour accéder à la page Apache depuis un navigateur.
# Afficher toutes les interfaces réseau et leurs adresses IP
ip a
ip address. Affiche toutes les interfaces réseau avec leur adresse IPv4/IPv6. Chercher l'interface eth0 ou ens33.DocumentRoot est le dossier racine servi par Apache. Par défaut sur Debian : /var/www/html
# Ouvrir le fichier index.html dans l'éditeur nano
nano /var/www/html/index.html
# Supprimer le contenu existant, ajouter :
<h1>Mon serveur Apache fonctionne !</h1>
# Sauvegarder : Ctrl+O → Entrée · Quitter : Ctrl+X
On crée un dossier dédié pour stocker la clé privée et le certificat.
# Créer le dossier ssl dans la configuration Apache
mkdir /etc/apache2/ssl
# Se déplacer dans ce dossier
cd /etc/apache2/ssl
/etc/apache2/ pour regrouper la config SSL avec la config Apache.Une seule commande OpenSSL génère à la fois la clé privée (server.key) et le certificat autosigné (server.crt). Doit être saisie sur une seule ligne.
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/server.key -out /etc/apache2/ssl/server.crt
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:normadi
Locality Name (eg, city) []: ← laisser vide (Entrée)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:sio
Organizational Unit Name (eg, section) []:sio
Common Name (e.g. server FQDN or YOUR name) []:m
Email Address []: ← laisser vide (Entrée)
FR pour France.normadi (Normandie).sio.Confirmer que les deux fichiers ont bien été créés.
# Lister le contenu du dossier ssl avec détails
ls -l /etc/apache2/ssl
# Résultat attendu :
# -rw-r--r-- server.crt → certificat (lisible)
# -rw------- server.key → clé privée (protégée)
-rw-------) — la clé privée ne doit être lisible que par root.Apache fonctionne par modules. Le module SSL n'est pas activé par défaut — il faut l'activer explicitement.
# Activer le module SSL d'Apache
a2enmod ssl
# En cas d'erreur "command not found", corriger le PATH :
nano /etc/environment
# Ajouter ou vérifier la ligne suivante :
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/sbin
/etc/apache2/mods-enabled/. L'inverse est a2dismod./etc/environment.Un VirtualHost est un bloc de configuration qui définit comment Apache répond sur un port ou domaine donné. On en crée un dédié au HTTPS sur le port 443.
# Créer le fichier de configuration du site sécurisé
nano /etc/apache2/sites-available/site-secure.conf
Contenu du fichier de configuration :
# Condition : n'appliquer cette config que si le module SSL est chargé
<IfModule mod_ssl.c>
# VirtualHost écoutant sur le port HTTPS (443)
<VirtualHost *:443>
# Nom du serveur (IP ou nom de domaine)
ServerName 172.17.219.78
# Dossier racine des fichiers web servis
DocumentRoot /var/www/html
# Active le moteur SSL/TLS pour ce VirtualHost
SSLEngine on
# Chemin vers le certificat (fichier public)
SSLCertificateFile /etc/apache2/ssl/server.crt
# Chemin vers la clé privée (fichier secret)
SSLCertificateKeyFile /etc/apache2/ssl/server.key
# Fichiers de logs
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
</IfModule>
mod_ssl n'est pas chargé, évitant une erreur au démarrage d'Apache.* = toutes les interfaces réseau. 443 = port HTTPS standard. Apache écoute les connexions chiffrées sur ce port.Activer le site crée un lien symbolique, puis on redémarre Apache pour appliquer les changements.
# Activer le site (crée un lien dans sites-enabled/)
a2ensite site-secure.conf
# Redémarrer Apache pour prendre en compte le nouveau VirtualHost
systemctl restart apache2
sites-available/ vers sites-enabled/. Apache ne lit que les fichiers dans sites-enabled/.reload qui ne suffit pas toujours).Avant de redémarrer, toujours valider la syntaxe de la configuration pour éviter qu'Apache refuse de démarrer.
# Tester la syntaxe de toute la configuration Apache
apachectl configtest
# Si le résultat est "Syntax OK" → redémarrer
systemctl restart apache2
# Si erreur : lire le message, corriger le fichier indiqué, relancer
configtest retourne une erreur, ne pas redémarrer Apache — corriger d'abord le fichier indiqué dans le message d'erreur, puis relancer le test.Apache tient deux fichiers de log principaux. Ils sont essentiels pour diagnostiquer les problèmes.
# Afficher les 10 dernières lignes du log d'accès
# (toutes les requêtes HTTP/HTTPS reçues)
tail -n 10 /var/log/apache2/access.log
# Afficher les 10 dernières lignes du log d'erreurs
# (erreurs de config, SSL, fichiers manquants...)
tail -n 10 /var/log/apache2/error.log
-f pour un suivi en temps réel : tail -f /var/log/apache2/error.logDésactiver temporairement le module SSL pour observer le comportement d'erreur dans les logs.
# Désactiver le module SSL
a2dismod ssl
# Redémarrer Apache (le site HTTPS ne fonctionnera plus)
systemctl restart apache2
# Observer l'erreur dans les logs
tail -n 20 /var/log/apache2/error.log
# ─────────────────────────────────────────────────
# Réactiver le module SSL et relancer Apache
a2enmod ssl
systemctl restart apache2
SSLEngine → le site HTTPS devient inaccessible.Identifier quelles versions de TLS sont négociées entre le client et le serveur.
# Tester si le serveur supporte TLS 1.2
openssl s_client -connect localhost:443 -servername localhost -tls1_2 2>/dev/null | grep Protocol
# Tester si le serveur supporte TLS 1.3
openssl s_client -connect localhost:443 -servername localhost -tls1_3 2>/dev/null | grep Protocol
localhost:443 = tester le serveur local sur le port HTTPS./dev/null (poubelle) pour n'afficher que les résultats utiles.TLS 1.0 et 1.1 ont des vulnérabilités connues (BEAST, POODLE). On les désactive pour ne garder que TLS 1.2 et 1.3.
# Éditer la configuration SSL globale d'Apache
nano /etc/apache2/mods-available/ssl.conf
Trouver la ligne SSLProtocol et la remplacer par :
# -all : désactive toutes les versions
# +TLSv1.2 +TLSv1.3 : réactive uniquement ces deux versions
SSLProtocol -all +TLSv1.2 +TLSv1.3
# Appliquer les changements
systemctl restart apache2
Lister les algorithmes de chiffrement disponibles, puis restreindre aux suites recommandées.
# Lister tous les chiffrements supportés (en excluant les faibles)
openssl ciphers -v 'ALL:!ADH:!LOW:!EXP:!MD5:!3DES:!PSK:!SRP'
Renforcer la configuration dans le VirtualHost ou ssl.conf :
# Restreindre aux chiffrements forts (recommandation ANSSI)
SSLCipherSuite HIGH:!aNULL:!MD5
# Le serveur impose son ordre de préférence (pas celui du client)
SSLHonorCipherOrder on
Tout utilisateur qui arrive en HTTP (port 80) est automatiquement redirigé vers HTTPS (port 443). Indispensable en production.
# Activer le module de réécriture d'URL
sudo a2enmod rewrite
# Éditer le VirtualHost HTTP (port 80)
nano /etc/apache2/sites-available/000-default.conf
Remplacer le contenu du VirtualHost *:80 par :
<VirtualHost *:80>
ServerName 172.17.219.78
DocumentRoot /var/www/html
# Activer le moteur de réécriture
RewriteEngine On
# Règle : toute requête HTTP → redirection 301 vers HTTPS
# ^ = depuis la racine, %{HTTP_HOST} = le nom de domaine, %{REQUEST_URI} = le chemin
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
^ correspond au début de l'URL, donc toutes les URL. Toutes les requêtes HTTP sont redirigées.L = Last (stopper l'évaluation des autres règles), R=301 = redirection permanente (Moved Permanently). Le navigateur met en cache cette redirection.# Appliquer sans couper les connexions actives
systemctl reload apache2
# Vérifier que les ports 80 et 443 sont bien ouverts
ss -tuln | grep -E '80|443'
-t TCP, -u UDP, -l listening, -n sans résolution DNS. HTTP:80 et HTTPS:443 doivent apparaître.| Élément | À retenir |
|---|---|
| Certificat autosigné | Valide en développement/test. En production → Let's Encrypt ou CA reconnue |
| -nodes | Clé non chiffrée → Apache démarre sans mot de passe. Risque : la clé est lisible en clair |
| Placement des fichiers | /etc/apache2/ssl/ pour les certificats · /var/www/html/ pour les fichiers web |
| Ports | HTTP : 80 · HTTPS : 443 |
| TLS 1.0 / 1.1 | Désactiver — vulnérabilités connues (BEAST, POODLE) |
| SSLProtocol | -all +TLSv1.2 +TLSv1.3 uniquement |
| Logs | error.log = erreurs · access.log = toutes les requêtes |
| Renouveler le cert. | Relancer la commande openssl avec les mêmes chemins (question 14) |
a2enmod ssl) et créer le VirtualHost :443a2ensite) et tester en HTTPSBTS SIO SISR — Systèmes · Apache TLS · Certificat autosigné · Debian