Documentazione

Rilievi TLS: che cosa significa ciascuno e come correggerlo

Tutti i rilievi che un controllo TLS può segnalare, con il loro significato, la correzione e i riferimenti che li contano. I rilievi di disponibilità impostano lo stato del controllo qualunque sia la tua scelta; quelli di configurazione contano rispetto ai riferimenti scelti e altrimenti vengono registrati e valutati. Il dettaglio del risultato collega ogni rilievo alla sua voce qui.

Disponibilità

Rilievi sulla possibilità per i client reali di collegarsi. Impostano lo stato in ogni controllo.

Certificato scaduto expired

Il certificato, o uno della sua catena, è scaduto, e ogni client rifiuta la connessione. Rinnovalo e installa il nuovo con i suoi intermedi; se il rinnovo è automatico, verifica perché si è fermato.

Imposta lo stato su errore.

Il certificato scade entro la soglia di errore expiry_error

Un certificato della catena scade entro la tua finestra di errore. Rinnovalo ora: a questo punto il rinnovo automatico è già fallito almeno una volta.

Imposta lo stato su errore.

Il certificato scade entro la soglia di avviso expiry_warning

Un certificato della catena scade entro la tua finestra di avviso. Il rinnovo automatico di solito arriva prima; verifica che funzioni ancora.

Imposta lo stato su avviso.

Certificato non ancora valido not_yet_valid

La validità del certificato inizia nel futuro. O è stato installato troppo presto o l’orologio del sistema emittente è sbagliato; installa un certificato valido adesso.

Imposta lo stato su errore.

Catena non attendibile untrusted

La catena non porta a una radice attendibile. Il più delle volte il server omette il certificato intermedio: configura la catena completa fornita dalla CA. In nginx, ssl_certificate prende il certificato seguito dagli intermedi.

Imposta lo stato su errore.

Nome non coperto dal certificato hostname_mismatch

Nessun nome del certificato copre l’host a cui si collega il controllo. Emetti il certificato per quel nome, oppure imposta come nome del server del controllo quello del certificato.

Imposta lo stato su errore.

Certificato revocato revoked

La CA ha revocato il certificato, e i client che verificano la revoca lo rifiutano. Emettine e installane uno nuovo; scopri perché è stato revocato, perché di solito significa che la chiave è stata esposta.

Imposta lo stato su errore.

Mancano le prove di Certificate Transparency ct_non_compliant

Al certificato mancano le prove Certificate Transparency che i browser richiedono. Fallo riemettere dalla CA; le CA pubblicamente attendibili aggiungono le prove di serie.

Imposta lo stato su errore.

Nessuna chiave corrisponde alle chiavi fissate pin_mismatch

Nessuna chiave della catena servita corrisponde ai pin impostati. O il certificato è stato rinnovato con una chiave nuova, il che rompe le app mobili che la fissano, o i pin del controllo non sono aggiornati. Tieni un pin di riserva per la chiave successiva.

Imposta lo stato su errore.

I record CAA escludono la CA emittente caa_forbids_issuer

I record CAA del nome non consentono la CA che ha emesso il certificato attuale, quindi il suo rinnovo sarà rifiutato. Aggiungi quella CA ai record, oppure cambia CA prima di rinnovare.

Imposta lo stato su avviso.

Handshake rifiutato handshake_refused

Il server rifiuta ciò che offrono i client attuali, oppure la porta non parla TLS. Controlla la porta e le impostazioni TLS del server; il risultato dice che cosa ha risposto il server.

Imposta lo stato su errore.

Solo scambio di chiavi obsoleto legacy_kex_only

Il server completa un handshake solo con uno scambio di chiavi datato, che molti client attuali non offrono più. Attiva le suite ECDHE.

Imposta lo stato su avviso.

Negoziato TLS 1.1 o precedente legacy_protocol

Il server negozia TLS 1.1 o precedente, che i browser attuali rifiutano. Attiva TLS 1.2 e 1.3.

Imposta lo stato su errore.

Indirizzo privato o riservato blocked_target

L’host si risolve in un indirizzo privato o riservato, a cui i controlli non si collegano. Controlla il nome host, oppure monitora il servizio dalla tua rete.

Imposta lo stato su errore.

Nessuna risposta TLS unreachable

Tre tentativi non hanno ottenuto risposta TLS. Il risultato è sconosciuto e non giudica nulla; sapere se il server è attivo è compito di un controllo HTTP o ping.

Rende il risultato sconosciuto.

Versioni del protocollo

SSL 3 accettato accepts_ssl3

Il server risponde ancora a SSL 3, che è compromesso. Disattivalo. In nginx: ssl_protocols TLSv1.2 TLSv1.3; In Apache: SSLProtocol -all +TLSv1.2 +TLSv1.3.

Richiesto da: Mozilla (tls_versions), BSI (§3.2), NIST (§3.1), NCSC-NL (Table 1: Insufficient).

TLS 1.0 accettato accepts_tls10

Il server risponde ancora a TLS 1.0, che i browser attuali non usano più. Disattivalo come per SSL 3.

Richiesto da: Mozilla (tls_versions), BSI (§3.2), NIST (§3.1), NCSC-NL (Table 1: Insufficient).

TLS 1.1 accettato accepts_tls11

Il server risponde ancora a TLS 1.1, che i browser attuali non usano più. Disattivalo come per SSL 3.

Richiesto da: Mozilla (tls_versions), BSI (§3.2), NIST (§3.1 (should not)), NCSC-NL (Table 1: Insufficient).

TLS 1.2 accettato oltre la sua data accepts_tls12

Il server accetta TLS 1.2 oltre la data fino a cui il riferimento lo consente. Prevedi di servire solo TLS 1.3 appena i tuoi client lo permettono.

Richiesto da: BSI (§3.2 Table 2 (TLS 1.2 up to 2031)).

Nessun TLS 1.3 no_tls13

Il server non negozia TLS 1.3. Attivalo: è più veloce e per progettazione esclude tutto ciò che è debole. Ogni software server attuale lo supporta.

Richiesto da: NIST (§3.1).

Non tollera versioni TLS più recenti version_intolerant

Il server interrompe un handshake che offre una versione di TLS più recente della sua invece di negoziarne una precedente. Questo rompe i client man mano che arrivano nuove versioni; aggiorna il software del server o l’apparato che gli sta davanti.

Richiesto da: NIST (§3.1).

Suite di cifratura

Cifrari nulli accettati accepts_null

Il server accetta suite che non cifrano nulla. Toglile dal suo elenco di suite.

Richiesto da: Mozilla (ciphers), BSI (not in Tables 3–5), NIST (§3.3.1), NCSC-NL (Tables 6, 8: Insufficient).

Scambio di chiavi anonimo accettato accepts_anon

Il server accetta lo scambio di chiavi anonimo, che chiunque sul percorso può intercettare. Togli quelle suite.

Richiesto da: Mozilla (ciphers), BSI (not in Tables 3–5), NIST (§3.3.1), NCSC-NL (Table 2: Insufficient).

Cifrari export accettati accepts_export

Il server accetta suite da esportazione, che sono compromesse. Toglile.

Richiesto da: Mozilla (ciphers), BSI (not in Tables 3–5), NIST (§3.3.1), NCSC-NL (Table 2: Insufficient).

RC4 accettato accepts_rc4

Il server accetta RC4, che è compromesso. Toglilo dall’elenco delle suite.

Richiesto da: Mozilla (ciphers), BSI (not in Tables 3–5), NIST (§3.3.1), NCSC-NL (Table 8: Insufficient).

DES o 3DES accettato accepts_3des

Il server accetta DES o 3DES, troppo deboli. Toglili dall’elenco delle suite.

Richiesto da: Mozilla (ciphers), BSI (not in Tables 3–5), NIST (§3.3.1.1), NCSC-NL (Table 8: Insufficient).

Scambio di chiavi senza forward secrecy accepts_static_kex

Il server accetta uno scambio di chiavi senza forward secrecy, quindi una chiave rubata in seguito decifra il traffico passato. Offri solo suite ECDHE (e TLS 1.3).

Richiesto da: 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).

Suite CBC con MAC SHA-1 accettate accepts_sha1_mac

Il server accetta suite CBC con SHA-1 per l’autenticazione dei messaggi. Preferisci suite AES-GCM e ChaCha20 e togli queste.

Richiesto da: Mozilla (ciphers), BSI (not in Tables 3–5), NCSC-NL (Table 9: Insufficient).

Suite CBC accettate accepts_cbc

Il server accetta suite CBC, con una lunga storia di attacchi al padding. Offri solo suite AEAD (AES-GCM, ChaCha20).

Richiesto da: Mozilla (ciphers), NCSC-NL (Table 8: To be phased out).

Suite DHE a campo finito accettate accepts_dhe

Il server accetta suite DHE a campo finito, lente e in fase di dismissione. Offri invece suite ECDHE.

Richiesto da: Mozilla (ciphers), BSI (§3.3.1.1 Table 3 (TLS 1.2 DHE up to 2029)), NCSC-NL (Table 6: To be phased out).

Suite TLS 1.2 fuori dal riferimento suite_not_allowed

Il server accetta suite TLS 1.2 che il riferimento non elenca, come ChaCha20, CCM, Camellia o ARIA a seconda del riferimento. Il rilievo le nomina; toglile se il riferimento è importante per te.

Richiesto da: Mozilla (ciphers), BSI (not in Tables 3–5), NIST (§3.3.1.1), NCSC-NL (Table 8: Insufficient).

Suite TLS 1.3 fuori dal riferimento tls13_suite_not_allowed

Il server accetta suite TLS 1.3 che il riferimento non elenca: ChaCha20 per BSI e NIST, le suite CCM per Mozilla e NCSC-NL. Nei server basati su OpenSSL le suite TLS 1.3 si impostano a parte, per esempio con ssl_conf_command Ciphersuites in nginx.

Richiesto da: Mozilla (ciphersuites), BSI (§3.4.4 Table 13), NIST (§3.3.1.2), NCSC-NL (Table 8: Insufficient).

Scambio di chiavi

Gruppi di scambio di chiavi fuori dal riferimento kex_group_not_allowed

Il server accetta gruppi di scambio di chiavi che il riferimento non elenca, come X25519 per BSI o NIST. Imposta i gruppi esplicitamente: ssl_ecdh_curve in nginx, SSLOpenSSLConfCmd Curves in Apache.

Richiesto da: 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).

Manca il gruppo di scambio di chiavi richiesto no_required_kex_group

Il server non negozia nessuno dei gruppi richiesti dal riferimento, P-256 o P-384 per NIST. Aggiungine uno ai gruppi del server.

Richiesto da: BSI (§3.3.2 Table 6, §3.4.2 Table 10), NIST (§3.4.2.2).

Nessuno scambio di chiavi ibrido post-quantistico no_pq_hybrid

Il server non negozia alcuno scambio di chiavi ibrido post-quantistico, che il riferimento si aspetta dalla sua data. Le versioni attuali di OpenSSL e BoringSSL ne offrono uno.

Richiesto da: BSI (§3.1.3 (classical key agreement alone up to 2031)).

Gruppo DH debole weak_dh

Il gruppo DH del server è più piccolo di quanto il riferimento consenta, oppure non è uno dei gruppi standard della RFC 7919. Usa un gruppo standard almeno della dimensione indicata, oppure rinuncia a DHE.

Richiesto da: Mozilla (dh_param_size), BSI (§3.6.1 Table 14), NIST (§3.3.1, §3.3.3), NCSC-NL (Table 7: Insufficient).

Handshake

Compressione TLS attiva tls_compression

Il server accetta la compressione a livello TLS, che fa trapelare segreti (CRIME). Disattivala.

Richiesto da: BSI (§3.3.4.3), NIST (§3.7), NCSC-NL (Table 10: Insufficient).

Nessuna rinegoziazione sicura insecure_renegotiation

Il server non supporta la rinegoziazione sicura (RFC 5746). Aggiorna la libreria TLS; ogni libreria mantenuta la supporta.

Richiesto da: BSI (§3.3.4.1), NIST (§3.4.1.1), NCSC-NL (Table 11: Insufficient).

Estensione Heartbeat attiva heartbeat_enabled

Il server negozia l’estensione Heartbeat, quella sfruttata da Heartbleed. Viene solo segnalata, mai sollecitata; disattivala.

Richiesto da: BSI (§3.3.4.6).

HMAC troncato attivo truncated_hmac

Il server negozia l’HMAC troncato, che indebolisce l’integrità. Disattivalo.

Richiesto da: BSI (§3.3.4.2), NIST (§3.4.2 item 8).

Nessun Extended Master Secret no_extended_master_secret

Il server non negozia l’Extended Master Secret (RFC 7627). Aggiorna la libreria TLS o attivalo.

Richiesto da: BSI (§3.3.4.7), NIST (§3.4.1.3).

CBC senza Encrypt-then-MAC cbc_without_etm

Il server usa suite CBC senza Encrypt-then-MAC (RFC 7366). Attivalo, o meglio rinuncia alle suite CBC.

Richiesto da: BSI (§3.3.4.5), NIST (§3.4.2.7).

Downgrade non impedito (TLS_FALLBACK_SCSV) no_fallback_scsv

Il server accetta un handshake con downgrade nonostante TLS_FALLBACK_SCSV, quindi un attaccante può spingere i client verso una versione precedente. Aggiorna la libreria TLS, oppure disattiva le versioni vecchie.

Richiesto da: NIST (§3.4.2.1).

Handshake firmato con RSA PKCS #1 v1.5 pkcs1_handshake_signature

Se gli si offrono solo firme RSA PKCS #1 v1.5, il server ne usa una per firmare il suo scambio di chiavi. Alcuni riferimenti vogliono RSA-PSS; le librerie attuali lo preferiscono quando i client lo offrono.

Richiesto da: BSI (§3.3.3 Table 7 (rsa up to 2025)).

Handshake firmato con SHA-1 weak_handshake_hash

Se gli si offre solo SHA-1, il server lo usa per firmare il suo scambio di chiavi. Limita gli algoritmi di firma a SHA-256 o più forti.

Richiesto da: BSI (§3.3.3 Table 8), NIST (§3.3.3), NCSC-NL (Table 9: Insufficient).

Certificato

Chiave del certificato troppo corta weak_key

La chiave del certificato è più piccola di quanto il riferimento consenta. Emetti il prossimo certificato con una chiave più grande, o ECDSA.

Richiesto da: 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).

Chiave di un certificato intermedio troppo corta weak_chain_key

La chiave di un certificato intermedio è più piccola di quanto il riferimento consenta. L’intermedio viene dalla tua CA; chiedi una catena con uno più forte, oppure cambia CA.

Richiesto da: BSI (§3.6), NIST (§3.3.3).

Firma MD5 o SHA-1 nella catena weak_signature

Un certificato della catena è firmato con MD5 o SHA-1. Fallo riemettere; se è l’intermedio, la tua CA ne ha uno attuale.

Richiesto da: Mozilla (certificate_signatures), BSI (§3.3.3 Table 8, §3.4.3 Table 12), NIST (§3.3.3), NCSC-NL (Table 9: Insufficient).

Firma RSA PKCS #1 v1.5 nella catena pkcs1_signature

Un certificato della catena è firmato con RSA PKCS #1 v1.5, che alcuni riferimenti non raccomandano più. Rispettarli in pratica significa una catena ECDSA.

Richiesto da: BSI (§3.3.3 Table 7, §3.4.3 Table 12 (up to 2025)).

Tipo di chiave fuori dal riferimento cert_type_not_allowed

Il tipo di chiave del certificato è al di fuori del riferimento, come DSA o EdDSA. Emetti un certificato RSA o ECDSA.

Richiesto da: Mozilla (certificate_types), BSI (§3.3.3 Table 7), NIST (§3.2), NCSC-NL (Table 2: Insufficient).

Curva fuori dal riferimento curve_not_allowed

La curva del certificato è al di fuori del riferimento. Emettilo su P-256 o P-384.

Richiesto da: Mozilla (certificate_curves), BSI (§3.6.2), NIST (§3.2, Table 3-1), NCSC-NL (Tables 3, 5: Insufficient).

Certificato valido troppo a lungo long_lifespan

Il certificato è valido più a lungo di quanto il riferimento consenta. Emetti certificati di durata più breve, idealmente rinnovati in automatico.

Richiesto da: Mozilla (maximum_certificate_lifespan), NIST (Table 3-1).

Nome jolly nel certificato wildcard

Il certificato copre un nome jolly. Tutti gli host che copre condividono la chiave, quindi un solo host compromesso li espone tutti. Preferisci certificati per host con nome.

Richiesto da: BSI (TR-02103 (1.0) §4.1.2).

Nessuna estensione Key Usage no_key_usage

Il certificato non ha l’estensione Key Usage. Chiedi alla tua CA un certificato che la imposti.

Richiesto da: BSI (TR-02103 (1.0) Table 30), NIST (Table 3-1).

Key Usage non marcata come critica key_usage_not_critical

Il Key Usage del certificato non è contrassegnato come critico. Chiedi alla tua CA un certificato che lo contrassegni.

Richiesto da: BSI (TR-02103 (1.0) Table 34), NIST (Table 3-1).

Key Usage non adatta allo scambio di chiavi key_usage_mismatch

Il Key Usage del certificato non consente lo scambio di chiavi usato dal server, per esempio il trasporto di chiavi RSA con una chiave solo di firma. Togli le suite con trasporto di chiavi RSA, oppure fai riemettere il certificato.

Richiesto da: BSI (TR-02103 (1.0) §4.1.3), NIST (Table 3-1).

Nessuna Extended Key Usage no_server_auth_eku

Il certificato non ha Extended Key Usage. Chiedi alla tua CA un certificato che indichi l’autenticazione del server TLS.

Richiesto da: BSI (TR-02103 (1.0) §4.1.4), NIST (Table 3-1).

Extended Key Usage consente qualsiasi uso eku_any_purpose

L’Extended Key Usage del certificato consente qualsiasi scopo. Chiedi alla tua CA un certificato limitato all’autenticazione del server TLS.

Richiesto da: NIST (Table 3-1).

Nessun Authority Key Identifier no_aki

Il certificato non ha l’Authority Key Identifier, che aiuta i client a costruire la catena. Chiedi alla tua CA un certificato che ce l’abbia.

Richiesto da: BSI (TR-02103 (1.0) Table 30), NIST (Table 3-1).

Nessun responder OCSP no_ocsp_responder

Il certificato non indica alcun responder OCSP. Molte CA hanno smesso di offrire OCSP, quindi è un rilievo solo dove un riferimento lo richiede.

Richiesto da: NIST (§3.2, Table 3-1).

DNS

Nessun record CAA no_caa

Il nome non ha record CAA, quindi qualsiasi CA può emettere certificati per esso. Pubblica un record CAA con le CA che usi.

Non richiesto da alcun riferimento: solo registrato e valutato.

Nessun Encrypted Client Hello no_ech

Il record DNS HTTPS del nome non annuncia l’Encrypted Client Hello. Solo registrato; non costa mai un lucchetto, perché dipende dalla tua CDN quanto da te.

Non richiesto da alcun riferimento: solo registrato e valutato.

Revoca

Nessuna risposta OCSP allegata no_ocsp_stapling

Il certificato indica un responder OCSP e il server non allega alcuna risposta, quindi ogni client deve chiedere alla CA. In nginx: ssl_stapling on; In Apache: SSLUseStapling on.

Richiesto da: Mozilla (ocsp_staple), NIST (§3.4.1.5).

HTTP

Nessun header HSTS no_hsts

La risposta HTTPS non contiene l’header Strict-Transport-Security, quindi un browser che arriva in HTTP non cifrato, da un indirizzo digitato o da un vecchio link, può essere intercettato prima di raggiungere HTTPS. Invia l’header in ogni risposta HTTPS. In nginx: add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;

Richiesto da: Mozilla (hsts_min_age).

max-age HSTS troppo breve short_hsts

Il max-age HSTS è più breve di quanto richiesto: due anni secondo Mozilla, un anno per il quinto lucchetto. I browser ricordano l’header per tutto quel tempo, quindi aumentalo appena HTTPS funziona ovunque su quel nome.

Richiesto da: Mozilla (hsts_min_age).

HSTS esclude i sottodomini hsts_no_subdomains

L’header HSTS esclude i sottodomini, così un sottodominio raggiunto in HTTP non cifrato può ancora impostare cookie per tutto il dominio. Aggiungi includeSubDomains appena ogni sottodominio serve HTTPS.

Non richiesto da alcun riferimento: solo registrato e valutato.

Nessun reindirizzamento a HTTPS no_https_redirect

La porta 80 risponde senza mandare i visitatori a HTTPS sullo stesso nome: serve la pagina in HTTP non cifrato, reindirizza a HTTP oppure prima a un altro nome. Reindirizza ogni richiesta HTTP a https:// sullo stesso nome; il passaggio a un altro nome viene dopo, già in HTTPS. Una porta 80 chiusa non è un rilievo.

Non richiesto da alcun riferimento: solo registrato e valutato.

Reindirizzamento a HTTPS non permanente redirect_not_permanent

La porta 80 reindirizza a HTTPS con uno stato temporaneo (302, 303 o 307), quindi browser e motori di ricerca continuano a tornare in HTTP non cifrato. Usa 301 o 308. In nginx: return 301 https://$host$request_uri;

Non richiesto da alcun riferimento: solo registrato e valutato.

La risposta HTTPS imposta cookie senza l’attributo Secure, quindi il browser li invia anche in HTTP non cifrato, dove chiunque lungo il percorso può leggerli. Imposta Secure su ogni cookie; il rilievo li elenca. I loro valori non vengono mai salvati.

Non richiesto da alcun riferimento: solo registrato e valutato.

Header di pinning obsoleti obsolete_pinning

La risposta contiene Public-Key-Pins o Expect-CT. I browser li hanno abbandonati entrambi da anni, e un header di pinning dimenticato può ancora bloccare un client che lo rispetta. Rimuovili: i browser impongono Certificate Transparency senza l’header, e un’app mobile fissa le chiavi nel proprio codice.

Non richiesto da alcun riferimento: solo registrato e valutato.

Copertura delle sonde

Test di configurazione incompleto posture_incomplete

Il test di configurazione giornaliero non ha potuto accertare tutto: una sonda non è stata inviata o non ha ricevuto risposta, il server ha accettato più suite di cifratura di quante il test ne elenchi, oppure un certificato era troppo grande per essere conservato. Nessun riferimento è considerato rispettato su ciò che il test non ha visto, quindi la valutazione resta a tre lucchetti finché è coinvolto un riferimento scelto, e sotto i cinque negli altri casi. Di solito si risolve con il test del giorno dopo; se persiste, verificate che il server risponda a ogni connessione invece di scartarne alcune. Con i controlli HTTP attivi, una richiesta HTTPS senza risposta conta allo stesso modo; disattivali per una porta che non serve HTTP.

Non richiesto da alcun riferimento: solo registrato e valutato.