Apache : HTTPS et certificats
Activer HTTPS avec un certificat gratuit Let’s Encrypt. Les exemples utilisent le domaine fictif exemple.com.
Prérequis
Section intitulée « Prérequis »- Le DNS de
exemple.com(et dewww.exemple.com) pointe vers l’adresse IP publique du serveur. - Un site Apache fonctionnel en HTTP avec
ServerNameetServerAliascorrects (voir Sites virtuels). - Les ports 80 et 443 ouverts :
sudo ufw allow 'Apache Full'.
Installer Certbot
Section intitulée « Installer Certbot »sudo apt install certbot python3-certbot-apachecertbot --version| Ubuntu | Version de Certbot |
|---|---|
| 24.04 | 2.9 |
| 26.04 | 4.0 |
Obtenir un certificat et configurer Apache
Section intitulée « Obtenir un certificat et configurer Apache »sudo certbot --apache -d exemple.com -d www.exemple.comCertbot demande une adresse e-mail (alertes d’expiration), vérifie le domaine, obtient le certificat, crée le site HTTPS (exemple.com-le-ssl.conf) et propose de rediriger HTTP vers HTTPS. Les certificats sont dans /etc/letsencrypt/live/exemple.com/.
| Fichier | Contenu |
|---|---|
fullchain.pem |
Certificat et chaîne intermédiaire (SSLCertificateFile) |
privkey.pem |
Clé privée, secrète (SSLCertificateKeyFile) |
Sans modifier la configuration :
sudo certbot certonly --webroot -w /var/www/exemple.com -d exemple.com # via le dossier du sitesudo certbot certonly --apache -d exemple.com # via Apachesudo certbot certonly --standalone -d exemple.com # serveur temporaire (Apache arrêté)Renouvellement automatique
Section intitulée « Renouvellement automatique »systemctl list-timers | grep certbotsudo certbot renew --dry-run # simulation du renouvellementsudo certbot certificates # certificats et dates d'expirationPour recharger Apache après un renouvellement :
sudo tee /etc/letsencrypt/renewal-hooks/deploy/recharger-apache.sh <<'CONF'#!/bin/shsystemctl reload apache2CONFsudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/recharger-apache.shConfiguration HTTPS écrite à la main
Section intitulée « Configuration HTTPS écrite à la main »sudo a2enmod ssl http2 headers<VirtualHost *:80> ServerName exemple.com ServerAlias www.exemple.com Redirect permanent / https://exemple.com/</VirtualHost>
<VirtualHost *:443> ServerName exemple.com DocumentRoot /var/www/exemple.com
Protocols h2 http/1.1
SSLEngine on SSLCertificateFile /etc/letsencrypt/live/exemple.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/exemple.com/privkey.pem SSLProtocol -all +TLSv1.2 +TLSv1.3 SSLSessionTickets off
Header always set Strict-Transport-Security "max-age=31536000"
<Directory /var/www/exemple.com> Require all granted </Directory></VirtualHost>
<VirtualHost *:443> ServerName www.exemple.com SSLEngine on SSLCertificateFile /etc/letsencrypt/live/exemple.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/exemple.com/privkey.pem Redirect permanent / https://exemple.com/</VirtualHost>Ne pas forcer la suite de chiffrement : les valeurs par défaut d’Apache et d’OpenSSL sur Ubuntu sont adaptées.
HTTP/2 demande le module http2 et le MPM event (défaut sur Ubuntu) :
sudo a2enmod http2Protocols h2 http/1.1 # dans le VirtualHost *:443 (ou globalement)Le MPM prefork (imposé par libapache2-mod-php) ne prend pas en charge HTTP/2 : utiliser PHP-FPM.
Header always set Strict-Transport-Security "max-age=31536000"Agrafage OCSP (facultatif)
Section intitulée « Agrafage OCSP (facultatif) »# Contexte global, par exemple dans /etc/apache2/conf-available/ssl-stapling.confSSLStaplingCache "shmcb:${APACHE_RUN_DIR}/ssl_stapling(32768)"
# Dans le VirtualHost *:443SSLUseStapling onVérifier
Section intitulée « Vérifier »sudo apache2ctl configtest && sudo systemctl reload apache2curl -I https://exemple.comcurl -I http://exemple.com # 301 vers httpsopenssl s_client -connect exemple.com:443 -servername exemple.com </dev/null 2>/dev/null | openssl x509 -noout -dates -subjectsudo apt install nmap && nmap --script ssl-enum-ciphers -p 443 exemple.com # protocoles TLS acceptés : seuls TLSv1.2 et TLSv1.3 doivent apparaîtrecurl -I --http2 https://exemple.com # HTTP/2 actif si la réponse commence par HTTP/2openssl s_client -tls1_1 n’est pas fiable pour ce contrôle : le client OpenSSL d’Ubuntu refuse lui-même ces protocoles (« no protocols available ») sans tester le serveur. Un test externe complet est proposé par ssllabs.com/ssltest.
Dépannage
Section intitulée « Dépannage »| Symptôme | Piste |
|---|---|
Challenge failed / Timeout during connect |
Le DNS ne pointe pas vers le serveur, ou le port 80 est fermé |
Too many certificates already issued |
Limite de Let’s Encrypt atteinte : attendre ; --dry-run ou --staging pour les essais |
AH00526: Invalid command 'SSLEngine' |
Module non activé : sudo a2enmod ssl |
AH02572: Failed to configure at least one certificate |
Chemin ou droits du certificat : sudo ls -l /etc/letsencrypt/live/exemple.com/ |
| Le mauvais certificat est présenté | Plusieurs sites sur le port 443 sans ServerName correct : sudo apache2ctl -S |
| Boucle de redirection | La redirection HTTPS est aussi active derrière un proxy qui parle HTTP |
| HTTP/2 non actif | Module http2 absent, MPM prefork, ou Protocols manquant |
| Erreur de contenu mixte | Des ressources http:// dans la page : les passer en https:// |
Ubuntu 24.04 et 26.04 : différences à connaître
Section intitulée « Ubuntu 24.04 et 26.04 : différences à connaître »Pour aller plus loin
Section intitulée « Pour aller plus loin »- Documentation : SSL/TLS Strong Encryption: How-To et certbot.eff.org
- Suite : Sécurité