ERR_SSL_VERSION_OR_CIPHER_MISMATCH: przyczyny i naprawa
ERR_SSL_VERSION_OR_CIPHER_MISMATCH oznacza, że przeglądarka i serwer obie ukończyły na tyle dużo handshake'u TLS, żeby porównać obsługiwane wersje protokołu i szyfry, i nie znalazły żadnego pokrycia. To bardziej konkretny przypadek niż ogólna awaria handshake'u: obie strony rozmawiały, tylko nie mogą uzgodnić, jak zaszyfrować połączenie.
Co oznacza ERR_SSL_VERSION_OR_CIPHER_MISMATCH
Podczas handshake'u TLS ClientHello klienta wymienia każdą wersję TLS i zestaw szyfrów, jakich jest skłonny użyć, a serwer wybiera z tej listy jeden, który też obsługuje. Ten błąd pojawia się, gdy lista serwera i lista klienta nie mają nic wspólnego, najczęściej dlatego, że serwer oferuje tylko stare, wycofane opcje (TLS 1.0, TLS 1.1 albo szyfry takie jak RC4 czy 3DES), których aktualne przeglądarki odmawiają negocjować ze względów bezpieczeństwa. Nowoczesne przeglądarki od lat wycofują wsparcie dla tych starszych opcji, więc serwer, który nigdy nie zaktualizował konfiguracji TLS, coraz częściej zawodzi w ten sposób wobec zwykłych, aktualnych odwiedzających.
Jak pojawia się błąd
Chrome i Edge pokazują "This page isn't working - example.com sent an invalid response" albo, bardziej konkretnie, "ERR_SSL_VERSION_OR_CIPHER_MISMATCH." Firefox zwykle pokazuje "Secure Connection Failed" z kodem SSL_ERROR_NO_CYPHER_OVERLAP, który nazywa problem wprost.
openssl s_client wymuszający konkretną wersję TLS pokazuje dokładnie, które wersje serwer akceptuje, a które odrzuca:
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
Alert "protocol version" albo "handshake failure" na jednej wersji i czyste połączenie na innej wskazują dokładnie, które wersje serwer obsługuje. nmap ze skryptem SSL idzie dalej i od razu wypisuje każdy szyfr oferowany przez serwer:
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 powoduje ERR_SSL_VERSION_OR_CIPHER_MISMATCH
- Serwer oferuje tylko TLS 1.0 albo 1.1. Główne przeglądarki wycofały domyślne wsparcie dla obu wersji lata temu; serwer, który nigdy nie zaktualizował konfiguracji, nie ma teraz żadnej wspólnej wersji protokołu z aktualną przeglądarką.
- Serwer oferuje tylko słabe albo wycofane szyfry, takie jak RC4 albo 3DES, których przeglądarki odmawiają negocjować niezależnie od oferowanej obok nich wersji TLS.
- Niedopasowanie certyfikatu albo SNI na hostingu współdzielonym. Gdy kilka witryn dzieli jeden adres IP, a serwer nie może dopasować żądanej nazwy hosta (Server Name Indication) do właściwego certyfikatu i konfiguracji szyfrów, może zawieść handshake zamiast poprawnie się wycofać.
- Stan Cloudflare "no SSL certificate for this hostname yet", który pojawia się, gdy domena została dodana do Cloudflare, a DNS wskazał tam, zanim zakończyło się wystawianie certyfikatu; brzeg sieci nie ma jeszcze niczego ważnego do wynegocjowania dla tej nazwy hosta.
- Stary system operacyjny albo przeglądarka, które same obsługują tylko starsze wersje TLS albo szyfry, trafiając na nowoczesny serwer, który je (poprawnie) wyłączył.
Jak rozpoznać, kto zawinił
Przetestuj najpierw z innego urządzenia albo innej sieci; jeśli witryna tam się ładuje, przyczyną jest przestarzały system operacyjny albo przeglądarka odwiedzającego. Jeśli zawodzi wszędzie, także z aktualnej, w pełni zaktualizowanej przeglądarki, przyczyną jest konfiguracja TLS serwera. Kontrola SSL uruchomiona z kilku lokalizacji raportuje dokładne wersje protokołu i szyfry oferowane przez serwer z każdego punktu obserwacji w jednym przebiegu, co jest szybsze niż ręczne powtarzanie poleceń openssl z różnych sieci.
Jak naprawić ERR_SSL_VERSION_OR_CIPHER_MISMATCH
Jeśli jesteś odwiedzającym
- Zaktualizuj przeglądarkę do najnowszej wersji; to od razu rozwiązuje wariant niedopasowania po stronie klienta.
- Zaktualizuj system operacyjny, zwłaszcza na Windows 7 albo starszym, albo bardzo starych wersjach Androida i iOS, gdzie sama systemowa biblioteka TLS może być przestarzała niezależnie od przeglądarki.
- Wypróbuj inne urządzenie albo sieć, żeby potwierdzić, czy problem podróżuje z Tobą, czy zostaje przy witrynie.
- Skontaktuj się z właścicielem witryny, jeśli awaria jest spójna wszędzie, gdzie testujesz; przestarzałą konfigurację serwera trzeba naprawić po tamtej stronie, nie obejść z poziomu przeglądarki.
Jeśli prowadzisz witrynę
- Ustaw jawnie nowoczesne wersje protokołu i szyfry. Na nginx:
Usuń całkowicie TLS 1.0, TLS 1.1 i dowolne wpisy szyfrów RC4 albo 3DES, zamiast tylko obniżać ich priorytet.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; - Jeśli jakiś przestarzały klient naprawdę wciąż potrzebuje TLS 1.0 albo 1.1 (niektóre starsze terminale płatnicze albo urządzenia wbudowane tak mają), serwuj go z osobnej nazwy hosta albo listenera z własnym zaakceptowanym ryzykiem, zamiast osłabiać konfigurację głównej witryny dla każdego odwiedzającego.
- Sprawdź konfigurację SNI na hostingu współdzielonym albo reverse proxy obsługującym wiele certyfikatów, potwierdzając, że każdy blok
server_namemapuje się na właściwy certyfikat i że proxy nie cofa się do domyślnego certyfikatu oferującego inny, niezgodny zestaw szyfrów. - Jeśli używasz Cloudflare i to zaczęło się zaraz po dodaniu domeny, sprawdź SSL/TLS > Edge Certificates w panelu pod kątem statusu wystawiania certyfikatu; stan "no SSL certificate for this hostname yet" rozwiązuje się sam, gdy wystawianie się zakończy, zwykle w ciągu minut do kilku godzin.
- Przeładuj po każdej zmianie i zweryfikuj ponownie:
nginx -t && systemctl reload nginx, a potem uruchom ponownie powyższe polecenia nmap albo openssl, żeby potwierdzić, że stare wersje i szyfry faktycznie zniknęły, nie tylko zmieniły kolejność.
Powiązane błędy
- ERR_SSL_PROTOCOL_ERROR to szersza, mniej konkretna awaria handshake'u: odpowiedź bez TLS na porcie, wadliwe dane handshake'u albo oprogramowanie przechwytujące, a nie czyste porównanie wersji/szyfrów, które po prostu nie znalazło pokrycia.
- ERR_CERT_DATE_INVALID zdarza się po tym, jak certyfikat został faktycznie otrzymany i odczytany, o krok później niż ten błąd, który w ogóle tam nie dochodzi.
Jak zapobiec ERR_SSL_VERSION_OR_CIPHER_MISMATCH
Dostawcy przeglądarek okresowo wycofują wsparcie dla starszych wersji TLS i szyfrów według własnego harmonogramu, co oznacza, że konfiguracja serwera, która działała dobrze w zeszłym roku, może zacząć zawodzić dla rosnącej części odwiedzających bez żadnej zmiany po stronie serwera. Kontrola certyfikatu i SSL raportuje wynegocjowany protokół i szyfr przy każdym uruchomieniu, z ponad 300 punktów kontrolnych w 158 miastach, wyłapując serwer, który zdryfował na przestarzałą konfigurację, zanim dotknie prawdziwego ruchu. HostTracker alarmuje e-mailem, SMS-em, połączeniem głosowym, przez Slack, Telegram i inne kanały w chwili, gdy kontrola zawiedzie.
Najczęściej zadawane pytania
Czy to to samo co błąd wygasłego certyfikatu?
Nie. Ten błąd zdarza się podczas negocjacji protokołu i szyfru, zanim sam certyfikat zostanie w ogóle oceniony. Wygasły certyfikat to osobny błąd, który zdarza się o krok później w handshake'u.
Dlaczego dotyka to tylko odwiedzających na starych komputerach?
Bo przestarzały system operacyjny albo przeglądarka mogą obsługiwać tylko TLS 1.0, TLS 1.1 albo starsze szyfry, których poprawnie utwardzony nowoczesny serwer już nie oferuje, produkując czyste niedopasowanie wersji/szyfru specyficzne dla tego przestarzałego klienta.
Czy powinienem ponownie włączyć TLS 1.0, żeby to naprawić dla starych odwiedzających?
Zasadniczo nie. TLS 1.0 i 1.1 mają znane słabości, a większość aktualnych przeglądarek i tak ich nie użyje, więc ponowne włączenie głównie dodaje ryzyko, nie przywracając kompatybilności dla większości dotkniętych odwiedzających, których faktycznym problemem jest przestarzała przeglądarka albo system operacyjny.
Co konkretnie oznacza komunikat Cloudflare "no SSL certificate for this hostname yet"?
Oznacza, że DNS domeny już wskazuje na Cloudflare, ale wystawianie certyfikatu dla tej nazwy hosta się nie zakończyło, więc brzeg Cloudflare nie ma jeszcze niczego ważnego do zaprezentowania podczas handshake'u. Zwykle rozwiązuje się samo, gdy wystawianie się kończy.
Jak sprawdzić, jakich szyfrów aktualnie używa mój serwer, bez zgadywania?
Uruchom nmap --script ssl-enum-ciphers -p 443 yourdomain.com, który wypisuje każdą wersję protokołu i szyfr akceptowany przez serwer razem z oceną dla każdego, zamiast testować wersje pojedynczo.