Codici di errore curl: Riferimento completo

Quando un comando curl fallisce, restituisce un codice di uscita numerico (chiamato anche codice di errore curl) che identifica il tipo di errore. Puoi verificare il codice di uscita curl eseguendo echo $? immediatamente dopo il comando curl (oppure $LASTEXITCODE in PowerShell). Il codice di uscita 0 significa successo; qualsiasi altro numero indica un problema specifico — dalla risoluzione DNS fallita e timeout di connessione a problemi con i certificati SSL. Questa pagina è un riferimento completo dei codici di errore curl più comuni con spiegazioni, cause e soluzioni. Se stai lavorando con comandi curl nel tuo codice, incollali in curl2code per convertirli nel linguaggio di programmazione che preferisci.

Tabella di riferimento rapido

0CURLE_OK

Successo. L'operazione è stata completata senza errori.

1CURLE_UNSUPPORTED_PROTOCOL

Protocollo non supportato. L'URL utilizza un protocollo per cui curl non è stato compilato.

3CURLE_URL_MALFORMAT

URL malformato. La sintassi dell'URL non è valida o non è stata analizzata.

5CURLE_COULDNT_RESOLVE_PROXY

Impossibile risolvere il proxy. Il nome host del proxy specificato non è stato risolto.

6CURLE_COULDNT_RESOLVE_HOST

Ricerca DNS fallita — il nome host non è stato risolto in un indirizzo IP.

7CURLE_COULDNT_CONNECT

Connessione TCP fallita — il server è spento, la porta è bloccata o il firewall sta rifiutando le connessioni.

18CURLE_PARTIAL_FILE

File parziale. Il trasferimento è stato interrotto e solo una parte del file è stata ricevuta.

22CURLE_HTTP_RETURNED_ERROR

Il server ha restituito un errore HTTP (4xx/5xx) ed è stato usato il flag --fail.

23CURLE_WRITE_ERROR

Errore di scrittura. curl non è riuscito a scrivere i dati ricevuti su disco (permesso negato o disco pieno).

28CURLE_OPERATION_TIMEDOUT

L'operazione ha superato il tempo massimo consentito (DNS, connessione o trasferimento).

35CURLE_SSL_CONNECT_ERROR

Handshake SSL/TLS fallito — mismatch nella versione del protocollo o nella suite di cifratura.

37CURLE_FILE_COULDNT_READ_FILE

Impossibile leggere il file. Un file locale referenziato nella richiesta non è stato aperto o letto.

52CURLE_GOT_NOTHING

Risposta vuota dal server. Il server ha chiuso la connessione senza inviare dati.

56CURLE_RECV_ERROR

Connessione resettata — il server ha interrotto la connessione durante il trasferimento dati.

60CURLE_SSL_CACERT

Verifica del certificato SSL fallita — scaduto, self-signed o bundle CA obsoleto.

77CURLE_SSL_CACERT_BADFILE

Problema con il certificato CA SSL. Impossibile leggere o analizzare il file del certificato CA specificato.

92CURLE_HTTP2_STREAM

Errore di stream HTTP/2. Si è verificato un errore di protocollo HTTP/2 a livello di stream durante il trasferimento.

Errore 6: Impossibile risolvere l'host

Cosa significa
Il tuo terminale mostra curl: (6) Could not resolve host. curl non è riuscito a risolvere il nome host in un indirizzo IP — la ricerca DNS è fallita prima ancora di tentare la connessione.
Cause
Le cause più comuni sono: un errore di battitura nel nome host (ad es. curl https://apiexample.com invece di api.example.com), problemi con il server DNS (il DNS configurato non è raggiungibile), nessuna connessione di rete (Wi-Fi disconnesso, VPN non connessa), oppure il dominio non esiste realmente.
Come risolvere
Per prima cosa, verifica che l'URL sia corretto. Poi testa la risoluzione DNS direttamente: nslookup api.example.com o dig api.example.com. Se il DNS fallisce, prova un server DNS diverso: curl --dns-servers 8.8.8.8 https://api.example.com. Controlla il tuo /etc/resolv.conf o le impostazioni di rete. Se sei dietro una VPN aziendale, assicurati che il DNS interno possa risolvere l'host.
$ curl https://api.exmple.com/users

Errore 7: Connessione fallita

Cosa significa
Il tuo terminale mostra curl: (7) Failed to connect to host port: Connection refused. curl ha risolto il nome host ma non è riuscito a stabilire una connessione TCP con il server — la connessione è stata attivamente rifiutata o è scaduta a livello TCP.
Cause
Le cause comuni includono: il server è spento o non in esecuzione, un firewall sta bloccando la porta (controlla sia il firewall locale che quello del server), la porta è errata (ad es. il servizio gira sulla 8080 ma stai connettendo alla 443), oppure il backlog di ascolto del server è pieno a causa di un carico elevato.
Come risolvere
Verifica che il server sia in esecuzione: ping api.example.com e telnet api.example.com 443. Controlla se la porta corretta è aperta: nmap -p 443 api.example.com. Disabilita temporaneamente il firewall locale per testare. Se usi Docker, assicurati che la porta del container sia pubblicata. Prova in modalità verbosa: curl -v https://api.example.com per vedere esattamente dove la connessione fallisce.
$ curl https://localhost:8080/api

Errore 22: Errore HTTP restituito

Cosa significa
Il tuo terminale mostra curl: (22) The requested URL returned error. Il server ha restituito un codice di stato HTTP di errore (4xx o 5xx) e curl è stato invocato con -f o --fail, che indica a curl di trattare gli errori HTTP come fallimenti.
Cause
L'errore è innescato dai codici di stato HTTP come 400 (Bad Request), 401 (Unauthorized), 403 (Forbidden), 404 (Not Found) o 500 (Internal Server Error) — ma solo quando viene usato --fail. Senza --fail, curl termina con codice 0 anche in caso di errori HTTP. Le cause comuni sono: URL errato, autenticazione mancante, permessi insufficienti o bug lato server.
Come risolvere
Esegui curl senza --fail per vedere il corpo completo della risposta — spesso contiene il messaggio di errore effettivo. Controlla il codice di stato HTTP: curl -w "%{http_code}" -o /dev/null -s URL. Per 401/403: verifica il tuo token di autenticazione o chiave API. Per 404: ricontrolla il percorso URL. Per 500: il problema è lato server.
$ curl --fail https://api.example.com/nonexistent

Errore 28: Operazione scaduta

Cosa significa
Il tuo terminale mostra curl: (28) Operation timed out o curl: (28) Connection timed out. L'operazione ha impiegato più tempo di quello consentito. Questo è l'errore curl più comune — può verificarsi durante la risoluzione DNS, la connessione TCP, l'handshake SSL o il trasferimento dati.
Cause
Le cause tipiche includono: server lento o sovraccarico che non risponde in tempo, congestione di rete o perdita di pacchetti, firewall che scarta silenziosamente i pacchetti (nessun rifiuto, solo silenzio), valori di timeout troppo restrittivi impostati con --connect-timeout o --max-time, oppure una configurazione proxy errata che causa ritardi.
Come risolvere
Aumenta il timeout: curl --connect-timeout 30 --max-time 120 URL. Usa la modalità verbosa per vedere dove si blocca: curl -v URL. Testa la latenza di rete: ping api.example.com e traceroute api.example.com. Se sei dietro un proxy, prova a bypassarlo: curl --noproxy '*' URL. Per trasferimenti di file grandi, considera l'uso di --retry 3 con --retry-delay 5.
$ curl --connect-timeout 5 https://slow-api.example.com/data

Errore 35: Errore di connessione SSL

Cosa significa
Il tuo terminale mostra curl: (35) SSL connect error. L'handshake SSL/TLS è fallito — curl non è riuscito a stabilire una connessione sicura con il server.
Cause
Le cause comuni sono: mismatch nella versione TLS (il server richiede TLS 1.3 ma il tuo curl supporta solo TLS 1.2), incompatibilità della suite di cifratura, configurazione SSL errata del server (certificato scaduto presentato durante l'handshake, catena incompleta), il server non supporta effettivamente HTTPS sulla porta specificata, oppure un proxy o firewall sta intercettando la connessione SSL (MITM).
Come risolvere
Forza una versione TLS specifica: curl --tlsv1.2 URL o curl --tlsv1.3 URL. Verifica cosa supporta il server: openssl s_client -connect api.example.com:443. Aggiorna curl e OpenSSL all'ultima versione. Se il server usa un certificato self-signed, di solito è l'errore 60 — l'errore 35 indica tipicamente un fallimento dell'handshake a livello di protocollo.
$ curl https://legacy-server.example.com/api

Errore 56: Errore di ricezione — Connessione resettata

Cosa significa
Il tuo terminale mostra curl: (56) Recv failure: Connection reset by peer. La connessione è stata stabilita con successo, ma la ricezione dei dati è fallita — il server ha chiuso o resettato la connessione inaspettatamente durante il trasferimento.
Cause
Questo accade spesso quando: il server si blocca o si riavvia durante il trasferimento, un load balancer o proxy interrompe la connessione (timeout di inattività, richiesta troppo grande), un firewall termina le connessioni di lunga durata, il server ha un timeout keep-alive più breve del previsto, oppure c'è un'interruzione di rete tra client e server.
Come risolvere
Riprova la richiesta — i problemi di rete transitori sono la causa più comune. Usa la modalità verbosa: curl -v URL per vedere il punto esatto del fallimento. Se l'errore si verifica durante caricamenti di grandi dimensioni, prova il trasferimento chunked: curl -H "Transfer-Encoding: chunked" URL. Per operazioni Git che mostrano RPC failed; curl 56, aumenta il buffer: git config http.postBuffer 524288000.
$ curl https://api.example.com/large-download

Errore 60: Problema con il certificato SSL

Cosa significa
Il tuo terminale mostra curl: (60) SSL certificate problem: unable to get local issuer certificate. curl non è riuscito a verificare il certificato SSL del server rispetto al proprio bundle CA (Certificate Authority). L'handshake TLS è stato completato a livello di protocollo, ma la validazione del certificato è fallita.
Cause
Le cause più comuni sono: il server utilizza un certificato self-signed, il certificato è scaduto, la catena di certificati è incompleta (mancano i certificati intermedi), il bundle CA di curl è obsoleto (comune su sistemi vecchi o nei container Docker), oppure il Common Name / SAN del certificato non corrisponde al nome host richiesto.
Come risolvere
Aggiorna il bundle CA: curl --cacert /path/to/cacert.pem URL. Scarica un bundle aggiornato da https://curl.se/ca/cacert.pem. Per diagnosticare: openssl s_client -connect api.example.com:443 -showcerts. Per certificati self-signed in sviluppo, usa curl -k URL (mai in produzione — disabilita tutta la verifica dei certificati). In Docker, installa il pacchetto ca-certificates.
$ curl https://self-signed.example.com/api

Altri codici di errore

0CURLE_OK

Successo. L'operazione è stata completata senza errori.

1CURLE_UNSUPPORTED_PROTOCOL

Protocollo non supportato. L'URL utilizza un protocollo per cui curl non è stato compilato.

3CURLE_URL_MALFORMAT

URL malformato. La sintassi dell'URL non è valida o non è stata analizzata.

5CURLE_COULDNT_RESOLVE_PROXY

Impossibile risolvere il proxy. Il nome host del proxy specificato non è stato risolto.

18CURLE_PARTIAL_FILE

File parziale. Il trasferimento è stato interrotto e solo una parte del file è stata ricevuta.

23CURLE_WRITE_ERROR

Errore di scrittura. curl non è riuscito a scrivere i dati ricevuti su disco (permesso negato o disco pieno).

37CURLE_FILE_COULDNT_READ_FILE

Impossibile leggere il file. Un file locale referenziato nella richiesta non è stato aperto o letto.

52CURLE_GOT_NOTHING

Risposta vuota dal server. Il server ha chiuso la connessione senza inviare dati.

77CURLE_SSL_CACERT_BADFILE

Problema con il certificato CA SSL. Impossibile leggere o analizzare il file del certificato CA specificato.

92CURLE_HTTP2_STREAM

Errore di stream HTTP/2. Si è verificato un errore di protocollo HTTP/2 a livello di stream durante il trasferimento.

Come eseguire il debug degli errori curl

Quando curl fallisce, questi tre flag ti aiutano a identificare rapidamente la causa principale — dalla risoluzione DNS all'handshake SSL fino al payload della risposta.

  1. 1

    Abilita l'output verboso

    Esegui curl -v URL per vedere l'intero ciclo richiesta/risposta: risoluzione DNS, connessione TCP, handshake TLS, header della richiesta inviati e header della risposta ricevuti. Questo è il flag di debug più utile in assoluto.

  2. 2

    Controlla il codice di stato HTTP

    Esegui curl -o /dev/null -s -w "%{http_code}" URL per ottenere solo il codice di stato HTTP (200, 404, 500, ecc.) senza il corpo della risposta. Utile per controlli rapidi di stato e per gli script.

  3. 3

    Mostra gli errori silenziosamente

    Esegui curl -sS URL per sopprimere la barra di avanzamento (-s) ma mostrare comunque gli errori (-S). Perfetto per script dove vuoi un output pulito ma devi catturare i fallimenti.

Domande frequenti

Come verificare il codice di uscita di curl?

Dopo aver eseguito un comando curl, il codice di uscita è memorizzato nella variabile speciale della shell. In Bash/Zsh, esegui echo $? immediatamente dopo il comando curl. In PowerShell, usa $LASTEXITCODE. Negli script, puoi verificarlo con un condizionale: if curl -sf URL; then echo "OK"; else echo "Failed with code $?"; fi. Il codice di uscita 0 significa successo; qualsiasi altro numero indica un errore. Per vedere sia il codice di stato HTTP che il codice di uscita curl, combina curl -w "%{http_code}" -o /dev/null -s URL; echo "Exit: $?". Nota che il codice di uscita di curl è diverso dal codice di stato HTTP — curl restituisce 0 anche per HTTP 404 a meno che non usi il flag --fail.

Come risolvere l'errore curl 28 (operazione scaduta)?

L'errore 28 significa che la richiesta ha superato il tempo massimo consentito. Per prima cosa, aumenta il timeout: curl --connect-timeout 30 --max-time 120 URL. Il --connect-timeout limita la fase di connessione TCP, mentre --max-time limita l'intera operazione. Successivamente, diagnostica il collo di bottiglia con curl -v URL — l'output verboso mostra esattamente dove curl si blocca (DNS, connessione, TLS o trasferimento). Soluzioni comuni: controlla la connessione di rete e le impostazioni DNS, verifica che il server risponda (ping e telnet), bypassa i proxy con --noproxy '*', e per download grandi aggiungi --retry 3 --retry-delay 5 per tentativi automatici.

Come risolvere gli errori del certificato SSL di curl (errore 60)?

L'errore 60 significa che curl non riesce a verificare il certificato SSL del server. La soluzione dipende dalla causa. Per un bundle CA obsoleto: scarica uno aggiornato da https://curl.se/ca/cacert.pem e usa curl --cacert /path/to/cacert.pem URL. Per i container Docker: installa il pacchetto ca-certificates (apt-get install ca-certificates). Per certificati self-signed in sviluppo: usa curl -k URL per saltare la verifica — ma non usare mai -k in produzione poiché disabilita tutti i controlli dei certificati. Per diagnosticare: esegui openssl s_client -connect host:443 -showcerts per ispezionare la catena di certificati. Se il certificato è scaduto o il nome host non corrisponde, il problema è lato server.

Cosa significa l'errore curl 7 (connessione fallita)?

L'errore 7 significa che curl ha risolto il nome host in un indirizzo IP ma non è riuscito a stabilire una connessione TCP. Il server ha rifiutato attivamente la connessione oppure il tentativo di connessione è scaduto a livello di rete. Cause comuni: il servizio non è in esecuzione sull'host di destinazione (verifica con systemctl status o docker ps), un firewall sta bloccando la porta (testa con telnet host port), stai usando la porta sbagliata (ad es. 80 invece di 443, o 8080 per un server di sviluppo), oppure il backlog di ascolto del server è pieno sotto carico elevato. Per il debug: usa curl -v URL e cerca "Connected to" o "Connection refused" nell'output.