Audit SSL Labs - Obtenir A+ sur SSL/TLS
- 1. Qu'est-ce que SSL Labs
- 2. Methode de notation
- 3. Cas pratique : toto.com (B -> A+)
- 4. Cas pratique : tata.com (A+ direct)
- 5. Anomalies courantes et corrections
- 6. Corriger la chaine de certificats
- 7. Activer HSTS pour A+
- 8. OCSP Stapling
- 9. Enregistrement CAA DNS
- 10. Pieges classiques
- 11. Verification finale
1. Qu'est-ce que SSL Labs
SSL Labs (par Qualys) est l'outil de reference de l'industrie pour auditer la configuration SSL/TLS d'un serveur web public. Disponible gratuitement sur ssllabs.com/ssltest, il analyse en profondeur :
- Les protocoles supportes (SSL 2.0, 3.0, TLS 1.0, 1.1, 1.2, 1.3)
- Les suites de chiffrement disponibles et leur ordre
- La chaine de certificats (validite, integrite, AC reconnue)
- Les vulnerabilites connues (BEAST, POODLE, FREAK, Logjam, DROWN, Heartbleed, ROBOT, etc.)
- La presence d'HSTS, OCSP Stapling, CAA DNS
- Le support du Forward Secrecy
- La compatibilite avec les principaux clients (navigateurs, OS)
&clearCache=on a l'URL.
2. Methode de notation
SSL Labs attribue une note globale de F a A+, calculee a partir de 4 sous-scores ponderes :
| Sous-score | Poids | Description |
|---|---|---|
| Certificate | - | Validite, chaine complete, taille de cle, algorithme de signature |
| Protocol Support | 30% | Protocoles supportes (TLS 1.2/1.3 obligatoires, anciens proscrits) |
| Key Exchange | 30% | Robustesse de l'echange de cles (ECDHE, DHE, taille des cles) |
| Cipher Strength | 40% | Force des suites de chiffrement disponibles |
Plafonds automatiques
Certains problemes plafonnent automatiquement la note, quel que soit le reste :
| Probleme | Note maximale |
|---|---|
| Chaine de certificats incomplete | B |
| Support de TLS 1.0 / 1.1 | B |
| Forward Secrecy absent | B |
| RC4 disponible | B (C avec clients modernes) |
| Support SSL 3.0 | C |
| Vulnerable POODLE / BEAST cote serveur | C |
| Certificat expire / invalide | T (Trust issues) |
Bonus pour A+
Pour decrocher A+, il faut avoir une note A et activer au moins l'un des bonus :
- HSTS avec max-age >= 15552000 (6 mois) - le plus simple
- Inscription a la HSTS preload list
- Forward Secrecy + AEAD pour tous les clients modernes (auto si TLS 1.3)
3. Cas pratique : toto.com (B -> A+)
Premier site teste : toto.com. Resultat initial : B.
Rapport SSL Labs initial
| Element | Etat |
|---|---|
| TLS 1.3 / 1.2 | Actifs (OK) |
| TLS 1.0 / 1.1 / SSL | Desactives (OK) |
| Certificat (validite, RSA 2048, SHA256) | OK |
| Chaine de certificats | INCOMPLETE (cause du B) |
| HSTS | Non configure |
| OCSP Stapling | Inactif |
| CAA DNS | Absent |
| Forward Secrecy | OK |
| Vulnerabilites (BEAST, POODLE, ROBOT, Heartbleed...) | Aucune |
Diagnostic ligne de commande
# Compter les certificats servis (doit etre >= 2)
echo | openssl s_client -connect toto.com:443 -servername toto.com -showcerts 2>/dev/null | grep -c "BEGIN CERTIFICATE"
# Resultat : 1 (incomplete)
# Voir le detail
echo | openssl s_client -connect toto.com:443 -servername toto.com -showcerts 2>/dev/null | openssl x509 -noout -issuer -subject
Progression apres corrections
| Etape | Action | Note obtenue |
|---|---|---|
| Etape 1 | Ajout SSLCertificateChainFile (chaine intermediaire) | A |
| Etape 2 (test) | HSTS avec max-age=300 | A (insuffisant) |
| Etape 2 (prod) | HSTS avec max-age=31536000 | A+ |
| Etape 3 (bonus) | OCSP Stapling + CAA DNS | A+ (plus de warnings) |
4. Cas pratique : tata.com (A+ direct)
Deuxieme site teste : tata.com. Resultat : A+ d'emblee.
Rapport SSL Labs
| Element | Etat |
|---|---|
| TLS 1.3 / 1.2 | Actifs |
| Certificat (Let's Encrypt R13, RSA 2048, SHA256) | Valide, chaine complete |
| HSTS | Actif (max-age=16000000) |
| Forward Secrecy | Robuste |
| Suites de chiffrement | AES-GCM, ChaCha20-Poly1305 |
| Vulnerabilites | Aucune |
| TLS Fallback SCSV | Supporte |
Points mineurs a ameliorer (note reste A+)
- OCSP Stapling non active (gain de perf possible)
- Session Resumption Tickets desactives
- Certificat secondaire mal configure (configuration "default" du proxy mutualise)
- Aucun support PQC (Post-Quantum Cryptography) - non bloquant en 2026
5. Anomalies courantes et corrections
| Anomalie | Severite | Resolution |
|---|---|---|
| Chaine de certificats incomplete | Critique (plafonne a B) | Utiliser fullchain.pem (Nginx) ou SSLCertificateChainFile (Apache) |
| TLS 1.0 / 1.1 actifs | Critique (plafonne a B) | Desactiver dans la conf serveur (-TLSv1 -TLSv1.1) |
| HSTS absent | Elevee (empeche A+) | Ajouter Strict-Transport-Security: max-age=31536000 |
| HSTS max-age trop court | Elevee | SSL Labs exige >= 15552000 (6 mois) pour A+ |
| OCSP Stapling absent | Faible | Activer ssl_stapling / SSLUseStapling |
| CAA DNS absent | Faible (warning) | Ajouter un enregistrement CAA dans la zone DNS |
| Suites de chiffrement faibles (RC4, 3DES, CBC ancien) | Elevee | Restreindre ssl_ciphers / SSLCipherSuite a la liste Mozilla Intermediate |
| Forward Secrecy partiel | Moyenne (plafonne a B) | Prioriser les suites ECDHE / DHE |
| Certificat sans SAN | Critique | Reemettre avec Subject Alternative Names (obligatoire depuis 2017) |
6. Corriger la chaine de certificats
Cause numero 1 de la note B. Le serveur doit servir le certificat feuille ET la chaine intermediaire de l'autorite de certification.
Diagnostic
# Doit renvoyer >= 2 certificats si la chaine est complete
echo | openssl s_client -connect toto.com:443 -servername toto.com -showcerts 2>/dev/null | grep -c "BEGIN CERTIFICATE"
Solution Nginx
server {
listen 443 ssl http2;
server_name www.toto.com toto.com;
# MAUVAIS : seulement le certificat feuille
# ssl_certificate /etc/letsencrypt/live/toto.com/cert.pem;
# BON : fullchain contient feuille + intermediaire
ssl_certificate /etc/letsencrypt/live/toto.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/toto.com/privkey.pem;
}
sudo nginx -t && sudo systemctl reload nginx
Solution Apache 2.4
<VirtualHost *:443>
ServerName www.toto.com
ServerAlias toto.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/toto.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/toto.com/privkey.pem
# CRITIQUE : la chaine intermediaire
SSLCertificateChainFile /etc/letsencrypt/live/toto.com/chain.pem
</VirtualHost>
sudo apachectl configtest && sudo systemctl reload apache2
SSLCertificateFile fullchain.pem sans SSLCertificateChainFile. La directive SSLCertificateChainFile est obsolete mais fonctionne toujours.
Cas certificat commercial (Sectigo, DigiCert, Gandi...)
Les AC commerciales fournissent generalement le bundle intermediaire dans un fichier separe (intermediate.crt, ca-bundle.crt). Procedure type :
# Construire le fullchain manuellement
cat mon-cert.crt intermediate.crt > fullchain.pem
# Utiliser ensuite fullchain.pem dans la conf serveur
7. Activer HSTS pour A+
HSTS (HTTP Strict Transport Security) indique au navigateur de toujours utiliser HTTPS pour ce domaine pendant une duree donnee. Sans HSTS, on plafonne a A.
Syntaxe de l'en-tete
Strict-Transport-Security: max-age=<secondes> [; includeSubDomains] [; preload]
| Directive | Role |
|---|---|
max-age | Duree en secondes pendant laquelle le navigateur force HTTPS |
includeSubDomains | Applique aussi a tous les sous-domaines (CAUTION) |
preload | Marqueur pour l'inscription a la HSTS Preload List |
max-age, meme si vous retirez l'en-tete. Tester avec max-age=300 d'abord, puis monter a 1 an une fois sur.
Configuration Nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
Configuration Apache
# Necessite mod_headers actif : sudo a2enmod headers
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Phase de test recommandee
- Demarrer avec
max-age=300pour valider que l'en-tete est servi - Verifier en curl :
curl -sI https://toto.com | grep -i strict-transport # Strict-Transport-Security: max-age=300 - Apres validation, passer a
max-age=31536000(1 an) -> A+
max-age >= 15552000 (6 mois) pour accorder A+. Avec max-age=300, la note reste A meme si HSTS est detecte.
8. OCSP Stapling
OCSP (Online Certificate Status Protocol) permet de verifier qu'un certificat n'a pas ete revoque. Sans stapling, chaque navigateur interroge l'AC, ce qui :
- Ralentit le handshake TLS (latence supplementaire)
- Fuit l'historique de navigation a l'AC
Avec OCSP Stapling, le serveur web recupere lui-meme la reponse OCSP et l'agrafe au handshake TLS.
Configuration Nginx
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/toto.com/chain.pem;
resolver 1.1.1.1 8.8.8.8 valid=300s;
resolver_timeout 5s;
Configuration Apache
# A placer dans la conf globale, EN DEHORS du VirtualHost
SSLUseStapling on
SSLStaplingCache "shmcb:/var/run/ocsp(128000)"
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
Verification
echo QUIT | openssl s_client -connect toto.com:443 -servername toto.com -status 2>/dev/null | grep "OCSP Response Status"
# OCSP Response Status: successful (0x0)
9. Enregistrement CAA DNS
L'enregistrement CAA (Certification Authority Authorization) liste les autorites de certification autorisees a emettre un certificat pour ce domaine. Sans CAA, n'importe quelle AC peut emettre.
Syntaxe
toto.com. IN CAA 0 issue "letsencrypt.org"
toto.com. IN CAA 0 iodef "mailto:admin@toto.com"
toto.com. IN CAA 0 issuewild "letsencrypt.org"
| Tag | Role |
|---|---|
issue | AC autorisee a emettre des certificats simples |
issuewild | AC autorisee a emettre des certificats wildcard |
iodef | Adresse de contact pour signaler une violation |
Valeurs courantes selon l'AC
| AC | Identifiant CAA |
|---|---|
| Let's Encrypt | letsencrypt.org |
| Gandi (Sectigo) | gandi.net |
| Sectigo / Comodo | sectigo.com |
| DigiCert | digicert.com |
| GlobalSign | globalsign.com |
| Google Trust Services | pki.goog |
Verification
dig +short CAA toto.com
10. Pieges classiques
Piege 1 : Cache SSL Labs de 12h
&clearCache=on :
https://www.ssllabs.com/ssltest/analyze.html?d=toto.com&hideResults=on&clearCache=on
Piege 2 : HSTS max-age trop court
Le seuil SSL Labs pour A+ est de 15552000 secondes (6 mois). Les valeurs typiques :
| max-age | Equivalent | Impact note |
|---|---|---|
| 300 | 5 minutes | HSTS detecte mais reste A |
| 86400 | 1 jour | A |
| 2592000 | 30 jours | A |
| 15552000 | 6 mois | A+ (seuil minimum) |
| 31536000 | 1 an | A+ (recommande) |
| 63072000 | 2 ans | A+ (requis pour preload list) |
Piege 3 : Header HSTS non servi malgre la conf
Sur Apache, mod_headers doit etre charge :
sudo a2enmod headers
sudo systemctl reload apache2
Piege 4 : Certificat secondaire mal configure (SNI)
SSL Labs teste aussi la connexion sans SNI. Si le serveur renvoie un certificat de configuration par defaut (ex: hebergeur mutualise), le rapport affiche un warning "MISMATCH". Solution : configurer un VirtualHost catch-all par defaut avec un certificat auto-signe inoffensif.
Piege 5 : OCSP Stapling KO avec Let's Encrypt R10/R11/R13
Certaines configs OCSP echouent silencieusement avec les nouvelles intermediaires Let's Encrypt. Verifier avec SSLStaplingReturnResponderErrors off (Apache) pour ne pas casser le handshake en cas d'erreur OCSP transitoire.
Piege 6 : includeSubDomains casse les sous-domaines HTTP
Avant d'ajouter includeSubDomains, lister tous les sous-domaines et confirmer qu'ils sont tous en HTTPS. Sinon, les utilisateurs ayant deja visite le domaine principal ne pourront plus acceder aux sous-domaines HTTP.
11. Verification finale
Script de verification complet
#!/bin/bash
DOMAIN="toto.com"
echo "=== Verification SSL/TLS pour $DOMAIN ==="
# 1. Chaine de certificats
COUNT=$(echo | openssl s_client -connect $DOMAIN:443 -servername $DOMAIN -showcerts 2>/dev/null | grep -c "BEGIN CERTIFICATE")
echo "Chaine : $COUNT certificat(s) servi(s) (doit etre >= 2)"
# 2. HSTS
HSTS=$(curl -sI https://$DOMAIN | grep -i "^strict-transport-security:")
echo "HSTS : $HSTS"
# 3. OCSP Stapling
OCSP=$(echo QUIT | openssl s_client -connect $DOMAIN:443 -servername $DOMAIN -status 2>/dev/null | grep "OCSP Response Status")
echo "OCSP : $OCSP"
# 4. CAA DNS
CAA=$(dig +short CAA $DOMAIN)
echo "CAA : $CAA"
# 5. Protocoles
for proto in tls1 tls1_1 tls1_2 tls1_3; do
RES=$(echo | openssl s_client -connect $DOMAIN:443 -servername $DOMAIN -$proto 2>&1 | grep -c "CONNECTED")
echo "$proto : $RES"
done
Test SSL Labs (avec clear cache)
https://www.ssllabs.com/ssltest/analyze.html?d=toto.com&hideResults=on&clearCache=on
Objectif scoring
| Sous-score | Cible |
|---|---|
| Certificate | 100 |
| Protocol Support | 95 |
| Key Exchange | 90 |
| Cipher Strength | 90 |
| Note globale | A+ |
- Modern : TLS 1.3 seulement, AEAD ciphers uniquement. Compatible Firefox 63+, Chrome 70+, Safari 12.1+. A+ garanti, exclut clients legacy.
- Intermediate (recommande) : TLS 1.2 + 1.3. Couvre 99.9% des clients en 2026. A+ garanti.
- Old : TLS 1.0+, deprecie - a eviter.