Сообщение об ошибке
curl: (35) TLS connect error: error:0A000102:SSL routines::unsupported protocol
Также выводится как
- curl: (35) error:0A000102:SSL routines::unsupported protocol
- curl: (35) error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol
Последние версии curl (здесь 8.14.1) добавляют перед причиной от OpenSSL «TLS connect error: ». OpenSSL 1.1.1 указывает функцию: «error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol». Если отказывает сервер, клиент вместо этого видит «tlsv1 alert protocol version».
curl (OpenSSL backend) — CURLE_SSL_CONNECT_ERROR, SSL_R_UNSUPPORTED_PROTOCOL
Что это означает
Сервер ответил на ClientHello, выбрав версию протокола, которую TLS-библиотеке curl использовать не разрешено (обычно TLS 1.0 или 1.1). После этого клиент сам прерывает подключение на своей стороне. Сетевой путь и сертификат здесь ни при чём: у двух сторон просто нет общей версии TLS.
Почему это происходит
Сервер поддерживает только TLS 1.0 или 1.1
частоСтарые установки Windows Server/IIS, приложения времён Java 6/7 и балансировщики нагрузки, которые никто не обслуживает, всё ещё согласуют TLS 1.0. RFC 8996 объявил TLS 1.0 и 1.1 устаревшими в 2021 году, и современные клиенты их больше не предлагают.
Системная политика клиента задаёт минимум TLS 1.2
частоКриптографические политики Debian, Ubuntu (начиная с 20.04) и RHEL 8+, а также уровень безопасности OpenSSL 3 по умолчанию отклоняют TLS 1.0/1.1. С более старой машины тот же сервер может по-прежнему работать, поэтому сбой выглядит зависящим от окружения.
Встроенные интерфейсы управления и устройства
иногдаВеб-интерфейсы принтеров и ИБП, старые прошивки IPMI/iLO, шлюзы SCADA и похожие устройства часто невозможно обновить до версии новее TLS 1.0.
Как исправить
- 1.
Уточните, какие версии принимает сервер
Попробуйте каждую версию явно. Если проходят только tls1 или tls1_1, сервер необходимо обновить; если проходит и tls1_2, ищите параметр клиента, который ограничивает максимальную версию.
bash # Which versions does the server accept? (each line succeeds or fails on its own) for v in tls1 tls1_1 tls1_2 tls1_3; do printf '%s: ' "$v" openssl s_client -connect legacy.example.com:443 -"$v" </dev/null >/dev/null 2>&1 && echo ok || echo no done - 2.
Включите TLS 1.2 и 1.3 на сервере
Включите TLS 1.2 (и 1.3, если стек это поддерживает) и отключите 1.0/1.1. Только это исправление помогает также браузерам, мобильным приложениям и другим клиентам API.
text # nginx ssl_protocols TLSv1.2 TLSv1.3; # Apache httpd SSLProtocol -all +TLSv1.2 +TLSv1.3 # IIS / Windows Server: enable TLS 1.2 under # HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server - 3.
Крайняя мера: разрешите TLS 1.0 для одного запроса к устройству, которое нельзя обновить
Включайте старую версию только для конкретной команды, которая обращается к устаревшему устройству, и никогда — на уровне всей системы. TLS 1.0 опирается на SHA-1 и конструкции CBC, для которых известны атаки; держите такой трафик в изолированной сети управления.
bash # Last resort for a device you cannot upgrade: allow TLS 1.0 for this one call only. # OpenSSL 3 also needs security level 0 for the SHA-1 based handshake of TLS 1.0/1.1. curl --tlsv1.0 --ciphers 'DEFAULT:@SECLEVEL=0' https://legacy-device.example.internal/
Связанные ошибки
SSL routines:ssl_choose_client_version:unsupported protocolOpenSSL (client side)curl: (35) TLS connect error: error:0A00042E:SSL routines::tlsv1 alert protocol…curl (OpenSSL backend)The server selected protocol version TLS10 is not accepted by client preference…Java (JSSE)tls: server selected unsupported protocol version 301Go crypto/tls clientnet::ERR_SSL_VERSION_OR_CIPHER_MISMATCHChrome, Edge and other Chromium browsers