Debian 11 / 12 Apache 2 OpenSSL TLS 1.2 / 1.3
🔒

Apache TLS — Certificat autosigné

Mise en place d'un serveur Apache HTTPS avec OpenSSL · Debian · SISR

📚 Matière
SISR
📅 Date
18 décembre 2025
☑️ État
✓ Terminé
🖥️ Système
Debian 11 ou 12
🔑 Accès requis
root / sudo

🎯
Objectifs : Installer et configurer Apache2 · Générer un certificat TLS autosigné avec OpenSSL · Configurer un VirtualHost en HTTPS · Tester le fonctionnement et analyser les logs
📋 Table des matières
§1Installation et vérification d'Apache2 §1bConfiguration de l'interface en IP fixe §2Génération d'un certificat autosigné §3Configuration du VirtualHost HTTPS §4Tests et analyse des logs §5Sécurisation TLS (durcissement) §6Redirection HTTP → HTTPS Conclusion
01
🔵 Installation et vérification d'Apache2
Installation · Démarrage · Test HTTP initial
1.1 Installation d'Apache2

On commence par mettre à jour la liste des paquets, puis on installe Apache2.

bash — root
# Mettre à jour l'index des paquets
apt update

# Installer Apache2 (-y pour répondre "oui" automatiquement)
apt install apache2 -y
  • apt updateSynchronise la liste des paquets disponibles depuis les dépôts. À faire avant toute installation.
  • -yRépond automatiquement "oui" à toutes les confirmations d'installation.
1.2 Vérification et activation du service Question 1 & 2

On s'assure qu'Apache démarre automatiquement au boot, puis on vérifie son état.

bash — root
# 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
  • enableCrée un lien symbolique pour lancer Apache automatiquement à chaque démarrage du système.
  • startLance le service immédiatement, sans attendre un redémarrage.
  • statusAffiche l'état en temps réel : active (running) = tout va bien. Affiche aussi les derniers logs.
1b
⚙️ Configuration de l'interface en IP fixe
À faire avant le test HTTP · /etc/network/interfaces
💡
Un serveur Apache doit avoir une IP fixe pour être joignable de façon stable. Sans IP fixe, l'adresse peut changer au prochain redémarrage et le certificat SSL deviendra invalide (le CN ne correspondra plus).
1b.1 Éditer le fichier interfaces

Ouvrir le fichier de configuration réseau de Debian :

bash — root
nano /etc/network/interfaces

Remplacer ou compléter la configuration de l'interface réseau :

/etc/network/interfaces
# 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
  • allow-hotplugActive l'interface automatiquement dès qu'un câble est branché ou que la VM démarre. Préférable à auto sur les VM.
  • inet staticDéclare une configuration IP statique (fixe), par opposition à inet dhcp qui obtient l'IP automatiquement.
  • addressL'adresse IP fixe attribuée à ce serveur. C'est cette IP qui sera utilisée dans le Common Name du certificat SSL.
  • netmaskMasque de sous-réseau. Ici 255.255.0.0 = /16. Définit la plage d'adresses du réseau local.
  • gatewayAdresse du routeur. Toutes les connexions vers l'extérieur du réseau passent par lui.
⚠️
Adapter ces valeurs à ton environnement : Interface : enp0s3 · IP : 172.17.21.92 · Masque : 255.255.0.0 · Passerelle : 172.17.0.1
1b.2 Relancer le service réseau

Appliquer la nouvelle configuration sans redémarrer la VM :

bash — root
# Redémarrer le service réseau pour appliquer la config IP fixe
sudo systemctl restart networking
  • restart networkingRelit /etc/network/interfaces et réapplique toutes les configurations d'interfaces. La connexion SSH peut être brièvement interrompue.
Vérifier la nouvelle IP avec ip a — l'adresse fixe doit apparaître sur l'interface enp0s3.
1.3 Test du fonctionnement HTTP Question 3

Trouver l'adresse IP de la VM pour accéder à la page Apache depuis un navigateur.

bash
# Afficher toutes les interfaces réseau et leurs adresses IP
ip a
  • ip aRaccourci de ip address. Affiche toutes les interfaces réseau avec leur adresse IPv4/IPv6. Chercher l'interface eth0 ou ens33.
🌐
Ouvrir un navigateur et accéder à http://[VOTRE_IP]/. La page par défaut Apache doit s'afficher.
1.4 DocumentRoot et page de test Questions 4 & 5

DocumentRoot est le dossier racine servi par Apache. Par défaut sur Debian : /var/www/html

bash — root
# 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
  • nanoÉditeur de texte en terminal. Simple à utiliser : Ctrl+O pour sauvegarder, Ctrl+X pour quitter.
Rafraîchir la page dans le navigateur → le message doit apparaître.
02
🟠 Génération d'un certificat autosigné
OpenSSL · Clé privée + Certificat x509 · 365 jours
2.1 Création du répertoire SSL

On crée un dossier dédié pour stocker la clé privée et le certificat.

bash — root
# Créer le dossier ssl dans la configuration Apache
mkdir /etc/apache2/ssl

# Se déplacer dans ce dossier
cd /etc/apache2/ssl
  • mkdirCrée un nouveau répertoire. Ici on le place dans /etc/apache2/ pour regrouper la config SSL avec la config Apache.
2.2 Génération de la clé privée et du certificat Question 6

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.

bash — root
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/server.key -out /etc/apache2/ssl/server.crt
  • reqSous-commande OpenSSL pour gérer les demandes de certificat (CSR) et les certificats x509.
  • -x509Génère directement un certificat autosigné au lieu d'une demande de signature (CSR). Pas besoin d'autorité de certification.
  • -nodes"No DES" — La clé privée n'est PAS chiffrée par un mot de passe. Indispensable pour qu'Apache puisse démarrer automatiquement sans intervention humaine.
  • -days 365Le certificat est valide pendant 365 jours (1 an). Après cette date, le navigateur affichera une erreur de certificat expiré.
  • -newkey rsa:2048Génère simultanément une nouvelle clé RSA de 2048 bits. Taille recommandée — offre un bon équilibre sécurité/performance.
  • -keyoutChemin de sortie pour la clé privée (server.key). Doit rester confidentielle — ne jamais la partager.
  • -outChemin de sortie pour le certificat (server.crt). C'est lui qui est envoyé au navigateur pour s'identifier.
📝
Après la génération des clés, OpenSSL demande des informations pour le certificat. Renseigner comme suit :
OpenSSL — Informations du certificat
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)
  • Country NameCode pays ISO sur 2 lettres. FR pour France.
  • StateRégion ou province. Ici normadi (Normandie).
  • LocalityVille. Peut être laissé vide — appuyer sur Entrée.
  • OrganizationNom de l'organisation. Ici sio.
  • Common NameChamp le plus important — doit correspondre à l'IP ou au nom de domaine du serveur. Le navigateur vérifie ce champ lors de la connexion HTTPS.
  • Email AddressPeut être laissé vide — appuyer sur Entrée.
2.3 Vérification des fichiers générés

Confirmer que les deux fichiers ont bien été créés.

bash
# 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)
  • ls -lAffiche la liste détaillée : permissions, propriétaire, taille, date. Vérifier que server.key a des permissions restrictives (-rw-------) — la clé privée ne doit être lisible que par root.
03
🟣 Configuration du VirtualHost HTTPS
Activation SSL · VirtualHost port 443 · Application
3.1 Activation du module SSL

Apache fonctionne par modules. Le module SSL n'est pas activé par défaut — il faut l'activer explicitement.

bash — root
# 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
  • a2enmodApache2 Enable Module. Crée un lien symbolique dans /etc/apache2/mods-enabled/. L'inverse est a2dismod.
  • sslLe module SSL/TLS d'Apache. Sans lui, toute directive SSLEngine ou SSLCertificate sera ignorée.
⚠️
Redémarrer la VM si le problème de PATH persiste après modification de /etc/environment.
3.2 Création du VirtualHost HTTPS (port 443) Questions 7

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.

bash — root
# Créer le fichier de configuration du site sécurisé
nano /etc/apache2/sites-available/site-secure.conf

Contenu du fichier de configuration :

apache — site-secure.conf
# 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>
  • IfModuleSécurité de configuration : le bloc est ignoré si mod_ssl n'est pas chargé, évitant une erreur au démarrage d'Apache.
  • VirtualHost *:443* = toutes les interfaces réseau. 443 = port HTTPS standard. Apache écoute les connexions chiffrées sur ce port.
  • SSLEngine onDirective clé — Active le chiffrement TLS pour ce VirtualHost. Sans elle, même avec les certificats configurés, les connexions resteraient en clair.
  • SSLCertificateFileCertificat public (.crt) envoyé au navigateur pour s'identifier. Le navigateur vérifie sa validité.
  • SSLCertificateKeyFileClé privée (.key) utilisée pour le chiffrement asymétrique. Ne quitte jamais le serveur.
3.3 Activation du site et redémarrage Question 8

Activer le site crée un lien symbolique, puis on redémarre Apache pour appliquer les changements.

bash — root
# 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
  • a2ensiteApache2 Enable Site. Crée un lien de sites-available/ vers sites-enabled/. Apache ne lit que les fichiers dans sites-enabled/.
  • restartArrête puis relance Apache. Nécessaire pour charger un nouveau VirtualHost (contrairement à reload qui ne suffit pas toujours).
⚠️
Un avertissement de sécurité apparaît dans le navigateur car le certificat est autosigné (non reconnu par une autorité de confiance). Cliquer sur Avancé → Accepter le risque pour continuer.
🔒
Accéder à https://[VOTRE_IP]/ et vérifier la présence du cadenas dans la barre d'URL.
04
🟢 Tests et analyse des logs
Validation config · Logs d'accès · Simulation d'erreur SSL
4.1 Vérification de la configuration Apache Questions 9 & 10

Avant de redémarrer, toujours valider la syntaxe de la configuration pour éviter qu'Apache refuse de démarrer.

bash — root
# 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
  • apachectl configtestParse tous les fichiers de configuration et signale les erreurs de syntaxe sans redémarrer Apache. Sortie : Syntax OK ou description de l'erreur.
Si configtest retourne une erreur, ne pas redémarrer Apache — corriger d'abord le fichier indiqué dans le message d'erreur, puis relancer le test.
4.2 Consultation des logs Apache Question 11

Apache tient deux fichiers de log principaux. Ils sont essentiels pour diagnostiquer les problèmes.

bash
# 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
  • tail -n 10Affiche les 10 dernières lignes d'un fichier. Ajouter -f pour un suivi en temps réel : tail -f /var/log/apache2/error.log
  • access.logChaque requête reçue par Apache y est enregistrée : IP source, méthode HTTP, code de réponse, taille, date.
  • error.logErreurs de configuration, problèmes SSL, fichiers introuvables. C'est là qu'on regarde en premier quand quelque chose ne fonctionne pas.
4.3 Simulation d'erreur SSL Question 12

Désactiver temporairement le module SSL pour observer le comportement d'erreur dans les logs.

bash — root
# 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
  • a2dismod sslApache2 Disable Module. Supprime le lien symbolique du module SSL. Apache refuse alors de charger toute directive SSLEngine → le site HTTPS devient inaccessible.
05
🔴 Sécurisation TLS — Durcissement
Version TLS · Chiffrements · Recommandations ANSSI
5.1 Vérification de la version TLS Question 17

Identifier quelles versions de TLS sont négociées entre le client et le serveur.

bash
# 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
  • s_clientSimule un client SSL/TLS. Ouvre une connexion vers le serveur et affiche les détails de la négociation TLS (version, chiffrement, certificat).
  • -connectAdresse et port du serveur à tester. localhost:443 = tester le serveur local sur le port HTTPS.
  • -tls1_2Force la connexion en TLS 1.2 uniquement. Si le serveur ne supporte pas cette version, la connexion échoue.
  • 2>/dev/nullRedirige les messages d'erreur vers /dev/null (poubelle) pour n'afficher que les résultats utiles.
  • grep ProtocolFiltre la sortie pour n'afficher que la ligne contenant la version de protocole TLS négociée.
💡
Depuis le navigateur : Chrome → F12 → Security → Connection · Firefox → 🔒 → More Information → Technical Details
5.2 Désactivation de TLS 1.0 et 1.1 Question 18

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.

bash — root
# Éditer la configuration SSL globale d'Apache
nano /etc/apache2/mods-available/ssl.conf

Trouver la ligne SSLProtocol et la remplacer par :

apache — ssl.conf
# -all : désactive toutes les versions
# +TLSv1.2 +TLSv1.3 : réactive uniquement ces deux versions
SSLProtocol -all +TLSv1.2 +TLSv1.3
bash — root
# Appliquer les changements
systemctl restart apache2
5.3 Chiffrements supportés et renforcement Questions 19 & 20

Lister les algorithmes de chiffrement disponibles, puis restreindre aux suites recommandées.

bash
# Lister tous les chiffrements supportés (en excluant les faibles)
openssl ciphers -v 'ALL:!ADH:!LOW:!EXP:!MD5:!3DES:!PSK:!SRP'
  • ciphers -vAffiche la liste détaillée des suites de chiffrement : protocole, échange de clés, authentification, chiffrement, MAC.
  • !ADHExclut les suites sans authentification (Anonymous DH) — vulnérables aux attaques man-in-the-middle.
  • !LOW !EXPExclut les chiffrements faibles (LOW) et d'exportation (EXP, limités à 40/56 bits).
  • !MD5 !3DESExclut les algorithmes obsolètes : MD5 (collisions connues), 3DES (vulnérable à SWEET32).

Renforcer la configuration dans le VirtualHost ou ssl.conf :

apache — 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
🔐
Recommandations ANSSI : privilégier AES-GCM et ChaCha20-Poly1305 en TLS 1.2/1.3. Interdire : DES, RC4, MD5, 3DES, export ciphers.
06
⚙️ Redirection HTTP → HTTPS
Question 15 · Module rewrite · Code 301
6.1 Forcer le HTTPS via mod_rewrite

Tout utilisateur qui arrive en HTTP (port 80) est automatiquement redirigé vers HTTPS (port 443). Indispensable en production.

bash — root
# 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 :

apache — 000-default.conf
<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>
  • RewriteEngine OnActive le moteur de réécriture d'URL dans ce VirtualHost. Sans cette ligne, les règles RewriteRule sont ignorées.
  • RewriteRule ^^ correspond au début de l'URL, donc toutes les URL. Toutes les requêtes HTTP sont redirigées.
  • [L,R=301]L = Last (stopper l'évaluation des autres règles), R=301 = redirection permanente (Moved Permanently). Le navigateur met en cache cette redirection.
bash — root
# 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'
  • reloadRecharge la configuration sans couper les connexions en cours. Suffisant pour les changements de VirtualHost (pas de nouveau module).
  • ss -tulnAffiche les sockets réseau en écoute : -t TCP, -u UDP, -l listening, -n sans résolution DNS. HTTP:80 et HTTPS:443 doivent apparaître.
Conclusion — Points clés à retenir
Question 13 · À savoir pour l'oral
ÉlémentÀ retenir
Certificat autosignéValide en développement/test. En production → Let's Encrypt ou CA reconnue
-nodesClé 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
PortsHTTP : 80 · HTTPS : 443
TLS 1.0 / 1.1Désactiver — vulnérabilités connues (BEAST, POODLE)
SSLProtocol-all +TLSv1.2 +TLSv1.3 uniquement
Logserror.log = erreurs · access.log = toutes les requêtes
Renouveler le cert.Relancer la commande openssl avec les mêmes chemins (question 14)
🎯
Workflow complet en 6 étapes :
1. Installer Apache2 et vérifier le service
2. Générer clé privée + certificat autosigné avec OpenSSL
3. Activer le module SSL (a2enmod ssl) et créer le VirtualHost :443
4. Activer le site (a2ensite) et tester en HTTPS
5. Durcir TLS : désactiver TLS 1.0/1.1, restreindre les chiffrements
6. Forcer la redirection HTTP → HTTPS via mod_rewrite

BTS SIO SISR — Systèmes · Apache TLS · Certificat autosigné · Debian