Перейти до основного вмісту

Посібники / Виправити: посібники для помилок, з якими стикаються насправді

ERR_SSL_VERSION_OR_CIPHER_MISMATCH: причини і виправлення

ERR_SSL_VERSION_OR_CIPHER_MISMATCH означає, що браузер і сервер обидва завершили достатню частину TLS-рукостискання, щоб порівняти підтримувані версії протоколу й шифри, і не знайшли жодного збігу. Це конкретніший випадок, ніж загальний збій рукостискання: обидві сторони поговорили, просто не змогли домовитися, як шифрувати з'єднання.

Що означає ERR_SSL_VERSION_OR_CIPHER_MISMATCH

Під час TLS-рукостискання ClientHello клієнта перелічує кожну версію TLS і набір шифрів, які він готовий використати, а сервер обирає з цього списку той, що також підтримує. Ця помилка з'являється, коли список сервера й список клієнта не мають узагалі нічого спільного, найчастіше тому, що сервер пропонує лише старі, застарілі варіанти (TLS 1.0, TLS 1.1 чи шифри на кшталт RC4 чи 3DES), які сучасні браузери відмовляються узгоджувати з міркувань безпеки. Виробники браузерів роками поступово прибирають підтримку цих старіших варіантів, тож сервер, що ніколи не оновлював свою конфігурацію TLS, дедалі частіше провалюється саме так проти звичайних, актуальних відвідувачів.

Як з'являється помилка

Chrome й Edge показують "This page isn't working - example.com sent an invalid response" чи, конкретніше, "ERR_SSL_VERSION_OR_CIPHER_MISMATCH." Firefox зазвичай показує "Secure Connection Failed" із кодом SSL_ERROR_NO_CYPHER_OVERLAP, що прямо називає проблему.

openssl s_client, примусово змушуючи використати конкретну версію TLS, показує точно, які версії сервер приймає, а які відхиляє:

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

Попередження "protocol version" чи "handshake failure" на одній версії й чисте з'єднання на іншій точно вказують, які саме версії підтримує сервер. Скрипт SSL в nmap іде далі й одразу перелічує кожен шифр, який пропонує сервер:

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

Що спричиняє ERR_SSL_VERSION_OR_CIPHER_MISMATCH

  • Сервер пропонує лише TLS 1.0 чи 1.1. Основні браузери роками тому прибрали підтримку обох версій за замовчуванням; сервер, що ніколи не оновлював конфігурацію, тепер не має жодного спільного протоколу з актуальним браузером.
  • Сервер пропонує лише слабкі чи застарілі шифри, такі як RC4 чи 3DES, які браузери відмовляються узгоджувати незалежно від версії TLS, запропонованої разом із ними.
  • Невідповідність сертифіката чи SNI на спільному хостингу. Коли кілька сайтів ділять одну IP-адресу, а сервер не може зіставити запитуване ім'я хоста (Server Name Indication) із правильним сертифікатом і конфігурацією шифрів, він може провалити рукостискання замість правильного відкату.
  • Стан Cloudflare "no SSL certificate for this hostname yet", що з'являється, коли домен додали до Cloudflare й DNS спрямували туди до завершення видачі сертифіката; edge-вузлу поки що немає з чим валідно узгоджувати для цього імені хоста.
  • Стара операційна система чи браузер, що самі підтримують лише старіші версії TLS чи шифри, натрапляючи на сучасний сервер, який (правильно) їх вимкнув.

Як зрозуміти, хто винен

Спершу протестуйте з іншого пристрою чи іншої мережі; якщо сайт там завантажується, застаріла власна ОС чи браузер відвідувача. Якщо провалюється скрізь, включно з актуальним, повністю оновленим браузером, причина - конфігурація TLS сервера. SSL-перевірка, запущена з кількох локацій, повідомляє точні версії протоколу й шифри, які сервер пропонує з кожної точки спостереження, за один прохід, що швидше за ручне повторення команд openssl з різних мереж.

Як виправити ERR_SSL_VERSION_OR_CIPHER_MISMATCH

Якщо ви відвідувач

  1. Оновіть браузер до останньої версії; це одразу вирішує клієнтський варіант невідповідності.
  2. Оновіть операційну систему, особливо на Windows 7 чи старіших версіях, чи дуже старих версіях Android і iOS, де сама системна TLS-бібліотека може бути застарілою незалежно від браузера.
  3. Спробуйте інший пристрій чи мережу, щоб підтвердити, чи проблема слідує за вами, чи лишається на боці сайту.
  4. Зверніться до власника сайту, якщо збій стабільний скрізь, де ви тестуєте; застарілу конфігурацію сервера потрібно виправити саме там, а не обходити з боку браузера.

Якщо ви керуєте сайтом

  1. Явно встановіть сучасні версії протоколу й шифри. На nginx:
    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;
    Повністю приберіть TLS 1.0, TLS 1.1 і будь-які записи шифрів RC4 чи 3DES, а не просто зменшіть їхній пріоритет.
  2. Якщо застарілому клієнту справді досі потрібен TLS 1.0 чи 1.1 (деяким старим платіжним терміналам чи вбудованим пристроям це потрібно), обслуговуйте його з окремого імені хоста чи слухача з власним прийнятим ризиком, а не послаблюйте конфігурацію основного сайту для кожного відвідувача.
  3. Перевірте конфігурацію SNI на спільному хостингу чи зворотному проксі, що обробляє кілька сертифікатів, підтвердивши, що кожен блок server_name відображається на правильний сертифікат і що проксі не відкочується на сертифікат за замовчуванням, який пропонує інший, несумісний набір шифрів.
  4. Якщо ви використовуєте Cloudflare і це почалося щойно після додавання домену, перевірте SSL/TLS > Edge Certificates в панелі керування на статус видачі сертифіката; стан "no SSL certificate for this hostname yet" вирішується сам собою, щойно видача завершиться, зазвичай протягом хвилин чи кількох годин.
  5. Перезавантажуйте після будь-якої зміни й перевіряйте заново: nginx -t && systemctl reload nginx, а тоді знову запустіть команди nmap чи openssl вище, щоб підтвердити, що старі версії й шифри справді зникли, а не просто переставлені за пріоритетом.

Пов'язані помилки

  • ERR_SSL_PROTOCOL_ERROR - ширший, менш конкретний збій рукостискання: не-TLS відповідь на порту, зіпсовані дані рукостискання чи програмне перехоплення, а не чисте порівняння версії/шифру, що просто не знайшло збігу.
  • ERR_CERT_DATE_INVALID трапляється вже після того, як сертифікат справді отримано й прочитано, на крок пізніше за цю помилку, яка так далеко не доходить.

Як запобігти ERR_SSL_VERSION_OR_CIPHER_MISMATCH

Виробники браузерів періодично, за власним розкладом, припиняють підтримку старіших версій TLS і шифрів, а це означає, що конфігурація сервера, яка чудово працювала торік, може почати провалюватися для дедалі більшої частки відвідувачів узагалі без жодної зміни на боці сервера. Перевірка сертифіката й SSL повідомляє узгоджений протокол і шифр на кожному запуску, з понад 300 контрольних точок у 158 містах, ловлячи сервер, що зсунувся на застарілу конфігурацію, до того, як це вплине на реальний трафік. HostTracker сповіщає електронною поштою, SMS, голосовим дзвінком, у Slack, Telegram та іншими способами тієї миті, коли перевірка провалюється.

Часті запитання

Це те саме, що помилка простроченого сертифіката?

Ні. Ця помилка трапляється під час узгодження протоколу й шифру, ще до того, як узагалі оцінюють сам сертифікат. Прострочений сертифікат - окрема помилка, що виникає на крок пізніше в рукостисканні.

Чому це впливає лише на відвідувачів зі старими комп'ютерами?

Тому що застаріла ОС чи браузер можуть підтримувати лише TLS 1.0, TLS 1.1 чи старіші шифри, які належно захищений сучасний сервер уже не пропонує, що дає чисту невідповідність версії/шифру, специфічну саме для того застарілого клієнта.

Чи варто мені знову вмикати TLS 1.0, щоб виправити це для старих відвідувачів?

Загалом ні. TLS 1.0 і 1.1 мають відомі слабкості, і більшість актуальних браузерів усе одно їх не використовуватимуть, тож повторне увімкнення переважно додає ризик, не відновлюючи сумісність для більшості постраждалих відвідувачів, чия справжня проблема - застарілий браузер чи ОС.

Що конкретно означає повідомлення Cloudflare "no SSL certificate for this hostname yet"?

Це означає, що DNS для домену вже вказує на Cloudflare, але видача сертифіката для цього імені хоста ще не завершилася, тож edge-вузлу Cloudflare поки що нема чого валідного пред'явити під час рукостискання. Зазвичай це вирішується саме собою, щойно видача завершиться.

Як дізнатися, які шифри мій сервер пропонує зараз, не гадаючи?

Запустіть nmap --script ssl-enum-ciphers -p 443 yourdomain.com, що перелічує кожну версію протоколу й шифр, які сервер приймає, разом з оцінкою для кожного, замість перевірки версій по одній.

Перевірити зараз

Запустіть безкоштовну перевірку власного сайту - обліковий запис не потрібен.

SSL check

Стежити за цим постійно

Отримуйте сповіщення в момент збою: HostTracker перевіряє з понад 300 локацій і повідомляє вас електронною поштою, SMS, у Slack, Telegram та інших каналах.

Можливості HostTracker

Ще в цьому розділі: Виправити: посібники для помилок, з якими стикаються насправді