Constats TLS : ce que signifie chacun et comment le corriger
Tous les constats qu’une vérification TLS peut signaler, avec leur sens, leur correction et les référentiels qui les comptent. Les constats de disponibilité fixent le statut de la vérification quoi que vous ayez choisi ; les constats de configuration comptent au regard des référentiels choisis et sont sinon enregistrés et notés. Le détail du résultat relie chaque constat à son entrée ici.
Disponibilité
Constats sur la possibilité pour de vrais clients de se connecter. Ils fixent le statut de toute vérification.
Certificat expiré expired
Le certificat, ou un certificat de sa chaîne, a expiré, et tout client refuse la connexion. Renouvelez-le et déployez le nouveau avec ses intermédiaires ; si le renouvellement est automatique, cherchez pourquoi il s’est arrêté.
Met le statut en erreur.
Le certificat expire dans le délai d’erreur expiry_error
Un certificat de la chaîne expire dans votre fenêtre d’erreur. Renouvelez-le maintenant : à ce stade, le renouvellement automatique a déjà échoué au moins une fois.
Met le statut en erreur.
Le certificat expire dans le délai d’alerte expiry_warning
Un certificat de la chaîne expire dans votre fenêtre d’avertissement. Le renouvellement automatique intervient d’ordinaire plus tôt ; vérifiez qu’il fonctionne encore.
Met le statut en avertissement.
Certificat pas encore valide not_yet_valid
La période de validité du certificat n’a pas encore commencé. Soit il a été déployé trop tôt, soit l’horloge du système émetteur est fausse ; déployez un certificat valide dès maintenant.
Met le statut en erreur.
Chaîne non approuvée untrusted
La chaîne ne mène à aucune racine de confiance. Le plus souvent, le serveur omet son certificat intermédiaire : configurez la chaîne complète fournie par l’AC. Dans nginx, ssl_certificate prend le certificat suivi des intermédiaires.
Met le statut en erreur.
Nom non couvert par le certificat hostname_mismatch
Aucun nom du certificat ne couvre l’hôte auquel la vérification se connecte. Émettez le certificat pour ce nom, ou réglez le nom de serveur de la vérification sur celui du certificat.
Met le statut en erreur.
Certificat révoqué revoked
L’AC a révoqué le certificat, et les clients qui vérifient la révocation le refusent. Émettez-en un nouveau et déployez-le ; cherchez pourquoi il a été révoqué, car cela signifie généralement que la clé a été exposée.
Met le statut en erreur.
Preuves Certificate Transparency manquantes ct_non_compliant
Il manque au certificat les preuves Certificate Transparency qu’exigent les navigateurs. Faites-le réémettre par l’AC ; les AC de confiance publique ajoutent ces preuves en standard.
Met le statut en erreur.
Aucune clé ne correspond aux clés épinglées pin_mismatch
Aucune clé de la chaîne servie ne correspond aux épingles définies. Soit le certificat a été renouvelé avec une nouvelle clé, ce qui casse les applications mobiles qui l’épinglent, soit les épingles de la vérification sont périmées. Gardez une épingle de secours pour la clé suivante.
Met le statut en erreur.
Les enregistrements CAA excluent l’AC émettrice caa_forbids_issuer
Les enregistrements CAA du nom n’autorisent pas l’AC qui a émis le certificat actuel ; son renouvellement sera donc refusé. Ajoutez cette AC aux enregistrements, ou changez d’AC avant de renouveler.
Met le statut en avertissement.
Négociation TLS refusée handshake_refused
Le serveur refuse ce que proposent les clients actuels, ou le port ne parle pas TLS. Vérifiez le port et les réglages TLS du serveur ; le résultat indique ce que le serveur a répondu.
Met le statut en erreur.
Échange de clés obsolète uniquement legacy_kex_only
Le serveur ne mène une négociation à bien qu’avec un échange de clés ancien, que beaucoup de clients actuels ne proposent plus. Activez des suites ECDHE.
Met le statut en avertissement.
TLS 1.1 ou antérieur négocié legacy_protocol
Le serveur négocie TLS 1.1 ou plus ancien, que les navigateurs actuels refusent. Activez TLS 1.2 et 1.3.
Met le statut en erreur.
Adresse privée ou réservée blocked_target
L’hôte se résout en une adresse privée ou réservée, à laquelle les vérifications ne se connectent pas. Vérifiez le nom d’hôte, ou surveillez le service depuis votre propre réseau.
Met le statut en erreur.
Aucune réponse TLS unreachable
Trois tentatives n’ont obtenu aucune réponse TLS. Le résultat est inconnu et ne juge rien ; savoir si le serveur fonctionne est le rôle d’une vérification HTTP ou ping.
Rend le résultat inconnu.
Versions du protocole
SSL 3 accepté accepts_ssl3
Le serveur répond encore à SSL 3, qui est cassé. Désactivez-le. Dans nginx : ssl_protocols TLSv1.2 TLSv1.3; Dans Apache : SSLProtocol -all +TLSv1.2 +TLSv1.3.
Exigé par: Mozilla (tls_versions), BSI (§3.2), NIST (§3.1), NCSC-NL (Table 1: Insufficient).
TLS 1.0 accepté accepts_tls10
Le serveur répond encore à TLS 1.0, que les navigateurs actuels n’utilisent plus. Désactivez-le comme SSL 3.
Exigé par: Mozilla (tls_versions), BSI (§3.2), NIST (§3.1), NCSC-NL (Table 1: Insufficient).
TLS 1.1 accepté accepts_tls11
Le serveur répond encore à TLS 1.1, que les navigateurs actuels n’utilisent plus. Désactivez-le comme SSL 3.
Exigé par: Mozilla (tls_versions), BSI (§3.2), NIST (§3.1 (should not)), NCSC-NL (Table 1: Insufficient).
TLS 1.2 accepté au-delà de sa date accepts_tls12
Le serveur accepte TLS 1.2 au-delà de la date jusqu’à laquelle le référentiel l’autorise. Prévoyez de ne servir que TLS 1.3 dès que vos clients le permettent.
Exigé par: BSI (§3.2 Table 2 (TLS 1.2 up to 2031)).
Pas de TLS 1.3 no_tls13
Le serveur ne négocie pas TLS 1.3. Activez-le ; il est plus rapide et écarte d’emblée tout ce qui est faible. Tout logiciel serveur actuel le prend en charge.
Exigé par: NIST (§3.1).
Intolérant aux versions TLS plus récentes version_intolerant
Le serveur interrompt une négociation qui propose une version de TLS plus récente que la sienne au lieu de revenir à une version antérieure. Cela casse des clients à mesure que les versions avancent ; mettez à jour le logiciel du serveur ou l’équipement placé devant.
Exigé par: NIST (§3.1).
Suites de chiffrement
Chiffrements nuls acceptés accepts_null
Le serveur accepte des suites qui ne chiffrent rien. Retirez-les de sa liste de suites.
Exigé par: Mozilla (ciphers), BSI (not in Tables 3–5), NIST (§3.3.1), NCSC-NL (Tables 6, 8: Insufficient).
Échange de clés anonyme accepté accepts_anon
Le serveur accepte un échange de clés anonyme, que n’importe qui sur le chemin peut intercepter. Retirez ces suites.
Exigé par: Mozilla (ciphers), BSI (not in Tables 3–5), NIST (§3.3.1), NCSC-NL (Table 2: Insufficient).
Chiffrements export acceptés accepts_export
Le serveur accepte des suites d’exportation, qui sont cassées. Retirez-les.
Exigé par: Mozilla (ciphers), BSI (not in Tables 3–5), NIST (§3.3.1), NCSC-NL (Table 2: Insufficient).
RC4 accepté accepts_rc4
Le serveur accepte RC4, qui est cassé. Retirez-le de la liste des suites.
Exigé par: Mozilla (ciphers), BSI (not in Tables 3–5), NIST (§3.3.1), NCSC-NL (Table 8: Insufficient).
DES ou 3DES accepté accepts_3des
Le serveur accepte DES ou 3DES, trop faibles. Retirez-les de la liste des suites.
Exigé par: Mozilla (ciphers), BSI (not in Tables 3–5), NIST (§3.3.1.1), NCSC-NL (Table 8: Insufficient).
Échange de clés sans confidentialité persistante accepts_static_kex
Le serveur accepte un échange de clés sans confidentialité persistante : une clé volée plus tard déchiffre le trafic passé. Ne proposez que des suites ECDHE (et TLS 1.3).
Exigé par: Mozilla (ciphers), BSI (RSA key transport, not in Tables 3–5; §3.3.1.2 Table 4 (up to 2026)), NCSC-NL (Table 6: Insufficient).
Suites CBC avec MAC SHA-1 acceptées accepts_sha1_mac
Le serveur accepte des suites CBC avec SHA-1 pour l’authentification des messages. Préférez les suites AES-GCM et ChaCha20 et retirez celles-ci.
Exigé par: Mozilla (ciphers), BSI (not in Tables 3–5), NCSC-NL (Table 9: Insufficient).
Suites CBC acceptées accepts_cbc
Le serveur accepte des suites CBC, qui ont un long passif d’attaques par remplissage. Ne proposez que des suites AEAD (AES-GCM, ChaCha20).
Exigé par: Mozilla (ciphers), NCSC-NL (Table 8: To be phased out).
Suites DHE à corps fini acceptées accepts_dhe
Le serveur accepte des suites DHE à corps fini, lentes et en cours de retrait. Proposez plutôt des suites ECDHE.
Exigé par: Mozilla (ciphers), BSI (§3.3.1.1 Table 3 (TLS 1.2 DHE up to 2029)), NCSC-NL (Table 6: To be phased out).
Suites TLS 1.2 hors du référentiel suite_not_allowed
Le serveur accepte des suites TLS 1.2 que le référentiel ne cite pas, comme ChaCha20, CCM, Camellia ou ARIA selon le référentiel. Le constat les nomme ; retirez-les si le référentiel compte pour vous.
Exigé par: Mozilla (ciphers), BSI (not in Tables 3–5), NIST (§3.3.1.1), NCSC-NL (Table 8: Insufficient).
Suites TLS 1.3 hors du référentiel tls13_suite_not_allowed
Le serveur accepte des suites TLS 1.3 que le référentiel ne cite pas : ChaCha20 pour le BSI et le NIST, les suites CCM pour Mozilla et le NCSC-NL. Dans les serveurs basés sur OpenSSL, les suites TLS 1.3 se règlent à part, par exemple avec ssl_conf_command Ciphersuites dans nginx.
Exigé par: Mozilla (ciphersuites), BSI (§3.4.4 Table 13), NIST (§3.3.1.2), NCSC-NL (Table 8: Insufficient).
Échange de clés
Groupes d’échange de clés hors du référentiel kex_group_not_allowed
Le serveur accepte des groupes d’échange de clés que le référentiel ne cite pas, comme X25519 pour le BSI ou le NIST. Fixez les groupes explicitement : ssl_ecdh_curve dans nginx, SSLOpenSSLConfCmd Curves dans Apache.
Exigé par: Mozilla (tls_curves), BSI (§3.3.2 Table 6, §3.4.2 Table 10), NIST (§3.3.1, §3.4.2.2), NCSC-NL (Tables 3, 6, 7: Insufficient).
Groupe d’échange de clés exigé absent no_required_kex_group
Le serveur ne négocie aucun des groupes qu’exige le référentiel, P-256 ou P-384 pour le NIST. Ajoutez-en un aux groupes du serveur.
Exigé par: BSI (§3.3.2 Table 6, §3.4.2 Table 10), NIST (§3.4.2.2).
Pas d’échange de clés hybride post-quantique no_pq_hybrid
Le serveur ne négocie aucun échange de clés hybride post-quantique, que le référentiel attend à partir de sa date. Les versions actuelles d’OpenSSL et de BoringSSL en proposent un.
Exigé par: BSI (§3.1.3 (classical key agreement alone up to 2031)).
Groupe DH faible weak_dh
Le groupe DH du serveur est plus petit que ce qu’autorise le référentiel, ou n’est pas l’un des groupes standard de la RFC 7919. Utilisez un groupe standard au moins de la taille indiquée, ou renoncez à DHE.
Exigé par: Mozilla (dh_param_size), BSI (§3.6.1 Table 14), NIST (§3.3.1, §3.3.3), NCSC-NL (Table 7: Insufficient).
Négociation
Compression TLS activée tls_compression
Le serveur accepte la compression au niveau TLS, qui laisse fuir des secrets (CRIME). Désactivez-la.
Exigé par: BSI (§3.3.4.3), NIST (§3.7), NCSC-NL (Table 10: Insufficient).
Pas de renégociation sécurisée insecure_renegotiation
Le serveur ne prend pas en charge la renégociation sécurisée (RFC 5746). Mettez à jour la bibliothèque TLS ; toute bibliothèque maintenue la prend en charge.
Exigé par: BSI (§3.3.4.1), NIST (§3.4.1.1), NCSC-NL (Table 11: Insufficient).
Extension Heartbeat activée heartbeat_enabled
Le serveur négocie l’extension Heartbeat, celle qu’a exploitée Heartbleed. Elle est seulement signalée, jamais sollicitée ; désactivez-la.
Exigé par: BSI (§3.3.4.6).
HMAC tronqué activé truncated_hmac
Le serveur négocie un HMAC tronqué, qui affaiblit l’intégrité. Désactivez-le.
Exigé par: BSI (§3.3.4.2), NIST (§3.4.2 item 8).
Pas d’Extended Master Secret no_extended_master_secret
Le serveur ne négocie pas Extended Master Secret (RFC 7627). Mettez à jour la bibliothèque TLS ou activez-le.
Exigé par: BSI (§3.3.4.7), NIST (§3.4.1.3).
CBC sans Encrypt-then-MAC cbc_without_etm
Le serveur utilise des suites CBC sans Encrypt-then-MAC (RFC 7366). Activez-le, ou mieux, renoncez aux suites CBC.
Exigé par: BSI (§3.3.4.5), NIST (§3.4.2.7).
Rétrogradation non empêchée (TLS_FALLBACK_SCSV) no_fallback_scsv
Le serveur accepte une négociation rétrogradée malgré TLS_FALLBACK_SCSV : un attaquant peut ainsi pousser les clients vers une version plus ancienne. Mettez à jour la bibliothèque TLS, ou désactivez les anciennes versions.
Exigé par: NIST (§3.4.2.1).
Négociation signée avec RSA PKCS #1 v1.5 pkcs1_handshake_signature
S’il ne se voit proposer que des signatures RSA PKCS #1 v1.5, le serveur en utilise une pour signer son échange de clés. Certains référentiels veulent RSA-PSS ; les bibliothèques actuelles le préfèrent quand les clients le proposent.
Exigé par: BSI (§3.3.3 Table 7 (rsa up to 2025)).
Négociation signée avec SHA-1 weak_handshake_hash
S’il ne se voit proposer que SHA-1, le serveur s’en sert pour signer son échange de clés. Limitez les algorithmes de signature à SHA-256 ou plus fort.
Exigé par: BSI (§3.3.3 Table 8), NIST (§3.3.3), NCSC-NL (Table 9: Insufficient).
Certificat
Clé du certificat trop courte weak_key
La clé du certificat est plus petite que ce qu’autorise le référentiel. Émettez le prochain certificat avec une clé plus grande, ou en ECDSA.
Exigé par: Mozilla (certificate_curves; rsa_key_size), BSI (§3.6.1 Table 14), NIST (§3.2.1 Table 3-1, §3.3.3), NCSC-NL (Table 3: Insufficient; Table 4: Insufficient).
Clé d’un certificat intermédiaire trop courte weak_chain_key
La clé d’un certificat intermédiaire est plus petite que ce qu’autorise le référentiel. L’intermédiaire vient de votre AC ; demandez une chaîne avec un intermédiaire plus fort, ou changez d’AC.
Exigé par: BSI (§3.6), NIST (§3.3.3).
Signature MD5 ou SHA-1 dans la chaîne weak_signature
Un certificat de la chaîne est signé en MD5 ou SHA-1. Faites-le réémettre ; s’il s’agit de l’intermédiaire, votre AC en a un actuel.
Exigé par: Mozilla (certificate_signatures), BSI (§3.3.3 Table 8, §3.4.3 Table 12), NIST (§3.3.3), NCSC-NL (Table 9: Insufficient).
Signature RSA PKCS #1 v1.5 dans la chaîne pkcs1_signature
Un certificat de la chaîne est signé en RSA PKCS #1 v1.5, que certains référentiels ne recommandent plus. Les respecter en pratique suppose une chaîne ECDSA.
Exigé par: BSI (§3.3.3 Table 7, §3.4.3 Table 12 (up to 2025)).
Type de clé hors du référentiel cert_type_not_allowed
Le type de clé du certificat est hors du référentiel, comme DSA ou EdDSA. Émettez un certificat RSA ou ECDSA.
Exigé par: Mozilla (certificate_types), BSI (§3.3.3 Table 7), NIST (§3.2), NCSC-NL (Table 2: Insufficient).
Courbe hors du référentiel curve_not_allowed
La courbe du certificat est hors du référentiel. Émettez-le sur P-256 ou P-384.
Exigé par: Mozilla (certificate_curves), BSI (§3.6.2), NIST (§3.2, Table 3-1), NCSC-NL (Tables 3, 5: Insufficient).
Certificat valide trop longtemps long_lifespan
Le certificat est valide plus longtemps que ne l’autorise le référentiel. Émettez des certificats de plus courte durée, idéalement renouvelés automatiquement.
Exigé par: Mozilla (maximum_certificate_lifespan), NIST (Table 3-1).
Nom générique dans le certificat wildcard
Le certificat couvre un nom générique. Tous les hôtes qu’il couvre partagent la clé : un seul hôte compromis les expose tous. Préférez des certificats pour des hôtes nommés.
Exigé par: BSI (TR-02103 (1.0) §4.1.2).
Pas d’extension Key Usage no_key_usage
Le certificat n’a pas d’extension Key Usage. Demandez à votre AC un certificat qui la définit.
Exigé par: BSI (TR-02103 (1.0) Table 30), NIST (Table 3-1).
Key Usage non marquée critique key_usage_not_critical
Le Key Usage du certificat n’est pas marqué critique. Demandez à votre AC un certificat qui le marque.
Exigé par: BSI (TR-02103 (1.0) Table 34), NIST (Table 3-1).
Key Usage inadaptée à l’échange de clés key_usage_mismatch
Le Key Usage du certificat n’autorise pas l’échange de clés utilisé par le serveur, par exemple le transport de clé RSA avec une clé de signature seule. Retirez les suites à transport de clé RSA, ou faites réémettre le certificat.
Exigé par: BSI (TR-02103 (1.0) §4.1.3), NIST (Table 3-1).
Pas d’Extended Key Usage no_server_auth_eku
Le certificat n’a pas d’Extended Key Usage. Demandez à votre AC un certificat qui mentionne l’authentification de serveur TLS.
Exigé par: BSI (TR-02103 (1.0) §4.1.4), NIST (Table 3-1).
Extended Key Usage autorise tout usage eku_any_purpose
L’Extended Key Usage du certificat autorise tout usage. Demandez à votre AC un certificat limité à l’authentification de serveur TLS.
Exigé par: NIST (Table 3-1).
Pas d’Authority Key Identifier no_aki
Le certificat n’a pas d’Authority Key Identifier, qui aide les clients à construire la chaîne. Demandez à votre AC un certificat qui en a un.
Exigé par: BSI (TR-02103 (1.0) Table 30), NIST (Table 3-1).
Pas de répondeur OCSP no_ocsp_responder
Le certificat n’indique aucun répondeur OCSP. Beaucoup d’AC ont cessé de proposer OCSP ; ce n’est donc un constat que là où un référentiel l’exige.
Exigé par: NIST (§3.2, Table 3-1).
DNS
Pas d’enregistrement CAA no_caa
Le nom n’a pas d’enregistrements CAA : n’importe quelle AC peut émettre des certificats pour lui. Publiez un enregistrement CAA qui nomme les AC que vous utilisez.
Aucun référentiel ne l’exige : il est seulement enregistré et pris en compte dans la note.
Pas d’Encrypted Client Hello no_ech
L’enregistrement DNS HTTPS du nom n’annonce pas Encrypted Client Hello. Seulement enregistré ; cela ne coûte jamais de cadenas, car cela dépend autant de votre CDN que de vous.
Aucun référentiel ne l’exige : il est seulement enregistré et pris en compte dans la note.
Révocation
Pas d’agrafage OCSP no_ocsp_stapling
Le certificat indique un répondeur OCSP et le serveur n’agrafe aucune réponse : chaque client doit interroger l’AC lui-même. Dans nginx : ssl_stapling on; Dans Apache : SSLUseStapling on.
Exigé par: Mozilla (ocsp_staple), NIST (§3.4.1.5).
HTTP
Pas d’en-tête HSTS no_hsts
La réponse HTTPS ne contient pas d’en-tête Strict-Transport-Security ; un navigateur qui arrive en HTTP non chiffré, par une adresse saisie ou un ancien lien, peut donc être intercepté avant d’atteindre HTTPS. Envoyez l’en-tête sur chaque réponse HTTPS. Dans nginx : add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
Exigé par: Mozilla (hsts_min_age).
max-age HSTS trop court short_hsts
Le max-age HSTS est plus court que demandé : deux ans selon Mozilla, un an pour le cinquième cadenas. Les navigateurs retiennent l’en-tête pendant toute cette durée ; augmentez donc le max-age dès que HTTPS fonctionne partout sous ce nom.
Exigé par: Mozilla (hsts_min_age).
HSTS sans les sous-domaines hsts_no_subdomains
L’en-tête HSTS laisse de côté les sous-domaines, si bien qu’un sous-domaine atteint en HTTP non chiffré peut encore définir des cookies pour tout le domaine. Ajoutez includeSubDomains dès que chaque sous-domaine sert HTTPS.
Aucun référentiel ne l’exige : il est seulement enregistré et pris en compte dans la note.
Pas de redirection vers HTTPS no_https_redirect
Le port 80 répond sans envoyer les visiteurs vers HTTPS sur le même nom : il sert la page en HTTP non chiffré, redirige vers HTTP ou redirige d’abord vers un autre nom. Redirigez chaque requête HTTP vers https:// sur le même nom ; le passage à un autre nom vient ensuite, en HTTPS. Un port 80 fermé n’est pas un constat.
Aucun référentiel ne l’exige : il est seulement enregistré et pris en compte dans la note.
Redirection vers HTTPS non permanente redirect_not_permanent
Le port 80 redirige vers HTTPS avec un statut temporaire (302, 303 ou 307), si bien que navigateurs et moteurs de recherche reviennent sans cesse en HTTP non chiffré. Utilisez 301 ou 308. Dans nginx : return 301 https://$host$request_uri;
Aucun référentiel ne l’exige : il est seulement enregistré et pris en compte dans la note.
Cookies sans Secure insecure_cookie
La réponse HTTPS définit des cookies sans l’attribut Secure ; le navigateur les envoie donc aussi en HTTP non chiffré, où n’importe qui sur le trajet peut les lire. Ajoutez Secure à chaque cookie ; le constat les nomme. Leurs valeurs ne sont jamais enregistrées.
Aucun référentiel ne l’exige : il est seulement enregistré et pris en compte dans la note.
En-têtes d’épinglage obsolètes obsolete_pinning
La réponse contient Public-Key-Pins ou Expect-CT. Les navigateurs ont abandonné les deux il y a des années, et un en-tête d’épinglage oublié peut encore bloquer un client qui le respecte. Supprimez-les : les navigateurs imposent Certificate Transparency sans l’en-tête, et une application mobile épingle ses clés dans son propre code.
Aucun référentiel ne l’exige : il est seulement enregistré et pris en compte dans la note.
Couverture des sondes
Test de configuration incomplet posture_incomplete
Le test de configuration quotidien n’a pas pu tout établir : une sonde n’a pas été envoyée ou n’a reçu aucune réponse, le serveur a accepté plus de suites de chiffrement que le test n’en énumère, ou un certificat était trop volumineux pour être conservé. Aucun référentiel n’est tenu pour respecté sur ce que le test n’a pas vu : la note reste à trois cadenas tant qu’un référentiel choisi est concerné, et sous cinq sinon. Cela se résout en général au test du lendemain ; si cela persiste, vérifiez que le serveur répond à chaque connexion au lieu d’en abandonner certaines. Avec les vérifications HTTP actives, une requête HTTPS restée sans réponse compte de la même façon ; désactivez-les pour un port qui ne sert pas HTTP.
Aucun référentiel ne l’exige : il est seulement enregistré et pris en compte dans la note.