Certificats SSL/TLS et HTTPS
Guide complet pour l'installation, la configuration et le débogage des certificats SSL/TLS avec Let's Encrypt et Apache.
Installation des certificats (Let's Encrypt)
Installation de Certbot
sudo apt install certbot python3-certbot-apache -y
Obtenir un certificat
Pour un seul domaine :
sudo certbot --apache -d telaria.dev
Pour plusieurs domaines (certificat multi-domaine) :
sudo certbot --apache -d telaria.dev -d www.telaria.dev
Pour un hostname technique (VPS, serveur) :
sudo certbot --apache -d vps-cbc83e1f.vps.ovh.net
Renouvellement automatique
Le renouvellement est configuré automatiquement par Certbot. Pour tester :
sudo certbot renew --dry-run
Renouvellement forcé
Si un certificat semble corrompu ou désynchronisé :
# Renouveler tous les certificats sudo certbot renew --force-renewal # Renouveler un certificat spécifique sudo certbot renew --cert-name telaria.dev --force-renewal
Configuration Apache SSL/TLS
Activer les modules SSL
sudo a2enmod ssl sudo a2enmod headers sudo a2enmod http2
VirtualHost HTTPS
Configuration HTTP (port 80) avec redirection HTTPS :
<VirtualHost *:80> ServerName telaria.dev Redirect permanent / https://telaria.dev </VirtualHost>
Configuration HTTPS (port 443) :
<VirtualHost *:443> ServerName telaria.dev Protocols h2 http/1.1 DirectoryIndex index.php DocumentRoot /var/www/codexia/public <Directory /var/www/codexia/public> AllowOverride None Require all granted FallbackResource /index.php </Directory> <FilesMatch \.php$> SetHandler proxy:unix:/var/run/php/php8.5-fpm.sock|fcgi://telaria.dev </FilesMatch> # Certificats SSL SSLEngine on SSLCertificateFile /etc/letsencrypt/live/telaria.dev/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/telaria.dev/privkey.pem # Protocoles et chiffrements sécurisés SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 SSLCipherSuite HIGH:!aNULL:!MD5 SSLHonorCipherOrder on # En-têtes de sécurité Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" Header always set X-Frame-Options "SAMEORIGIN" Header always set X-Content-Type-Options "nosniff" Header always set Referrer-Policy "strict-origin-when-cross-origin" ErrorLog ${APACHE_LOG_DIR}/telaria.dev-error.log CustomLog ${APACHE_LOG_DIR}/telaria.dev-access.log combined </VirtualHost>
Activer le VirtualHost
sudo a2ensite telaria.dev.conf sudo apachectl configtest sudo systemctl reload apache2
Débogage des certificats SSL/TLS
1. Lister les certificats installés
sudo certbot certificates
Informations affichées :
- Nom du certificat
- Domaines couverts (CN et SAN)
- Date d'expiration
- Chemin du certificat et de la clé privée
2. Vérifier le certificat sur disque
# Voir les domaines couverts par le certificat sudo openssl x509 -in /etc/letsencrypt/live/telaria.dev/fullchain.pem -noout -text | grep -E "(Subject:|DNS:)" # Voir la date d'expiration sudo openssl x509 -in /etc/letsencrypt/live/telaria.dev/fullchain.pem -noout -dates # Voir toutes les informations sudo openssl x509 -in /etc/letsencrypt/live/telaria.dev/fullchain.pem -noout -text
3. Vérifier le certificat servi par Apache
# Voir le certificat servi par le serveur echo | openssl s_client -connect telaria.dev:443 -servername telaria.dev 2>/dev/null | openssl x509 -noout -text | grep -E "(Subject:|DNS:)" # Version simplifiée openssl s_client -connect telaria.dev:443 -servername telaria.dev < /dev/null 2>/dev/null | openssl x509 -noout -subject -dates -ext subjectAltName
4. Tester avec curl
# Test basique curl -I --http2 https://telaria.dev # Test avec verbose (voir la négociation SSL) curl -Iv https://telaria.dev
5. Vérifier la configuration Apache
Lister tous les VirtualHosts actifs :
sudo apachectl -t -D DUMP_VHOSTS
Vérifier les VirtualHosts HTTPS :
sudo apachectl -t -D DUMP_VHOSTS | grep 443
Vérifier la configuration d'un VirtualHost spécifique :
sudo cat /etc/apache2/sites-enabled/telaria.dev.conf | grep -E "(ServerName|ServerAlias|SSLCertificate)"
6. Tester la configuration Apache
sudo apachectl configtest
Erreurs courantes et solutions
Erreur : "SSL: no alternative certificate subject name matches target hostname"
SymptĂ´me :
curl: (60) SSL: no alternative certificate subject name matches target hostname 'telaria.dev'
Cause : Le certificat ne couvre pas le domaine demandé (problème de CN ou SAN).
Diagnostic :
# 1. Vérifier les domaines dans le certificat sur disque sudo openssl x509 -in /etc/letsencrypt/live/telaria.dev/fullchain.pem -noout -text | grep -E "(Subject:|DNS:)" # 2. Vérifier les domaines dans le certificat servi echo | openssl s_client -connect telaria.dev:443 -servername telaria.dev 2>/dev/null | openssl x509 -noout -text | grep -E "(Subject:|DNS:)" # 3. Comparer les deux sorties
Solutions :
-
Le certificat sur disque est incorrect :
# Ajouter le domaine au certificat sudo certbot certonly --apache -d telaria.dev -d www.telaria.dev sudo systemctl reload apache2
-
Apache sert le mauvais certificat :
- Vérifier que le VirtualHost pointe vers le bon certificat
- Vérifier qu'il n'y a pas de VirtualHost en double
Erreur : VirtualHost en double (conflit SNI)
SymptĂ´me : Apache sert le certificat d'un autre domaine.
Diagnostic :
# Lister tous les VirtualHosts sudo apachectl -t -D DUMP_VHOSTS | grep 443 # Chercher les doublons sudo apachectl -t -D DUMP_VHOSTS | grep "telaria.dev"
Solution :
Si un domaine apparaît plusieurs fois :
# 1. Trouver les fichiers concernés sudo grep -r "ServerName telaria.dev" /etc/apache2/sites-enabled/ # 2. Éditer ou supprimer les configurations en double sudo nano /etc/apache2/sites-enabled/fichier-en-conflit.conf # 3. Tester et recharger sudo apachectl configtest sudo systemctl reload apache2
Règle importante : Un ServerName ne doit apparaître qu'une seule fois dans les VirtualHosts *:443.
Erreur : Certificat expiré
SymptĂ´me :
curl: (60) SSL certificate problem: certificate has expired
Solution :
# Vérifier l'expiration sudo certbot certificates # Renouveler sudo certbot renew --force-renewal # Recharger Apache sudo systemctl reload apache2
Erreur : Mixed Content (HTTP/HTTPS)
SymptĂ´me : Le site charge en HTTPS mais certaines ressources sont en HTTP.
Solution : Forcer HTTPS pour toutes les ressources :
# Dans le VirtualHost *:443 Header always set Content-Security-Policy "upgrade-insecure-requests"
Erreur : Encodage incorrect (ISO-8859-1) sur les pages d'erreur
Symptôme : Les pages d'erreur générées par Apache (ex: 401 Authorization Required) s'affichent avec un mauvais encodage, ou curl affiche charset=iso-8859-1.
Solution : Forcer l'UTF-8 via le module headers pour toutes les réponses, y compris les erreurs :
# Dans le VirtualHost *:443 (ou au niveau global) Header always edit Content-Type "^text/html(;.*)?$" "text/html; charset=UTF-8"
Note : L'utilisation de always est indispensable pour que le header soit appliqué aux codes d'erreur (4xx/5xx).
Erreur : "SSLCertificateFile: file does not exist"
Symptôme : Apache ne démarre pas.
Cause : Le chemin du certificat est incorrect ou le certificat n'existe pas.
Solution :
# Vérifier que le certificat existe sudo ls -la /etc/letsencrypt/live/telaria.dev/ # Vérifier les liens symboliques sudo readlink -f /etc/letsencrypt/live/telaria.dev/fullchain.pem sudo readlink -f /etc/letsencrypt/live/telaria.dev/privkey.pem # Corriger le chemin dans le VirtualHost si nécessaire sudo nano /etc/apache2/sites-available/telaria.dev.conf
Tests et validation
Tester la chaîne de certificats complète
# Vérifier la chaîne de certificats openssl s_client -connect telaria.dev:443 -showcerts
Tester avec SSL Labs
En ligne : SSL Labs Server Test
# Depuis le terminal (nécessite ssllabs-scan) ssllabs-scan telaria.dev
Tester HTTP/2
curl -I --http2 https://telaria.dev | head -1
Vous devriez voir : HTTP/2 200
Vérifier HSTS
curl -I https://telaria.dev | grep -i strict-transport-security
Tester la redirection HTTP → HTTPS
curl -I http://telaria.dev
Vous devriez voir : HTTP/1.1 301 Moved Permanently et Location: https://telaria.dev
Checklist SSL/TLS
- Certbot installé
- Certificats générés pour tous les domaines
- VirtualHosts configurés (80 → 443)
- Certificats correctement référencés dans les VirtualHosts
- Pas de VirtualHost en double pour un mĂŞme domaine
- Protocoles sécurisés (TLS 1.2+)
- Chiffrements sécurisés (HIGH, pas de MD5)
- En-têtes de sécurité (HSTS, X-Frame-Options, etc.)
- HTTP/2 activé
- Tests effectués (curl, navigateur, SSL Labs)
- Renouvellement automatique configuré
- Logs vérifiés
Commandes de diagnostic rapide
# Résumé complet pour un domaine { echo "=== Certificats Let's Encrypt ===" sudo certbot certificates | grep -A 5 "telaria.dev" echo -e "\n=== Certificat sur disque ===" sudo openssl x509 -in /etc/letsencrypt/live/telaria.dev/fullchain.pem -noout -subject -dates -ext subjectAltName echo -e "\n=== Certificat servi par Apache ===" echo | openssl s_client -connect telaria.dev:443 -servername telaria.dev 2>/dev/null | openssl x509 -noout -subject -dates -ext subjectAltName echo -e "\n=== VirtualHosts Apache ===" sudo apachectl -t -D DUMP_VHOSTS | grep "telaria.dev" echo -e "\n=== Test HTTPS ===" curl -I --http2 https://telaria.dev | head -5 }
Ressources
- Documentation Certbot : https://certbot.eff.org/
- SSL Labs : https://www.ssllabs.com/ssltest/
- Mozilla SSL Configuration Generator : https://ssl-config.mozilla.org/
- Let's Encrypt Documentation : https://letsencrypt.org/docs/
Voir aussi — en production
vps/04-tls-https.md— TLS déployé sur Telaria (Certbot, renouvellement auto, multisite).