Coduri de eroare curl: Referință completă

Când o comandă curl eșuează, aceasta returnează un cod numeric de ieșire (numit și cod de eroare curl) care identifică tipul erorii. Poți verifica codul de ieșire curl rulând echo $? imediat după comanda curl (sau $LASTEXITCODE în PowerShell). Codul de ieșire 0 înseamnă succes; orice alt număr indică o problemă specifică — de la erori de rezolvare DNS și timeout-uri de conexiune până la probleme cu certificatul SSL. Această pagină este o referință completă a celor mai comune coduri de eroare curl cu explicații, cauze și remedieri. Dacă lucrezi cu comenzi curl în codul tău, lipește-le în curl2code pentru a le converti în limbajul de programare preferat.

Tabel de referință rapidă

0CURLE_OK

Succes. Operațiunea s-a finalizat fără erori.

1CURLE_UNSUPPORTED_PROTOCOL

Protocol nesuportat. URL-ul folosește un protocol pentru care curl nu a fost compilat.

3CURLE_URL_MALFORMAT

URL malformat. Sintaxa URL-ului este invalidă sau nu a putut fi parsată.

5CURLE_COULDNT_RESOLVE_PROXY

Nu s-a putut rezolva proxy-ul. Numele de gazdă al proxy-ului specificat nu a putut fi rezolvat.

6CURLE_COULDNT_RESOLVE_HOST

Căutarea DNS a eșuat — numele de gazdă nu a putut fi rezolvat într-o adresă IP.

7CURLE_COULDNT_CONNECT

Conexiunea TCP a eșuat — serverul este oprit, portul este blocat sau firewall-ul respinge conexiunile.

18CURLE_PARTIAL_FILE

Fișier parțial. Transferul a fost întrerupt și doar o parte din fișier a fost primită.

22CURLE_HTTP_RETURNED_ERROR

Serverul a returnat o eroare HTTP (4xx/5xx) și a fost utilizat flag-ul --fail.

23CURLE_WRITE_ERROR

Eroare de scriere. curl nu a reușit să scrie datele primite pe disc (permisiune refuzată sau disc plin).

28CURLE_OPERATION_TIMEDOUT

Operațiunea a depășit timpul maxim permis (DNS, conectare sau transfer).

35CURLE_SSL_CONNECT_ERROR

Handshake-ul SSL/TLS a eșuat — nepotrivire de versiune de protocol sau suită de cifrare.

37CURLE_FILE_COULDNT_READ_FILE

Nu s-a putut citi fișierul. Un fișier local referit în cerere nu a putut fi deschis sau citit.

52CURLE_GOT_NOTHING

Răspuns gol de la server. Serverul a închis conexiunea fără a trimite date.

56CURLE_RECV_ERROR

Conexiunea a fost resetată — serverul a abandonat conexiunea în timpul transferului de date.

60CURLE_SSL_CACERT

Verificarea certificatului SSL a eșuat — expirat, auto-semnat sau pachetul CA este învechit.

77CURLE_SSL_CACERT_BADFILE

Problemă cu certificatul CA SSL. Fișierul de certificat CA specificat nu a putut fi citit sau parsat.

92CURLE_HTTP2_STREAM

Eroare de flux HTTP/2. O eroare de protocol HTTP/2 la nivel de flux a apărut în timpul transferului.

Eroare 6: Nu s-a putut rezolva gazda

Ce înseamnă
Terminalul tău arată curl: (6) Could not resolve host. curl nu a putut rezolva numele de gazdă într-o adresă IP — căutarea DNS a eșuat înainte de a se încerca vreo conexiune.
Cauze
Cele mai frecvente cauze sunt: o greșeală de tastare în numele de gazdă (de ex., curl https://apiexample.com în loc de api.example.com), probleme cu serverul DNS (DNS-ul configurat este inaccesibil), lipsa conexiunii la rețea (Wi-Fi deconectat, VPN neconectat) sau domeniul efectiv nu există.
Cum se remediază
Mai întâi, verifică dacă URL-ul este corect. Apoi testează rezolvarea DNS direct: nslookup api.example.com sau dig api.example.com. Dacă DNS-ul eșuează, încearcă un alt server DNS: curl --dns-servers 8.8.8.8 https://api.example.com. Verifică /etc/resolv.conf sau setările de rețea. Dacă ești în spatele unui VPN corporativ, asigură-te că DNS-ul intern poate rezolva gazda.
$ curl https://api.exmple.com/users

Eroare 7: Conectarea a eșuat

Ce înseamnă
Terminalul tău arată curl: (7) Failed to connect to host port: Connection refused. curl a rezolvat numele de gazdă, dar nu a putut stabili o conexiune TCP cu serverul — conexiunea a fost refuzată activ sau a expirat la nivel TCP.
Cauze
Cauzele frecvente includ: serverul este oprit sau nu rulează, un firewall blochează portul (verifică atât firewall-ul local, cât și cel al serverului), portul este greșit (de ex., serviciul rulează pe 8080 dar te conectezi la 443) sau coada de așteptare a serverului este plină din cauza sarcinii mari.
Cum se remediază
Verifică dacă serverul rulează: ping api.example.com și telnet api.example.com 443. Verifică dacă portul corect este deschis: nmap -p 443 api.example.com. Dezactivează temporar firewall-ul local pentru a testa. Dacă folosești Docker, asigură-te că portul containerului este publicat. Încearcă cu modul verbose: curl -v https://api.example.com pentru a vedea exact unde eșuează conexiunea.
$ curl https://localhost:8080/api

Eroare 22: HTTP a returnat eroare

Ce înseamnă
Terminalul tău arată curl: (22) The requested URL returned error. Serverul a returnat un cod de stare HTTP de eroare (4xx sau 5xx), iar curl a fost invocat cu -f sau --fail, ceea ce îi spune lui curl să trateze erorile HTTP drept eșecuri.
Cauze
Eroarea este declanșată de coduri de stare HTTP precum 400 (Bad Request), 401 (Unauthorized), 403 (Forbidden), 404 (Not Found) sau 500 (Internal Server Error) — dar doar când --fail este utilizat. Fără --fail, curl iese cu codul 0 chiar și la erori HTTP. Cauze frecvente: URL greșit, autentificare lipsă, permisiuni insuficiente sau erori pe server.
Cum se remediază
Rulează curl fără --fail pentru a vedea corpul complet al răspunsului — acesta conține adesea mesajul real de eroare. Verifică codul de stare HTTP: curl -w "%{http_code}" -o /dev/null -s URL. Pentru 401/403: verifică token-ul de autentificare sau cheia API. Pentru 404: verifică din nou calea URL-ului. Pentru 500: problema este pe server.
$ curl --fail https://api.example.com/nonexistent

Eroare 28: Operațiune expirată

Ce înseamnă
Terminalul tău arată curl: (28) Operation timed out sau curl: (28) Connection timed out. Operațiunea a durat mai mult decât timpul permis. Aceasta este cea mai frecventă eroare curl — poate apărea în timpul rezolvării DNS, conexiunii TCP, handshake-ului SSL sau transferului de date.
Cauze
Cauzele tipice includ: server lent sau suprasolicitat care nu răspunde la timp, congestie de rețea sau pierdere de pachete, firewall care abandonează silențios pachetele (fără respingere, doar tăcere), valori de timeout prea stricte setate cu --connect-timeout sau --max-time sau o configurare greșită a proxy-ului care cauzează întârzieri.
Cum se remediază
Crește timeout-ul: curl --connect-timeout 30 --max-time 120 URL. Folosește modul verbose pentru a vedea unde se blochează: curl -v URL. Testează latența rețelei: ping api.example.com și traceroute api.example.com. Dacă ești în spatele unui proxy, încearcă să-l ocolești: curl --noproxy '*' URL. Pentru transferuri mari de fișiere, ia în considerare utilizarea --retry 3 cu --retry-delay 5.
$ curl --connect-timeout 5 https://slow-api.example.com/data

Eroare 35: Eroare de conectare SSL

Ce înseamnă
Terminalul tău arată curl: (35) SSL connect error. Handshake-ul SSL/TLS a eșuat — curl nu a putut stabili o conexiune securizată cu serverul.
Cauze
Cauze frecvente: nepotrivire a versiunii TLS (serverul necesită TLS 1.3 dar curl-ul tău suportă doar până la TLS 1.2), incompatibilitate a suitelor de cifrare, configurare SSL greșită a serverului (certificat expirat prezentat în timpul handshake-ului, lanț incomplet), serverul nu suportă de fapt HTTPS pe portul dat sau un proxy sau firewall interceptează conexiunea SSL (MITM).
Cum se remediază
Forțează o versiune TLS specifică: curl --tlsv1.2 URL sau curl --tlsv1.3 URL. Verifică ce suportă serverul: openssl s_client -connect api.example.com:443. Actualizează curl și OpenSSL la cele mai recente versiuni. Dacă serverul folosește un certificat auto-semnat, aceasta este de obicei eroarea 60 — eroarea 35 indică de obicei un eșec al handshake-ului la nivel de protocol.
$ curl https://legacy-server.example.com/api

Eroare 56: Eșec de recepție — Conexiunea a fost resetată

Ce înseamnă
Terminalul tău arată curl: (56) Recv failure: Connection reset by peer. Conexiunea a fost stabilită cu succes, dar recepția datelor a eșuat — serverul a închis sau a resetat conexiunea neașteptat în timpul transferului.
Cauze
Aceasta se întâmplă adesea când: serverul se blochează sau repornește în timpul transferului, un load balancer sau proxy abandonează conexiunea (timeout de inactivitate, cerere prea mare), un firewall întrerupe conexiunile de lungă durată, serverul are un timeout de keep-alive mai scurt decât cel așteptat sau există o întrerupere de rețea între client și server.
Cum se remediază
Încearcă din nou cererea — problemele tranzitorii de rețea sunt cea mai frecventă cauză. Folosește modul verbose: curl -v URL pentru a vedea punctul exact de eșec. Dacă eroarea apare în timpul încărcărilor mari, încearcă transferul fragmentat: curl -H "Transfer-Encoding: chunked" URL. Pentru operațiuni Git care arată RPC failed; curl 56, crește buffer-ul: git config http.postBuffer 524288000.
$ curl https://api.example.com/large-download

Eroare 60: Problemă cu certificatul SSL

Ce înseamnă
Terminalul tău arată curl: (60) SSL certificate problem: unable to get local issuer certificate. curl nu a putut verifica certificatul SSL al serverului față de pachetul său CA (Autoritate de Certificare). Handshake-ul TLS a fost completat la nivel de protocol, dar validarea certificatului a eșuat.
Cauze
Cele mai frecvente cauze: serverul folosește un certificat auto-semnat, certificatul a expirat, lanțul de certificate este incomplet (lipsesc certificate intermediare), pachetul CA al curl este învechit (frecvent pe sisteme mai vechi sau în containere Docker) sau Common Name / SAN al certificatului nu corespunde cu numele de gazdă solicitat.
Cum se remediază
Actualizează pachetul CA: curl --cacert /path/to/cacert.pem URL. Descarcă un pachet actualizat de la https://curl.se/ca/cacert.pem. Pentru diagnosticare: openssl s_client -connect api.example.com:443 -showcerts. Pentru certificate auto-semnate în dezvoltare, folosește curl -k URL (niciodată în producție — dezactivează toată verificarea certificatelor). În Docker, instalează pachetul ca-certificates.
$ curl https://self-signed.example.com/api

Alte coduri de eroare

0CURLE_OK

Succes. Operațiunea s-a finalizat fără erori.

1CURLE_UNSUPPORTED_PROTOCOL

Protocol nesuportat. URL-ul folosește un protocol pentru care curl nu a fost compilat.

3CURLE_URL_MALFORMAT

URL malformat. Sintaxa URL-ului este invalidă sau nu a putut fi parsată.

5CURLE_COULDNT_RESOLVE_PROXY

Nu s-a putut rezolva proxy-ul. Numele de gazdă al proxy-ului specificat nu a putut fi rezolvat.

18CURLE_PARTIAL_FILE

Fișier parțial. Transferul a fost întrerupt și doar o parte din fișier a fost primită.

23CURLE_WRITE_ERROR

Eroare de scriere. curl nu a reușit să scrie datele primite pe disc (permisiune refuzată sau disc plin).

37CURLE_FILE_COULDNT_READ_FILE

Nu s-a putut citi fișierul. Un fișier local referit în cerere nu a putut fi deschis sau citit.

52CURLE_GOT_NOTHING

Răspuns gol de la server. Serverul a închis conexiunea fără a trimite date.

77CURLE_SSL_CACERT_BADFILE

Problemă cu certificatul CA SSL. Fișierul de certificat CA specificat nu a putut fi citit sau parsat.

92CURLE_HTTP2_STREAM

Eroare de flux HTTP/2. O eroare de protocol HTTP/2 la nivel de flux a apărut în timpul transferului.

Cum să depanezi erorile curl

Când curl eșuează, aceste trei flag-uri te ajută să identifici rapid cauza principală — de la rezolvarea DNS la handshake-ul SSL și până la payload-ul răspunsului.

  1. 1

    Activează ieșirea verbose

    Rulează curl -v URL pentru a vedea ciclul complet cerere/răspuns: rezolvare DNS, conexiune TCP, handshake TLS, headere de cerere trimise și headere de răspuns primite. Acesta este cel mai util flag de depanare.

  2. 2

    Verifică codul de stare HTTP

    Rulează curl -o /dev/null -s -w "%{http_code}" URL pentru a obține doar codul de stare HTTP (200, 404, 500 etc.) fără corpul răspunsului. Util pentru verificări rapide de sănătate și scripting.

  3. 3

    Afișează erorile silențios

    Rulează curl -sS URL pentru a suprima bara de progres (-s), dar a afișa totuși erorile (-S). Perfect pentru scripturi în care vrei ieșire curată, dar ai nevoie să prinzi eșecurile.

Întrebări frecvente

Cum să verifici codul de ieșire curl?

După rularea unei comenzi curl, codul de ieșire este stocat în variabila specială a shell-ului. În Bash/Zsh, rulează echo $? imediat după comanda curl. În PowerShell, folosește $LASTEXITCODE. În scripturi, îl poți verifica cu o condiție: if curl -sf URL; then echo "OK"; else echo "Failed with code $?"; fi. Codul de ieșire 0 înseamnă succes; orice alt număr indică o eroare. Pentru a vedea atât codul de stare HTTP cât și codul de ieșire curl, combină curl -w "%{http_code}" -o /dev/null -s URL; echo "Exit: $?". Reține că codul de ieșire curl este diferit de codul de stare HTTP — curl returnează 0 chiar și pentru HTTP 404, cu excepția cazului în care folosești flag-ul --fail.

Cum să remediezi eroarea curl 28 (operațiune expirată)?

Eroarea 28 înseamnă că cererea a depășit timpul maxim permis. Mai întâi, crește timeout-ul: curl --connect-timeout 30 --max-time 120 URL. --connect-timeout limitează faza conexiunii TCP, în timp ce --max-time limitează întreaga operațiune. Apoi, diagnostichează blocajul cu curl -v URL — ieșirea verbose arată exact unde se blochează curl (DNS, conectare, TLS sau transfer). Remedieri frecvente: verifică conexiunea la rețea și setările DNS, verifică dacă serverul răspunde (ping și telnet), ocolește proxy-urile cu --noproxy '*' și pentru descărcări mari adaugă --retry 3 --retry-delay 5 pentru reîncercări automate.

Cum să remediezi erorile de certificat SSL curl (eroare 60)?

Eroarea 60 înseamnă că curl nu poate verifica certificatul SSL al serverului. Remedierea depinde de cauză. Pentru un pachet CA învechit: descarcă unul nou de la https://curl.se/ca/cacert.pem și folosește curl --cacert /path/to/cacert.pem URL. Pentru containere Docker: instalează pachetul ca-certificates (apt-get install ca-certificates). Pentru certificate auto-semnate în dezvoltare: folosește curl -k URL pentru a omite verificarea — dar nu folosi niciodată -k în producție deoarece dezactivează toată verificarea certificatelor. Pentru diagnosticare: rulează openssl s_client -connect host:443 -showcerts pentru a inspecta lanțul de certificate. Dacă certificatul a expirat sau numele de gazdă nu corespunde, problema este pe server.

Ce înseamnă eroarea curl 7 (eșec de conectare)?

Eroarea 7 înseamnă că curl a rezolvat numele de gazdă într-o adresă IP, dar nu a putut stabili o conexiune TCP. Serverul a refuzat activ conexiunea sau tentativa de conectare a expirat la nivel de rețea. Cauze frecvente: serviciul nu rulează pe gazda țintă (verifică cu systemctl status sau docker ps), un firewall blochează portul (testează cu telnet host port), folosești portul greșit (de ex., 80 în loc de 443 sau 8080 pentru un server de dezvoltare) sau coada de așteptare a serverului este plină din cauza sarcinii mari. Pentru depanare: folosește curl -v URL și caută „Connected to” sau „Connection refused” în ieșire.