03-comment-je-travaille/guides/ssl-tls.md

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 :

  1. 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
    
  2. 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

Voir aussi — en production

  • vps/04-tls-https.md — TLS dĂ©ployĂ© sur Telaria (Certbot, renouvellement auto, multisite).

Assistant documentaire

Posez une question sur la documentation. Les réponses citent leurs sources — un clic ouvre le document à gauche.

Loading…
Loading the web debug toolbar…
Attempt #