🛠 Outils IT
🛠 98 outils 📚 37 docs
🤖 Assistant

Audit SSL Labs - Obtenir A+ sur SSL/TLS

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)
Cache SSL Labs : les resultats sont mis en cache pendant ~12 heures. Pour forcer un nouveau test apres une modification de config, cocher "Do not show the results on the boards" ET "Clear cache" avant de lancer le scan, ou ajouter &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

ElementEtat
TLS 1.3 / 1.2Actifs (OK)
TLS 1.0 / 1.1 / SSLDesactives (OK)
Certificat (validite, RSA 2048, SHA256)OK
Chaine de certificatsINCOMPLETE (cause du B)
HSTSNon configure
OCSP StaplingInactif
CAA DNSAbsent
Forward SecrecyOK
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

EtapeActionNote obtenue
Etape 1Ajout SSLCertificateChainFile (chaine intermediaire)A
Etape 2 (test)HSTS avec max-age=300A (insuffisant)
Etape 2 (prod)HSTS avec max-age=31536000A+
Etape 3 (bonus)OCSP Stapling + CAA DNSA+ (plus de warnings)

4. Cas pratique : tata.com (A+ direct)

Deuxieme site teste : tata.com. Resultat : A+ d'emblee.

Rapport SSL Labs

ElementEtat
TLS 1.3 / 1.2Actifs
Certificat (Let's Encrypt R13, RSA 2048, SHA256)Valide, chaine complete
HSTSActif (max-age=16000000)
Forward SecrecyRobuste
Suites de chiffrementAES-GCM, ChaCha20-Poly1305
VulnerabilitesAucune
TLS Fallback SCSVSupporte

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
Conclusion : tata.com est un bon exemple de config TLS moderne. Les points "manquants" sont des optimisations, pas des problemes de securite.

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
Note Apache >= 2.4.8 : on peut utiliser uniquement 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]
DirectiveRole
max-ageDuree en secondes pendant laquelle le navigateur force HTTPS
includeSubDomainsApplique aussi a tous les sous-domaines (CAUTION)
preloadMarqueur pour l'inscription a la HSTS Preload List
HSTS est irreversible cote utilisateur : une fois recu, le navigateur respecte la directive pendant toute la duree de 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

  1. Demarrer avec max-age=300 pour valider que l'en-tete est servi
  2. Verifier en curl :
    curl -sI https://toto.com | grep -i strict-transport
    # Strict-Transport-Security: max-age=300
  3. Apres validation, passer a max-age=31536000 (1 an) -> A+
Piege A+ : SSL Labs exige max-age >= 15552000 (6 mois) pour accorder A+. Avec max-age=300, la note reste A meme si HSTS est detecte.
includeSubDomains : ne pas l'ajouter si des sous-domaines (api.toto.com, dev.toto.com...) sont en HTTP. Cela les rendrait inaccessibles pour les navigateurs ayant deja recu l'en-tete.

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"
TagRole
issueAC autorisee a emettre des certificats simples
issuewildAC autorisee a emettre des certificats wildcard
iodefAdresse de contact pour signaler une violation

Valeurs courantes selon l'AC

ACIdentifiant CAA
Let's Encryptletsencrypt.org
Gandi (Sectigo)gandi.net
Sectigo / Comodosectigo.com
DigiCertdigicert.com
GlobalSignglobalsign.com
Google Trust Servicespki.goog

Verification

dig +short CAA toto.com

10. Pieges classiques

Piege 1 : Cache SSL Labs de 12h

Apres une modification de config serveur, relancer le test SSL Labs sans clear cache renvoie l'ancien resultat. Toujours utiliser l'URL avec &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-ageEquivalentImpact note
3005 minutesHSTS detecte mais reste A
864001 jourA
259200030 joursA
155520006 moisA+ (seuil minimum)
315360001 anA+ (recommande)
630720002 ansA+ (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-scoreCible
Certificate100
Protocol Support95
Key Exchange90
Cipher Strength90
Note globaleA+
Aller plus loin : pour generer une configuration TLS optimale et a jour, utiliser le generateur officiel Mozilla : ssl-config.mozilla.org. Selectionner le serveur web, la version, le profil (Modern / Intermediate / Old) et copier-coller le resultat.
Profils Mozilla 2026 :
  • 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.