Коды ошибок curl: полный справочник

Когда команда curl завершается с ошибкой, она возвращает числовой код выхода (curl exit code), определяющий тип проблемы. Проверить curl error code можно командой echo $? сразу после выполнения curl (или $LASTEXITCODE в PowerShell). Код выхода 0 означает успех; любое другое число указывает на конкретную проблему — от ошибок DNS-разрешения и таймаутов подключения до проблем с SSL-сертификатами. Эта страница — полный справочник по наиболее распространённым кодам ошибок curl с описанием причин и способов исправления. Если вы работаете с командами curl в своём коде, вставьте их в curl2code для конвертации в нужный язык программирования.

Краткая справочная таблица

0CURLE_OK

Успех. Операция завершилась без ошибок.

1CURLE_UNSUPPORTED_PROTOCOL

Неподдерживаемый протокол. URL использует протокол, с которым curl не был скомпилирован.

3CURLE_URL_MALFORMAT

Некорректный URL. Синтаксис URL недопустим или не может быть разобран.

5CURLE_COULDNT_RESOLVE_PROXY

Не удалось разрешить прокси. Имя хоста указанного прокси-сервера не удалось разрешить.

6CURLE_COULDNT_RESOLVE_HOST

Ошибка DNS — не удалось преобразовать доменное имя в IP-адрес.

7CURLE_COULDNT_CONNECT

TCP-соединение не удалось — сервер недоступен, порт заблокирован или файрвол отклоняет подключения.

18CURLE_PARTIAL_FILE

Неполный файл. Передача была прервана, и получена только часть файла.

22CURLE_HTTP_RETURNED_ERROR

Сервер вернул HTTP-ошибку (4xx/5xx) при использовании флага --fail.

23CURLE_WRITE_ERROR

Ошибка записи. curl не смог записать полученные данные на диск (нет прав доступа или диск заполнен).

28CURLE_OPERATION_TIMEDOUT

Операция превысила максимально допустимое время (DNS, подключение или передача данных).

35CURLE_SSL_CONNECT_ERROR

SSL/TLS-рукопожатие не удалось — несовместимость версии протокола или набора шифров.

37CURLE_FILE_COULDNT_READ_FILE

Не удалось прочитать файл. Локальный файл, указанный в запросе, не удалось открыть или прочитать.

52CURLE_GOT_NOTHING

Пустой ответ от сервера. Сервер закрыл соединение, не отправив никаких данных.

56CURLE_RECV_ERROR

Соединение сброшено — сервер разорвал подключение во время передачи данных.

60CURLE_SSL_CACERT

Проверка SSL-сертификата не прошла — просрочен, самоподписан или хранилище CA устарело.

77CURLE_SSL_CACERT_BADFILE

Проблема с файлом CA-сертификата. Не удалось прочитать или разобрать указанный файл CA-сертификата.

92CURLE_HTTP2_STREAM

Ошибка потока HTTP/2. Произошла ошибка протокола HTTP/2 на уровне потока во время передачи.

Ошибка 6: не удалось разрешить имя хоста

Что это значит
В терминале вы видите curl: (6) Could not resolve host. curl не смог преобразовать доменное имя в IP-адрес — DNS-запрос завершился неудачно ещё до попытки установить соединение.
Причины
Наиболее частые причины: опечатка в имени хоста (например, curl https://apiexample.com вместо api.example.com), проблемы с DNS-сервером (настроенный DNS недоступен или не работает), отсутствие сетевого подключения (Wi-Fi отключён, VPN не подключён) или домен действительно не существует.
Как исправить
Сначала проверьте правильность URL. Затем протестируйте DNS-разрешение напрямую: nslookup api.example.com или dig api.example.com. Если DNS не работает, попробуйте другой DNS-сервер: curl --dns-servers 8.8.8.8 https://api.example.com. Проверьте /etc/resolv.conf или сетевые настройки. Если вы за корпоративным VPN, убедитесь, что внутренний DNS может разрешить данный хост.
$ curl https://api.exmple.com/users

Ошибка 7: не удалось подключиться

Что это значит
В терминале вы видите curl: (7) Failed to connect to host port: Connection refused. curl разрешил имя хоста, но не смог установить TCP-соединение с сервером — соединение было отклонено или истекло время ожидания на уровне TCP.
Причины
Частые причины: сервер не запущен или не работает, файрвол блокирует порт (проверьте как локальный, так и серверный файрвол), неправильный порт (например, сервис работает на 8080, а вы подключаетесь к 443) или очередь подключений сервера переполнена при высокой нагрузке.
Как исправить
Проверьте, что сервер работает: ping api.example.com и telnet api.example.com 443. Убедитесь, что нужный порт открыт: nmap -p 443 api.example.com. Временно отключите локальный файрвол для теста. Если используете Docker, проверьте, что порт контейнера опубликован. Попробуйте с verbose-режимом: curl -v https://api.example.com, чтобы увидеть, где именно соединение обрывается.
$ curl https://localhost:8080/api

Ошибка 22: HTTP вернул ошибку

Что это значит
В терминале вы видите curl: (22) The requested URL returned error. Сервер вернул HTTP-код ошибки (4xx или 5xx), а curl был запущен с флагом -f или --fail, который указывает curl считать HTTP-ошибки неудачами.
Причины
Ошибка срабатывает при HTTP-кодах состояния: 400 (Bad Request), 401 (Unauthorized), 403 (Forbidden), 404 (Not Found) или 500 (Internal Server Error) — но только при использовании --fail. Без --fail curl возвращает код 0 даже при HTTP-ошибках. Частые причины: неправильный URL, отсутствие аутентификации, недостаточные права доступа или ошибка на стороне сервера.
Как исправить
Запустите curl без --fail, чтобы увидеть полное тело ответа — оно часто содержит описание реальной ошибки. Проверьте HTTP-код: curl -w "%{http_code}" -o /dev/null -s URL. Для 401/403: проверьте токен авторизации или API-ключ. Для 404: перепроверьте путь URL. Для 500: проблема на стороне сервера.
$ curl --fail https://api.example.com/nonexistent

Ошибка 28: истекло время ожидания операции

Что это значит
В терминале вы видите curl: (28) Operation timed out или curl: (28) Connection timed out. Операция заняла больше допустимого времени. Это самая распространённая ошибка curl — она может возникнуть на этапе DNS-разрешения, TCP-подключения, SSL-рукопожатия или передачи данных.
Причины
Типичные причины: медленный или перегруженный сервер не отвечает вовремя, загруженность сети или потеря пакетов, файрвол молча отбрасывает пакеты (без отказа, просто тишина), слишком строгие таймауты, заданные через --connect-timeout или --max-time, или неправильная настройка прокси, вызывающая задержки.
Как исправить
Увеличьте таймаут: curl --connect-timeout 30 --max-time 120 URL. Используйте verbose-режим, чтобы увидеть, где curl зависает: curl -v URL. Проверьте задержку сети: ping api.example.com и traceroute api.example.com. Если вы за прокси, попробуйте обойти его: curl --noproxy '*' URL. Для передачи больших файлов используйте --retry 3 с --retry-delay 5 для автоматических повторов.
$ curl --connect-timeout 5 https://slow-api.example.com/data

Ошибка 35: ошибка SSL-подключения

Что это значит
В терминале вы видите curl: (35) SSL connect error. SSL/TLS-рукопожатие не удалось — curl не смог установить защищённое соединение с сервером.
Причины
Частые причины: несовместимость версий TLS (сервер требует TLS 1.3, а ваш curl поддерживает только TLS 1.2), несовместимость наборов шифров, неправильная SSL-конфигурация сервера (просроченный сертификат при рукопожатии, неполная цепочка), сервер не поддерживает HTTPS на указанном порту, или прокси или файрвол перехватывает SSL-соединение (MITM).
Как исправить
Принудительно укажите версию TLS: curl --tlsv1.2 URL или curl --tlsv1.3 URL. Проверьте, что поддерживает сервер: openssl s_client -connect api.example.com:443. Обновите curl и OpenSSL до последних версий. Если сервер использует самоподписанный сертификат, обычно возникает ошибка 60 — ошибка 35 указывает на сбой рукопожатия на уровне протокола.
$ curl https://legacy-server.example.com/api

Ошибка 56: сбой приёма данных — соединение сброшено

Что это значит
В терминале вы видите curl: (56) Recv failure: Connection reset by peer. Соединение было установлено успешно, но приём данных не удался — сервер закрыл или сбросил соединение неожиданно во время передачи.
Причины
Это часто происходит, когда: сервер падает или перезапускается во время передачи, балансировщик нагрузки или прокси разрывает соединение (таймаут простоя, слишком большой запрос), файрвол завершает долгоживущие соединения, у сервера таймаут keep-alive меньше ожидаемого, или происходит сбой сети между клиентом и сервером.
Как исправить
Повторите запрос — временные сетевые проблемы являются самой частой причиной. Используйте verbose-режим: curl -v URL, чтобы увидеть точный момент сбоя. Если ошибка возникает при больших загрузках, попробуйте chunked-передачу: curl -H "Transfer-Encoding: chunked" URL. Для операций Git с ошибкой RPC failed; curl 56 увеличьте буфер: git config http.postBuffer 524288000.
$ curl https://api.example.com/large-download

Ошибка 60: проблема с SSL-сертификатом

Что это значит
В терминале вы видите curl: (60) SSL certificate problem: unable to get local issuer certificate. curl не смог проверить SSL-сертификат сервера по хранилищу CA (Certificate Authority). TLS-рукопожатие завершилось на уровне протокола, но проверка сертификата не прошла.
Причины
Наиболее частые причины: сервер использует самоподписанный сертификат, сертификат просрочен, цепочка сертификатов неполная (отсутствуют промежуточные сертификаты), хранилище CA устарело (часто на старых системах или в Docker-контейнерах), или Common Name / SAN сертификата не совпадает с запрашиваемым именем хоста.
Как исправить
Обновите хранилище CA: curl --cacert /path/to/cacert.pem URL. Скачайте актуальное хранилище с https://curl.se/ca/cacert.pem. Для диагностики: openssl s_client -connect api.example.com:443 -showcerts. Для самоподписанных сертификатов в разработке используйте curl -k URL (никогда в продакшене — это отключает всю проверку сертификатов). В Docker установите пакет ca-certificates.
$ curl https://self-signed.example.com/api

Другие коды ошибок

0CURLE_OK

Успех. Операция завершилась без ошибок.

1CURLE_UNSUPPORTED_PROTOCOL

Неподдерживаемый протокол. URL использует протокол, с которым curl не был скомпилирован.

3CURLE_URL_MALFORMAT

Некорректный URL. Синтаксис URL недопустим или не может быть разобран.

5CURLE_COULDNT_RESOLVE_PROXY

Не удалось разрешить прокси. Имя хоста указанного прокси-сервера не удалось разрешить.

18CURLE_PARTIAL_FILE

Неполный файл. Передача была прервана, и получена только часть файла.

23CURLE_WRITE_ERROR

Ошибка записи. curl не смог записать полученные данные на диск (нет прав доступа или диск заполнен).

37CURLE_FILE_COULDNT_READ_FILE

Не удалось прочитать файл. Локальный файл, указанный в запросе, не удалось открыть или прочитать.

52CURLE_GOT_NOTHING

Пустой ответ от сервера. Сервер закрыл соединение, не отправив никаких данных.

77CURLE_SSL_CACERT_BADFILE

Проблема с файлом CA-сертификата. Не удалось прочитать или разобрать указанный файл CA-сертификата.

92CURLE_HTTP2_STREAM

Ошибка потока HTTP/2. Произошла ошибка протокола HTTP/2 на уровне потока во время передачи.

Как отлаживать ошибки curl

Когда curl завершается с ошибкой, эти три флага помогут быстро определить причину — от DNS-разрешения до SSL-рукопожатия и тела ответа.

  1. 1

    Включите подробный вывод

    Запустите curl -v URL, чтобы увидеть полный цикл запроса/ответа: DNS-разрешение, TCP-подключение, TLS-рукопожатие, отправленные заголовки запроса и полученные заголовки ответа. Это самый полезный флаг для отладки.

  2. 2

    Проверьте HTTP-код статуса

    Запустите curl -o /dev/null -s -w "%{http_code}" URL, чтобы получить только HTTP-код статуса (200, 404, 500 и т.д.) без тела ответа. Удобно для быстрых проверок и скриптов.

  3. 3

    Тихий режим с отображением ошибок

    Запустите curl -sS URL, чтобы скрыть прогресс-бар (-s), но показывать ошибки (-S). Идеально для скриптов, где нужен чистый вывод, но важно видеть сбои.

Часто задаваемые вопросы

Как проверить код выхода curl?

После выполнения команды curl код выхода сохраняется в специальной переменной оболочки. В Bash/Zsh выполните echo $? сразу после команды curl. В PowerShell используйте $LASTEXITCODE. В скриптах можно проверить его условием: if curl -sf URL; then echo "OK"; else echo "Failed with code $?"; fi. Код выхода 0 означает успех; любое другое число указывает на ошибку. Чтобы увидеть и HTTP-код статуса, и код выхода curl, используйте curl -w "%{http_code}" -o /dev/null -s URL; echo "Exit: $?". Обратите внимание, что код выхода curl отличается от HTTP-кода статуса — curl возвращает 0 даже при HTTP 404, если не используется флаг --fail.

Как исправить ошибку curl 28 (истекло время ожидания)?

Ошибка 28 означает, что запрос превысил максимально допустимое время. Сначала увеличьте таймаут: curl --connect-timeout 30 --max-time 120 URL. Параметр --connect-timeout ограничивает фазу TCP-подключения, а --max-time — всю операцию целиком. Затем определите узкое место с помощью curl -v URL — подробный вывод показывает, где именно curl зависает (DNS, подключение, TLS или передача данных). Распространённые решения: проверьте сетевое подключение и настройки DNS, убедитесь, что сервер отвечает (ping и telnet), обойдите прокси с --noproxy '*', а для больших загрузок добавьте --retry 3 --retry-delay 5 для автоматических повторов.

Как исправить ошибку SSL-сертификата curl (ошибка 60)?

Ошибка 60 означает, что curl не может проверить SSL-сертификат сервера. Решение зависит от причины. При устаревшем хранилище CA: скачайте свежее с https://curl.se/ca/cacert.pem и используйте curl --cacert /path/to/cacert.pem URL. Для Docker-контейнеров: установите пакет ca-certificates (apt-get install ca-certificates). Для самоподписанных сертификатов в разработке: используйте curl -k URL для пропуска проверки — но никогда не используйте -k в продакшене, так как это отключает всю проверку сертификатов. Для диагностики: выполните openssl s_client -connect host:443 -showcerts для проверки цепочки сертификатов. Если сертификат просрочен или имя хоста не совпадает, проблема на стороне сервера.

Что означает ошибка curl 7 (не удалось подключиться)?

Ошибка 7 означает, что curl разрешил имя хоста в IP-адрес, но не смог установить TCP-соединение. Сервер активно отклонил подключение или попытка соединения истекла по времени на сетевом уровне. Частые причины: сервис не запущен на целевом хосте (проверьте через systemctl status или docker ps), файрвол блокирует порт (проверьте через telnet host port), используется неправильный порт (например, 80 вместо 443 или 8080 для dev-сервера) или очередь подключений сервера переполнена при высокой нагрузке. Для отладки: используйте curl -v URL и ищите «Connected to» или «Connection refused» в выводе.