Сообщение об ошибке
curl: (35) TLS connect error: error:0A00042E:SSL routines::tlsv1 alert protocol version
Также выводится как
- curl: (35) error:0A00042E:SSL routines::tlsv1 alert protocol version
- curl: (35) error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version
Последние версии curl добавляют перед причиной от OpenSSL «TLS connect error: ». OpenSSL 1.1.1 указывает функцию: «error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version». Если же сервер выбирает версию, которую отвергает клиент, клиент сообщает «unsupported protocol».
curl (OpenSSL backend) — CURLE_SSL_CONNECT_ERROR, TLS alert 70 (protocol_version) received from the server
Что это означает
Сервер отправил оповещение TLS 70 (protocol_version): ни одна из версий TLS, которые предложил curl, ему не подходит. Префикс «tlsv1» — лишь имя, которое OpenSSL даёт оповещениям, определённым начиная с TLS 1.0, а не используемая версия. Обычно сервер застрял на TLS 1.0/1.1, а клиент предлагает 1.2 и 1.3, или же максимальная версия клиента ограничена ниже минимальной версии сервера.
Почему это происходит
Сервер поддерживает только TLS 1.0 или 1.1
частоClientHello современного клиента предлагает только TLS 1.2 и 1.3. Серверу, у которого максимальная версия — 1.0 или 1.1 и который понимает расширение supported_versions, не из чего выбирать, и он отказывает оповещением protocol_version.
Клиенту задана устаревшая максимальная версия
иногда--tls-max 1.1, --tlsv1.0 вместе с ограничением максимальной версии или строка в .curlrc, оставшаяся после отладки старого устройства, заставляют curl предлагать версии, которые современный сервер отключил.
Сервер только с TLS 1.3 и клиент, ограниченный версией 1.2
иногдаНекоторые эндпоинты с усиленной защитой принимают только TLS 1.3. Клиенты, собранные со старыми библиотеками или принудительно переведённые на TLS 1.2 конфигурацией, получают отказ с тем же оповещением.
Как исправить
- 1.
Выясните, какие версии принимает сервер
Попробуйте каждую версию через openssl s_client. Результат покажет, что исправлять: сервер (принимаются только tls1/tls1_1) или клиент (он ни разу не предложил версию, которую принимает сервер).
bash for v in tls1 tls1_1 tls1_2 tls1_3; do printf '%s: ' "$v" openssl s_client -connect api.example.com:443 -servername api.example.com -"$v" </dev/null >/dev/null 2>&1 \ && echo accepted || echo refused done - 2.
Включите TLS 1.2 и 1.3 на сервере
Обновите конфигурацию TLS (а при необходимости и TLS-библиотеку или операционную систему), чтобы сервер принимал TLS 1.2 и 1.3.
text # nginx ssl_protocols TLSv1.2 TLSv1.3; # HAProxy (global section) ssl-default-bind-options ssl-min-ver TLSv1.2 - 3.
Снимите ограничения версии на клиенте
Удалите --tls-max и старые флаги протокола из скриптов и .curlrc; задавайте только минимальную версию, чтобы curl мог согласовать самую высокую версию, которую поддерживают обе стороны.
bash grep -nE 'tls-max|tlsv1|sslv3' ~/.curlrc # a forgotten cap in the config file curl --tlsv1.2 https://api.example.com/ # minimum 1.2, no maximum
Связанные ошибки
SSL routines:ssl3_read_bytes:tlsv1 alert protocol versionOpenSSL (client side)curl: (35) TLS connect error: error:0A000102:SSL routines::unsupported protocolcurl (OpenSSL backend)curl: (35) TLS connect error: error:0A000410:SSL routines::ssl/tls alert handsh…curl (OpenSSL backend)SSL_ERROR_UNSUPPORTED_VERSIONFirefox