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
Если вы посетитель
- Обновите браузер до последней версии; это немедленно устраняет клиентский вариант несовпадения.
- Обновите операционную систему, особенно на Windows 7 или более старых, либо на очень старых версиях Android и iOS, где сама системная библиотека TLS может быть устаревшей независимо от браузера.
- Попробуйте другое устройство или сеть, чтобы подтвердить, следует ли проблема за вами или остается привязанной к сайту.
- Обратитесь к владельцу сайта, если сбой стабилен повсюду, где вы тестируете; устаревшую настройку сервера нужно исправлять на той стороне, а не обходить со стороны браузера.
Если вы администрируете сайт
- Задайте явно современные версии протокола и шифры. В nginx:
Полностью удалите TLS 1.0, TLS 1.1 и любые записи шифров RC4 или 3DES, а не просто понизьте их приоритет.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 или 1.1 (такое бывает у некоторых старых платежных терминалов или встроенных устройств), обслуживайте его с отдельного имени хоста или слушателя с собственным принятым риском, а не ослабляйте настройку основного сайта для каждого посетителя.
- Проверьте настройку SNI на общем хостинге или обратном прокси, обрабатывающем несколько сертификатов, убедившись, что каждый блок
server_nameсопоставлен с правильным сертификатом, и что прокси не откатывается к сертификату по умолчанию, предлагающему другой, несовместимый набор шифров. - Если вы используете Cloudflare и это началось сразу после добавления домена, проверьте раздел SSL/TLS > Edge Certificates в панели управления на предмет статуса выпуска сертификата; состояние "no SSL certificate for this hostname yet" разрешается само собой после завершения выпуска, обычно в течение от минут до нескольких часов.
- После любого изменения перезагружайте и перепроверяйте:
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 оповещает по email, 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, который перечисляет каждую версию протокола и шифр, принимаемые сервером, вместе с оценкой для каждого, вместо того чтобы тестировать версии по одной.