ERR_SSL_VERSION_OR_CIPHER_MISMATCH: příčiny a opravy
ERR_SSL_VERSION_OR_CIPHER_MISMATCH znamená, že prohlížeč i server dokončili dost TLS handshake na to, aby porovnali podporované verze protokolu a šifry, a nenašli žádný průnik. Je to konkrétnější případ než obecné selhání handshake: obě strany spolu komunikovaly, jen se nedokážou shodnout, jak spojení šifrovat.
Co znamená ERR_SSL_VERSION_OR_CIPHER_MISMATCH
Během TLS handshake ClientHello klienta vypíše každou verzi TLS a šifrovací sadu, kterou je ochoten použít, a server z tohoto seznamu vybere jednu, kterou taky podporuje. Tahle chyba se objeví, když seznam serveru a seznam klienta nemají vůbec nic společného, nejčastěji proto, že server nabízí jen staré, zastaralé možnosti (TLS 1.0, TLS 1.1, nebo šifry jako RC4 nebo 3DES), které aktuální prohlížeče z bezpečnostních důvodů odmítají vyjednat. Výrobci prohlížečů podporu těchto starších možností postupně ruší už roky, takže server, který svou konfiguraci TLS nikdy neaktualizoval, tímto způsobem selhává proti obyčejným, aktualizovaným návštěvníkům čím dál častěji.
Jak se chyba projevuje
Chrome a Edge zobrazí "This page isn't working - example.com sent an invalid response", nebo konkrétněji "ERR_SSL_VERSION_OR_CIPHER_MISMATCH." Firefox typicky zobrazí "Secure Connection Failed" s kódem SSL_ERROR_NO_CYPHER_OVERLAP, který problém pojmenuje přímo.
openssl s_client s vynucením konkrétní verze TLS ukáže přesně, které verze server přijímá a které odmítá:
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
Varování "protocol version" nebo "handshake failure" u jedné verze a čisté spojení u jiné přesně určí, které verze server podporuje. Skript SSL pro nmap jde ještě dál a naráz vypíše každou šifru, kterou server nabízí:
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
Co způsobuje ERR_SSL_VERSION_OR_CIPHER_MISMATCH
- Server nabízí jen TLS 1.0 nebo 1.1. Hlavní prohlížeče před lety zrušily výchozí podporu pro obě verze; server, který svou konfiguraci nikdy neaktualizoval, teď nemá s aktuálním prohlížečem žádnou společnou verzi protokolu.
- Server nabízí jen slabé nebo zastaralé šifry, jako RC4 nebo 3DES, které prohlížeče odmítají vyjednat bez ohledu na to, jaká verze TLS je nabízená spolu s nimi.
- Nesoulad certifikátu nebo SNI na sdíleném hostingu. Když si několik webů dělí jednu IP adresu a server nedokáže spárovat požadovaný název hostitele (Server Name Indication) se správným certifikátem a konfigurací šifer, může handshake selhat, místo aby správně spadl zpátky.
- Stav Cloudflare "no SSL certificate for this hostname yet", který se objeví, když byla doména přidána do Cloudflare a DNS na ni ukázalo dřív, než se dokončilo vydání certifikátu; edge zatím nemá nic platného, co by pro daný název hostitele mohl vyjednat.
- Starý operační systém nebo prohlížeč, který sám podporuje jen starší verze TLS nebo šifry, narazí na moderní server, který je (správně) vypnul.
Jak zjistit, čí je to chyba
Nejdřív to otestujte z jiného zařízení nebo jiné sítě; pokud se tam web načte, je zastaralý vlastní operační systém nebo prohlížeč návštěvníka. Pokud selhává všude, i z aktuálního, plně aktualizovaného prohlížeče, příčinou je TLS konfigurace serveru. SSL kontrola spuštěná z několika míst jedním průchodem nahlásí přesné verze protokolu a šifry, které server nabízí z každého pozorovacího bodu, což je rychlejší než ruční opakování příkazů openssl z různých sítí.
Jak opravit ERR_SSL_VERSION_OR_CIPHER_MISMATCH
Pokud jste návštěvník
- Aktualizujte prohlížeč na nejnovější verzi; tím se nesoulad na straně klienta okamžitě vyřeší.
- Aktualizujte operační systém, zvlášť na Windows 7 nebo starším, nebo velmi starých verzích Android a iOS, kde může být zastaralá přímo systémová knihovna TLS bez ohledu na prohlížeč.
- Zkuste jiné zařízení nebo síť, abyste potvrdili, jestli problém cestuje s vámi, nebo zůstává u webu.
- Kontaktujte provozovatele webu, pokud selhání přetrvává všude, kde to testujete; zastaralou konfiguraci serveru je potřeba opravit na té straně, ne obcházet z prohlížeče.
Pokud web provozujete
- Nastavte explicitně moderní verze protokolu a šifry. Na nginx:
Odstraňte TLS 1.0, TLS 1.1 a jakékoli položky šifer RC4 nebo 3DES úplně, ne je jen odsuňte v prioritě.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; - Pokud nějaký starší klient opravdu ještě potřebuje TLS 1.0 nebo 1.1 (některé starší platební terminály nebo vestavěná zařízení ano), obsluhujte ho ze samostatného hostitele nebo listeneru s vlastním přijatým rizikem, místo abyste kvůli tomu oslabovali konfiguraci hlavního webu pro každého návštěvníka.
- Zkontrolujte konfiguraci SNI na sdíleném hostingu nebo reverzní proxy zpracovávající více certifikátů, ověřte, že každý blok
server_namemapuje na správný certifikát a že proxy nespadá zpátky na výchozí certifikát, který nabízí jinou, nekompatibilní sadu šifer. - Pokud používáte Cloudflare a tohle začalo hned po přidání domény, zkontrolujte v dashboardu SSL/TLS > Edge Certificates stav vydání certifikátu; stav "no SSL certificate for this hostname yet" se vyřeší sám, jakmile se vydání dokončí, obvykle během minut až pár hodin.
- Po jakékoli změně ji restartujte a znovu ověřte:
nginx -t && systemctl reload nginx, pak znovu spusťte příkazy nmap nebo openssl výše, abyste potvrdili, že staré verze a šifry skutečně zmizely, ne že se jen přeuspořádaly.
Související chyby
- ERR_SSL_PROTOCOL_ERROR je širší, méně konkrétní selhání handshake: ne-TLS odpověď na portu, poškozená data handshake, nebo software pro zachytávání, ne čisté porovnání verze/šifry, které prostě nenašlo žádný průnik.
- ERR_CERT_DATE_INVALID nastává poté, co byl certifikát skutečně přijat a přečten, o krok později než tahle chyba, která se tak daleko vůbec nedostane.
Jak předejít ERR_SSL_VERSION_OR_CIPHER_MISMATCH
Výrobci prohlížečů podle vlastního plánu pravidelně ruší podporu starších verzí TLS a šifer, což znamená, že konfigurace serveru, která loni fungovala bez problémů, může začít selhávat rostoucímu podílu návštěvníků, aniž by se na straně serveru cokoli změnilo. Kontrola certifikátu a SSL při každém běhu z více než 300 kontrolních bodů ve 158 městech hlásí vyjednaný protokol a šifru, a zachytí server, který sklouzl na zastaralou konfiguraci, dřív, než postihne skutečný provoz. HostTracker upozorní e-mailem, SMS, hlasovým hovorem, přes Slack, Telegram a další ve chvíli, kdy kontrola selže.
Často kladené otázky
Je to totéž jako chyba vypršelého certifikátu?
Ne. Tahle chyba nastává během vyjednávání protokolu a šifry, ještě předtím, než se samotný certifikát vůbec vyhodnocuje. Vypršelý certifikát by byla samostatná chyba nastávající o krok později v handshake.
Proč to postihuje jen návštěvníky se starými počítači?
Protože zastaralý operační systém nebo prohlížeč může podporovat jen TLS 1.0, TLS 1.1, nebo starší šifry, které řádně zabezpečený moderní server už nenabízí, což vyprodukuje čistý nesoulad verze/šifry specifický pro toho zastaralého klienta.
Měl bych kvůli starým návštěvníkům znovu zapnout TLS 1.0?
Obecně ne. TLS 1.0 a 1.1 mají známé slabiny a většina aktuálních prohlížečů je stejně nepoužije, takže jejich opětovné zapnutí hlavně přidává riziko, aniž by obnovilo kompatibilitu pro většinu postižených návštěvníků, jejichž skutečným problémem je zastaralý prohlížeč nebo operační systém.
Co konkrétně znamená zpráva Cloudflare "no SSL certificate for this hostname yet"?
Znamená to, že DNS pro doménu už míří na Cloudflare, ale vydání certifikátu pro daný název hostitele se ještě nedokončilo, takže edge Cloudflare zatím nemá pro handshake nic platného k předložení. Obvykle se to vyřeší samo, jakmile se vydání dokončí.
Jak zjistím, které šifry můj server aktuálně nabízí, aniž bych hádal?
Spusťte nmap --script ssl-enum-ciphers -p 443 yourdomain.com, což vypíše každou verzi protokolu a šifru, kterou server přijímá, spolu s hodnocením každé z nich, místo abyste testovali verze jednu po druhé.