Перейти к содержимому
ecdsa.com
curl (OpenSSL backend)curl

Сообщение об ошибке

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.

Почему это происходит

Как исправить

  1. 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. 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. 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/

Связанные ошибки

Открыть всю базу ошибок подписей