EN
Sécuriser son domaine

Comprendre la configuration TLS

Versions de protocole, suites de chiffrement et validité du certificat : lire un résultat de scan TLS et corriger une configuration faible.

1 Introduction

Le cadenas dans la barre d'adresse, c'est TLS : le protocole qui chiffre les échanges entre un visiteur et votre serveur, et qui prouve que le serveur est bien exemple.fr et pas quelqu'un placé au milieu. Chaque page HTTPS, chaque appel d'API et chaque formulaire de connexion en dépend.

En tant que propriétaire du domaine, vous maîtrisez deux choses : la configuration du serveur (quelles versions du protocole et quels algorithmes de chiffrement il accepte) et le certificat qu'il présente (qui l'a émis, quels noms il couvre, quand il expire). Le bloc TLS d'un scan de domaine fait le point sur les deux. La plupart des problèmes se règlent en quelques lignes de configuration, ou en automatisant le renouvellement du certificat.

2021

TLS 1.0 et 1.1 officiellement dépréciés par l'IETF (RFC 8996)

1.2 + 1.3

Les seules versions qu'un site public devrait accepter aujourd'hui

47 jours

Durée de vie maximale d'un certificat votée par le CA/Browser Forum pour 2029, contre 398 auparavant

2 Comment ça marche

Avant d'envoyer la moindre page, le navigateur et le serveur passent par une négociation (le handshake). Le scanner fait exactement comme un navigateur : il se connecte à votre domaine sur le port 443, mène la négociation jusqu'au bout et note ce qui en sort.

1

Négocier

Le client annonce les versions et les suites de chiffrement qu'il connaît. Le serveur choisit une de chaque dans sa propre liste.

2

Prouver son identité

Le serveur envoie son certificat et les certificats intermédiaires qui le rattachent à une autorité racine déjà connue du client.

3

Vérifier

Le client contrôle la chaîne, les dates, et la présence du nom demandé dans le certificat. Le moindre échec déclenche une alerte du navigateur.

Lire le bloc TLS du rapport

Les pastilles du haut résument cette négociation : Protocol (vert pour TLSv1.2 ou TLSv1.3), Cipher (la suite négociée), Trusted (la chaîne est-elle valide), Hostname (le nom correspond ou non) et Expires in, qui passe au rouge sous 15 jours. En dessous viennent le sujet, l'émetteur et les dates du certificat, puis la liste Findings avec ce que le scanner a relevé. Si le bloc indique « No TLS service responded on port 443 », votre domaine ne sert tout simplement pas de HTTPS sur son nom principal.

3 Analyse détaillée

Versions du protocole

SSL 2.0, SSL 3.0, TLS 1.0 et TLS 1.1 ont tous des faiblesses connues et les navigateurs actuels les refusent. TLS 1.2 reste sûr s'il est bien configuré, et TLS 1.3 (RFC 8446, 2018) a supprimé la plupart des vieilles options qui posaient problème. Acceptez ces deux versions, et rien d'autre :

# nginx
ssl_protocols TLSv1.2 TLSv1.3;

# Apache
SSLProtocol -all +TLSv1.2 +TLSv1.3

La pastille montre ce qui a été négocié, pas tout ce que vous autorisez

Un TLSv1.3 vert signifie qu'un client moderne a obtenu une connexion moderne. Une vieille version peut rester activée pour les clients qui la demandent. Pour la tester explicitement : openssl s_client -connect exemple.fr:443 -tls1_1. Un échec de la négociation est le résultat attendu (certaines versions récentes d'OpenSSL refusent même d'essayer, ce qui ne dit rien de votre serveur).

Vérifiez chaque point où TLS se termine

Si un CDN, un répartiteur de charge ou le panneau de votre hébergeur est placé devant le serveur, c'est lui qui fixe la version vue par les visiteurs, pas nginx. Cherchez un réglage « version TLS minimale » dans ce produit et mettez-le à 1.2.

« Mais un vieux client a besoin de TLS 1.0 »

Certains appareils très anciens ou systèmes embarqués, oui. Donnez-leur un nom d'hôte séparé avec sa propre configuration plutôt que d'affaiblir le site principal pour tout le monde.

Suites de chiffrement

Une suite de chiffrement (cipher suite) regroupe les algorithmes utilisés pour une connexion : échange de clés, chiffrement et intégrité. Le nom affiché dans le rapport, par exemple TLS_AES_256_GCM_SHA384 ou ECDHE-RSA-AES128-GCM-SHA256, se lit comme une recette.

TLS 1.3 : rien à choisir

Les suites TLS 1.3 activées par défaut sur les serveurs sont toutes considérées comme sûres. Si la connexion se fait en TLS 1.3, le chiffrement est bon.

TLS 1.2 : gardez ECDHE avec AES-GCM ou ChaCha20-Poly1305

ECDHE apporte la confidentialité persistante (forward secrecy) : une clé volée demain ne permet pas de déchiffrer le trafic enregistré aujourd'hui. Les suites qui commencent par un échange RSA simple ne l'ont pas. Supprimez tout ce qui contient RC4, 3DES, NULL, EXPORT ou anon.

N'écrivez pas la liste à la main. Reprenez le profil « intermediate » du Mozilla SSL Configuration Generator pour votre serveur et sa version. Pour nginx, l'essentiel ressemble à ceci :

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;

Validité du certificat : confiance, nom et dates

Ce sont ces contrôles qui déclenchent l'alerte pleine page du navigateur. Quand l'un d'eux est rouge, c'est par là qu'il faut commencer.

Trusted : no

La chaîne n'a pas pu être validée. Causes habituelles : un certificat auto-signé, un certificat expiré, ou un intermédiaire manquant. Ce dernier cas est trompeur : certains navigateurs de bureau vont chercher la pièce manquante tout seuls, donc le site vous paraît normal, alors que curl, les applis mobiles et les clients d'API échouent. Dans nginx, ssl_certificate doit pointer vers la chaîne complète (avec certbot, fullchain.pem et non cert.pem).

Hostname : mismatch

Le certificat ne contient pas le nom demandé. Les navigateurs ne regardent que la liste Subject Alternative Name (SAN), pas le Common Name. Cas classique : un certificat pour www.exemple.fr servi sur exemple.fr. Faites-le réémettre avec les deux noms.

Expires in : moins de 15 jours

Avec un renouvellement automatique, un certificat est normalement remplacé une trentaine de jours avant son expiration. S'il est encore là à deux semaines de la fin, le renouvellement échoue sans doute en silence (enregistrement DNS modifié, pare-feu qui bloque le challenge ACME, tâche cron qui ne tourne plus). Lancez-le à la main (certbot renew --dry-run) et lisez l'erreur.

Des durées de vie plus courtes arrivent : automatisez maintenant

Les certificats publics ont été limités à 398 jours en 2020, et le CA/Browser Forum a voté une baisse par paliers jusqu'à 47 jours en 2029. Renouveler à la main une fois par an ne sera bientôt plus possible. Passez par ACME (Let's Encrypt, ou le point ACME de votre autorité) ou par les certificats gérés de votre hébergeur.

Par quoi commencer

1

Urgent : certificat expiré ou non reconnu, nom qui ne correspond pas, ou expiration dans quelques jours. Vos visiteurs voient déjà une alerte, ou vont la voir.

2

Important : TLS 1.0 ou 1.1 encore accepté, ou suites de chiffrement faibles. Aucune alerte n'apparaît, mais la connexion est moins solide qu'elle ne devrait.

3

Hygiène : automatisez le renouvellement, puis ajoutez HSTS pour que les navigateurs n'essaient plus jamais le HTTP en clair (voir en-têtes de sécurité HTTP) et limitez qui peut émettre vos certificats (voir CAA et Certificate Transparency).

Vérifiez votre domaine sur mlab.sh

Un scan de domaine mène une négociation TLS avec votre site et indique le protocole et la suite négociés, si le certificat est reconnu, s'il correspond à votre nom et combien de temps il lui reste.

Scanner votre domaine sur mlab.sh

4 Red Flags

Certificat expiré ou sur le point de l'être

Les navigateurs bloquent le site avec une alerte pleine page. Si le renouvellement est automatisé, un certificat aussi proche de la fin signifie que l'automatisation est cassée.

Certificat auto-signé ou chaîne non reconnue

Vos visiteurs ne peuvent pas distinguer votre serveur de celui d'un attaquant. Les habituer à cliquer sur « continuer quand même » est pire que l'alerte elle-même.

Nom d'hôte qui ne correspond pas

Souvent un www oublié, le domaine nu oublié, ou le certificat par défaut de l'hébergeur. Faites réémettre avec tous les noms que vous servez.

TLS 1.0 ou 1.1 négocié

Si le scanner lui-même s'est retrouvé sur une vieille version, c'est que votre serveur la préfère ou ne propose qu'elle. Mettez ssl_protocols TLSv1.2 TLSv1.3; ou l'équivalent sur votre CDN.

Suite sans ECDHE, ou avec RC4 ou 3DES

Le signe d'une configuration copiée il y a des années et jamais revue. Remplacez-la par un profil Mozilla actuel plutôt que de la corriger ligne par ligne.

Modules connexes