Сообщение об ошибке
SSL routines:ssl_choose_client_version:unsupported protocol
Также выводится как
- error:0A000102:SSL routines::unsupported protocol
CLI-утилита openssl выводит «<thread>:error:0A000102:SSL routines:ssl_choose_client_version:unsupported protocol:<source>»; curl, Node.js и другие приложения показывают «error:0A000102:SSL routines::unsupported protocol». OpenSSL 1.1.1 использовал код 1425F102.
OpenSSL (client side) — SSL_R_UNSUPPORTED_PROTOCOL: the server chose a version the client does not allow
Что это означает
Клиент предложил TLS 1.2 и 1.3, но в ServerHello сервер выбрал более старую версию (обычно TLS 1.0), а OpenSSL на клиенте её использовать не разрешено. Клиент прерывает рукопожатие в ssl_choose_client_version. Старые стеки TLS игнорируют предложенный клиентом диапазон и просто отвечают своей версией; современные стеки вместо этого отказали бы оповещением protocol_version.
Почему это происходит
Сервер умеет только TLS 1.0 или 1.1
частоСерверы, которые никто не сопровождает, старые специализированные устройства и встраиваемые системы.
OpenSSL на клиенте запрещает старые версии
частоСовременные дистрибутивы задают минимум TLS 1.2 (уровень безопасности 2), поэтому сервер, к которому удавалось подключиться со старой машины, с новой выдаёт ошибку.
Как исправить
- 1.
Уточните версию сервера
Если для этой одной диагностической команды принудительно задать TLS 1.0 на уровне безопасности 0, станет видно, умеет ли сервер только старую версию.
bash # Allowed only for this diagnostic command: which version does the server pick? echo | openssl s_client -connect legacy.example.com:443 -servername legacy.example.com \ -tls1 -cipher 'DEFAULT:@SECLEVEL=0' -brief 2>&1 | grep -E 'Protocol version|error' - 2.
Включите TLS 1.2 и 1.3 на сервере
Единственное надёжное решение — обновить сервер (или поставить перед ним современный TLS-терминатор).
text # Server side ssl_protocols TLSv1.2 TLSv1.3; # nginx SSLProtocol -all +TLSv1.2 +TLSv1.3 # Apache httpd