Aller au contenu

Apache : HTTPS et certificats

Activer HTTPS avec un certificat gratuit Let’s Encrypt. Les exemples utilisent le domaine fictif exemple.com.

  • Le DNS de exemple.com (et de www.exemple.com) pointe vers l’adresse IP publique du serveur.
  • Un site Apache fonctionnel en HTTP avec ServerName et ServerAlias corrects (voir Sites virtuels).
  • Les ports 80 et 443 ouverts : sudo ufw allow 'Apache Full'.
Fenêtre de terminal
sudo apt install certbot python3-certbot-apache
certbot --version
Ubuntu Version de Certbot
24.04 2.9
26.04 4.0
Fenêtre de terminal
sudo certbot --apache -d exemple.com -d www.exemple.com

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

Fenêtre de terminal
sudo certbot certonly --webroot -w /var/www/exemple.com -d exemple.com # via le dossier du site
sudo certbot certonly --apache -d exemple.com # via Apache
sudo certbot certonly --standalone -d exemple.com # serveur temporaire (Apache arrêté)
Fenêtre de terminal
systemctl list-timers | grep certbot
sudo certbot renew --dry-run # simulation du renouvellement
sudo certbot certificates # certificats et dates d'expiration

Pour recharger Apache après un renouvellement :

sudo tee /etc/letsencrypt/renewal-hooks/deploy/recharger-apache.sh <<'CONF'
#!/bin/sh
systemctl reload apache2
CONF
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/recharger-apache.sh
Fenêtre de terminal
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) :

Fenêtre de terminal
sudo a2enmod http2
Protocols 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"
# Contexte global, par exemple dans /etc/apache2/conf-available/ssl-stapling.conf
SSLStaplingCache "shmcb:${APACHE_RUN_DIR}/ssl_stapling(32768)"
# Dans le VirtualHost *:443
SSLUseStapling on
Fenêtre de terminal
sudo apache2ctl configtest && sudo systemctl reload apache2
curl -I https://exemple.com
curl -I http://exemple.com # 301 vers https
openssl s_client -connect exemple.com:443 -servername exemple.com </dev/null 2>/dev/null | openssl x509 -noout -dates -subject
sudo apt install nmap && nmap --script ssl-enum-ciphers -p 443 exemple.com # protocoles TLS acceptés : seuls TLSv1.2 et TLSv1.3 doivent apparaître
curl -I --http2 https://exemple.com # HTTP/2 actif si la réponse commence par HTTP/2

openssl 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.

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 »