Сообщение об ошибке
SSL routines:tls_setup_handshake:no protocols available
Также выводится как
- error:0A0000BF:SSL routines::no protocols available
CLI-утилита openssl (3.0 и 3.5) выводит «error:0A0000BF:SSL routines:tls_setup_handshake:no protocols available»; приложения, которые форматируют ошибки без имени функции, показывают «error:0A0000BF:SSL routines::no protocols available».
OpenSSL (client or server side) — SSL_R_NO_PROTOCOLS_AVAILABLE before the handshake starts
Что это означает
OpenSSL отказался даже начинать рукопожатие: после применения всех ограничений не осталось ни одной версии протокола, которую можно было бы предложить. Обычно приложение запросило TLS 1.0 или 1.1, а уровень безопасности OpenSSL (в современных дистрибутивах по умолчанию 2) их запрещает, либо заданная минимальная версия выше максимальной. На сервер ничего не отправлялось.
Почему это происходит
Принудительно заданы TLS 1.0/1.1, а уровень безопасности их запрещает
частоНачиная с OpenSSL 3.0 уровень безопасности 1 и выше отключает TLS 1.0 и 1.1, а дистрибутивы по умолчанию выставляют уровень 2. Поэтому клиенту, в коде которого ради старого устройства жёстко задан TLS 1.0, нечего предложить.
Минимальная версия выше максимальной
иногдаКонфигурация, в которой минимум — TLS 1.3, а максимум — TLS 1.2 (часто это результат двух разных настроек, наложенных друг на друга), оставляет пустой диапазон.
Общесистемная криптографическая политика перекрывает настройки приложения
иногдаКриптографические политики RHEL и Fedora (DEFAULT, FUTURE) и openssl.cnf в Debian задают MinProtocol и уровень безопасности для всех приложений на OpenSSL на этой машине.
Как исправить
- 1.
Найдите ограничивающую настройку
Посмотрите, какие значения MinProtocol, MaxProtocol и @SECLEVEL в CipherString заданы в openssl.cnf и в системной криптографической политике.
bash openssl version -d # where openssl.cnf lives grep -nE 'MinProtocol|MaxProtocol|CipherString' /usr/lib/ssl/openssl.cnf /etc/ssl/openssl.cnf 2>/dev/null update-crypto-policies --show 2>/dev/null # RHEL/Fedora system policy - 2.
Старое устройство: понизьте уровень для одной команды
Если добавить @SECLEVEL=0 в строку шифров, TLS 1.0/1.1 снова включатся только для этого запуска. Не переносите такие исключения в общесистемную конфигурацию и не используйте их в недоверенных сетях.
bash # For a one-off test against a legacy device: lower the security level for this command only echo | openssl s_client -connect legacy.example.com:443 -tls1 -cipher 'DEFAULT:@SECLEVEL=0' - 3.
Задайте согласованный диапазон версий
Убедитесь, что минимальная версия не выше максимальной; сегодня обычный диапазон — от TLS 1.2 до TLS 1.3.
ini # openssl.cnf (system_default_sect): a consistent range MinProtocol = TLSv1.2 MaxProtocol = TLSv1.3