Nginx: SSL_do_handshake() failed (no shared cipher) — Решение
Клиенты (браузеры, мобильные устройства или интеграционные боты) не могут установить безопасное HTTPS-соединение с сайтом, получая ошибку ERR_SSL_VERSION_OR_CIPHER_MISMATCH. В журнале error.log Nginx фиксируется отказ криптографического согласования: SSL_do_handshake() failed (SSL: error:0A0000C1:SSL routines::no shared cipher) while SSL handshaking, client: ..., server: ....
| Причина сбоя | Настройки сервера | Возможности клиента |
|---|---|---|
| Устаревший клиент | Включены строго TLSv1.2 TLSv1.3 и стойкие шифры | Клиент поддерживает только устаревшие SSLv3/TLSv1.0 (старый Android, Windows XP) |
| ECDSA / RSA конфликт | Установлен ECDSA-сертификат, но в ssl_ciphers прописаны только RSA-шифры | Сервер не может подобрать совместимый алгоритм под ключ |
| Слишком жесткий Cipher Suite | Отключены стандартные наборы AES-GCM / CHACHA20 | Нет ни одного общего шифра для согласования |
- Пользователи устаревших устройств или Java-приложений со старыми версиями JDK не могут открыть сайт.
- Nginx мгновенно разрывает сессию во время фазы Server Hello.
- Откройте конфигурационный файл с настройками SSL (например,
/etc/nginx/snippets/ssl-params.confили виртуальный хост). - Установите современный, безопасный и широко совместимый набор протоколов и шифров по стандарту Mozilla Intermediate:
# Разрешенные версии протоколов TLS: ssl_protocols TLSv1.2 TLSv1.3; # Универсальный набор шифров, совместимый с ECDSA и RSA сертификатами: ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; # Отдавать предпочтение серверным шифрам (для TLSv1.2): ssl_prefer_server_ciphers off; - Убедитесь, что тип сертификата соответствует шифрам: если у вас ECC-сертификат (Elliptic Curve), в
ssl_ciphersобязательно должны присутствовать шифрыECDHE-ECDSA-*. - Настройте поддержку сессионных тикетов и кэша для ускорения рукопожатия:
ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; ssl_session_tickets off; - Проверьте валидность параметров и примените конфигурацию:
sudo nginx -t && sudo systemctl reload nginx.
Частые вопросы (FAQ)
Что означает ошибка no shared cipher?
Эта ошибка указывает на то, что во время TLS Handshake список алгоритмов шифрования, предложенный клиентом в Client Hello, не содержит ни одного совпадения со списком ssl_ciphers, разрешенным на сервере Nginx.
Безопасно ли включать TLSv1.0 и TLSv1.1 для старых клиентов?
Категорически не рекомендуется. Протоколы TLS 1.0 и 1.1 признаны небезопасными (уязвимости POODLE, BEAST) и запрещены стандартами PCI DSS и современными браузерами.
Как проверить список шифров, поддерживаемых удаленным Nginx сервером?
Используйте утилиту testssl.sh или команду: nmap --script ssl-enum-ciphers -p 443 yourdomain.com.
Почему директива ssl_prefer_server_ciphers теперь рекомендуется в положении off?
В протоколе TLSv1.3 выбор шифра всегда остается за клиентом, а для TLSv1.2 современные клиенты сами выбирают оптимальный шифр с учетом аппаратного ускорения AES-NI на их CPU.