ERR_SSL_VERSION_OR_CIPHER_MISMATCH: cause e soluzioni
ERR_SSL_VERSION_OR_CIPHER_MISMATCH significa che il browser e il server hanno entrambi completato abbastanza dell'handshake TLS da confrontare le versioni di protocollo e le cifrature supportate, e non hanno trovato alcuna sovrapposizione. È un caso più specifico di un fallimento generico dell'handshake: entrambe le parti hanno parlato, semplicemente non riescono a mettersi d'accordo su come cifrare la connessione.
Cosa significa ERR_SSL_VERSION_OR_CIPHER_MISMATCH
Durante un handshake TLS, il ClientHello del client elenca ogni versione TLS e suite di cifratura che è disposto a usare, e il server ne sceglie una da quella lista che supporta anch'esso. Questo errore compare quando la lista del server e quella del client non condividono nulla affatto, il più delle volte perché il server offre solo opzioni vecchie e deprecate (TLS 1.0, TLS 1.1, o cifrature come RC4 o 3DES) che i browser attuali si rifiutano di negoziare per motivi di sicurezza. I fornitori di browser hanno abbandonato il supporto per quelle opzioni più vecchie da anni, quindi un server che non ha mai aggiornato la propria configurazione TLS fallisce sempre di più in questo modo contro visitatori normali e aggiornati.
Come appare l'errore
Chrome ed Edge mostrano "This page isn't working - example.com sent an invalid response" o, più specificamente, "ERR_SSL_VERSION_OR_CIPHER_MISMATCH." Firefox tipicamente mostra "Secure Connection Failed" con il codice SSL_ERROR_NO_CYPHER_OVERLAP, che nomina il problema direttamente.
openssl s_client forzando una versione TLS specifica mostra esattamente quali versioni il server accetta e rifiuta:
openssl s_client -connect example.com:443 -tls1_2
CONNECTED(00000003)
...
New, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Verify return code: 0 (ok)
openssl s_client -connect example.com:443 -tls1
CONNECTED(00000003)
140... error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version
Un alert "protocol version" o "handshake failure" su una versione e una connessione pulita su un'altra individua esattamente quali versioni il server supporta. Lo script SSL di nmap va oltre ed elenca in una volta ogni cifratura che il server offre:
nmap --script ssl-enum-ciphers -p 443 example.com
| ssl-enum-ciphers:
| TLSv1.0:
| ciphers:
| TLS_RSA_WITH_RC4_128_SHA - C
| TLSv1.2:
| ciphers:
| TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - A
Cosa causa ERR_SSL_VERSION_OR_CIPHER_MISMATCH
- Il server offre solo TLS 1.0 o 1.1. I browser principali hanno abbandonato il supporto predefinito per entrambe le versioni anni fa; un server che non ha mai aggiornato la propria configurazione ora non condivide alcuna versione di protocollo comune con un browser attuale.
- Il server offre solo cifrature deboli o deprecate, come RC4 o 3DES, che i browser si rifiutano di negoziare indipendentemente dalla versione TLS offerta insieme.
- Un mismatch di certificato o SNI su hosting condiviso. Quando più siti condividono un indirizzo IP e il server non riesce a far corrispondere l'hostname richiesto (Server Name Indication) al certificato e alla configurazione di cifratura giusti, può far fallire l'handshake invece di ripiegare correttamente.
- Lo stato "no SSL certificate for this hostname yet" di Cloudflare, che compare quando un dominio è stato aggiunto a Cloudflare e il DNS è stato puntato lì prima che l'emissione del certificato finisse; l'edge non ha ancora nulla di valido con cui negoziare per quell'hostname.
- Un sistema operativo o un browser vecchi che essi stessi supportano solo versioni TLS o cifrature più vecchie, incontrando un server moderno che le ha (correttamente) disattivate.
Come capire di chi è la colpa
Testa prima da un dispositivo diverso o una rete diversa; se il sito si carica lì, il sistema operativo o il browser stesso del visitatore sono obsoleti. Se fallisce ovunque, incluso da un browser attuale e completamente aggiornato, la configurazione TLS del server è la causa. Un controllo SSL eseguito da più postazioni riporta le versioni di protocollo e le cifrature esatte che il server offre da ciascun punto di osservazione in un solo passaggio, il che è più veloce che ripetere manualmente i comandi openssl da reti diverse.
Come correggere ERR_SSL_VERSION_OR_CIPHER_MISMATCH
Se sei un visitatore
- Aggiorna il tuo browser all'ultima versione; questo risolve immediatamente la variante lato client del mismatch.
- Aggiorna il tuo sistema operativo, specialmente su Windows 7 o più vecchio, o versioni Android e iOS molto vecchie, dove la libreria TLS di sistema stessa potrebbe essere obsoleta indipendentemente dal browser.
- Prova un dispositivo o una rete diversi per confermare se il problema ti segue o resta con il sito.
- Contatta chi gestisce il sito se il fallimento è coerente ovunque tu testi; una configurazione server obsoleta deve essere corretta da quel lato, non aggirata dal browser.
Se gestisci il sito
- Imposta esplicitamente versioni di protocollo e cifrature moderne. Su nginx:
Rimuovi del tutto TLS 1.0, TLS 1.1, e qualunque voce di cifratura RC4 o 3DES invece di limitarti a deprioritizzarle.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; ssl_prefer_server_cipher off; - Se un client legacy ha davvero ancora bisogno di TLS 1.0 o 1.1 (alcuni terminali di pagamento più vecchi o dispositivi embedded ne hanno bisogno), servilo da un hostname o un listener separato con il proprio rischio accettato, invece di indebolire la configurazione del sito principale per ogni visitatore.
- Controlla la configurazione SNI su hosting condiviso o un reverse proxy che gestisce più certificati, confermando che ogni blocco
server_namecorrisponda al certificato corretto e che il proxy non stia ripiegando su un certificato predefinito che offre un insieme di cifrature diverso e incompatibile. - Se usi Cloudflare e questo è appena iniziato dopo aver aggiunto il dominio, controlla SSL/TLS > Edge Certificates nella dashboard per lo stato di emissione del certificato; lo stato "no SSL certificate for this hostname yet" si risolve da solo una volta completata l'emissione, di solito entro minuti fino a qualche ora.
- Ricarica dopo qualunque cambiamento, e riverifica:
nginx -t && systemctl reload nginx, poi esegui di nuovo i comandi nmap o openssl sopra per confermare che le vecchie versioni e cifrature siano effettivamente sparite, non solo riordinate.
Errori correlati
- ERR_SSL_PROTOCOL_ERROR è il fallimento dell'handshake più ampio e meno specifico: una risposta non TLS sulla porta, dati di handshake malformati, o software di intercettazione, piuttosto che un pulito confronto di versione/cifratura che semplicemente non ha trovato sovrapposizione.
- ERR_CERT_DATE_INVALID avviene dopo che un certificato è stato effettivamente ricevuto e letto, un passo più avanti di questo errore, che non arriva mai così lontano.
Come prevenire ERR_SSL_VERSION_OR_CIPHER_MISMATCH
I produttori di browser ritirano periodicamente il supporto per versioni TLS e cifrature più vecchie secondo il proprio calendario, il che significa che una configurazione server che funzionava bene l'anno scorso può iniziare a fallire per una quota crescente di visitatori senza alcun cambiamento dal lato server affatto. Un controllo di certificato e SSL riporta il protocollo e la cifratura negoziati a ogni esecuzione, da oltre 300 punti di controllo in 158 città, cogliendo un server che è scivolato verso una configurazione deprecata prima che colpisca il traffico reale. HostTracker avvisa via email, SMS, chiamata vocale, Slack, Telegram e altro nel momento in cui un controllo fallisce.
Domande frequenti
Questo è lo stesso di un errore di certificato scaduto?
No. Questo errore avviene durante la negoziazione di protocollo e cifratura, prima ancora che il certificato stesso venga valutato. Un certificato scaduto sarebbe un errore separato che avviene un passo più avanti nell'handshake.
Perché questo colpisce solo i visitatori su computer vecchi?
Perché un sistema operativo o un browser obsoleti potrebbero supportare solo TLS 1.0, TLS 1.1, o cifrature più vecchie, che un server moderno correttamente irrobustito non offre più, producendo un pulito mismatch di versione/cifratura specifico per quel client obsoleto.
Dovrei riattivare TLS 1.0 per correggere questo per i visitatori vecchi?
Generalmente no. TLS 1.0 e 1.1 hanno debolezze note e la maggior parte dei browser attuali non li userà comunque, quindi riattivarli aggiunge principalmente rischio senza ripristinare la compatibilità per la maggioranza dei visitatori interessati, il cui vero problema è un browser o un sistema operativo obsoleti.
Cosa significa esattamente il messaggio "no SSL certificate for this hostname yet" di Cloudflare?
Significa che il DNS per il dominio sta già puntando a Cloudflare ma l'emissione del certificato per quell'hostname non si è completata, quindi non c'è ancora nulla di valido che l'edge di Cloudflare possa presentare durante l'handshake. Tipicamente si risolve da solo una volta finita l'emissione.
Come faccio a sapere quali cifrature offre attualmente il mio server senza indovinare?
Esegui nmap --script ssl-enum-ciphers -p 443 yourdomain.com, che elenca ogni versione di protocollo e cifratura che il server accetta insieme a un voto per ciascuna, invece di testare le versioni una alla volta.