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
Successo. L'operazione è stata completata senza errori.
Protocollo non supportato. L'URL utilizza un protocollo per cui curl non è stato compilato.
URL malformato. La sintassi dell'URL non è valida o non è stata analizzata.
Impossibile risolvere il proxy. Il nome host del proxy specificato non è stato risolto.
Ricerca DNS fallita — il nome host non è stato risolto in un indirizzo IP.
Connessione TCP fallita — il server è spento, la porta è bloccata o il firewall sta rifiutando le connessioni.
File parziale. Il trasferimento è stato interrotto e solo una parte del file è stata ricevuta.
Il server ha restituito un errore HTTP (4xx/5xx) ed è stato usato il flag --fail.
Errore di scrittura. curl non è riuscito a scrivere i dati ricevuti su disco (permesso negato o disco pieno).
L'operazione ha superato il tempo massimo consentito (DNS, connessione o trasferimento).
Handshake SSL/TLS fallito — mismatch nella versione del protocollo o nella suite di cifratura.
Impossibile leggere il file. Un file locale referenziato nella richiesta non è stato aperto o letto.
Risposta vuota dal server. Il server ha chiuso la connessione senza inviare dati.
Connessione resettata — il server ha interrotto la connessione durante il trasferimento dati.
Verifica del certificato SSL fallita — scaduto, self-signed o bundle CA obsoleto.
Problema con il certificato CA SSL. Impossibile leggere o analizzare il file del certificato CA specificato.
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.cominvece diapi.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.comodig 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.confo le impostazioni di rete. Se sei dietro una VPN aziendale, assicurati che il DNS interno possa risolvere l'host.
$ curl https://api.exmple.com/usersErrore 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.cometelnet 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.comper vedere esattamente dove la connessione fallisce.
$ curl https://localhost:8080/apiErrore 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-fo--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
--failper 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/nonexistentErrore 28: Operazione scaduta
- Cosa significa
- Il tuo terminale mostra
curl: (28) Operation timed outocurl: (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-timeouto--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.cometraceroute api.example.com. Se sei dietro un proxy, prova a bypassarlo:curl --noproxy '*' URL. Per trasferimenti di file grandi, considera l'uso di--retry 3con--retry-delay 5.
$ curl --connect-timeout 5 https://slow-api.example.com/dataErrore 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 URLocurl --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/apiErrore 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 URLper 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 mostranoRPC failed; curl 56, aumenta il buffer:git config http.postBuffer 524288000.
$ curl https://api.example.com/large-downloadErrore 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, usacurl -k URL(mai in produzione — disabilita tutta la verifica dei certificati). In Docker, installa il pacchettoca-certificates.
$ curl https://self-signed.example.com/apiAltri codici di errore
Successo. L'operazione è stata completata senza errori.
Protocollo non supportato. L'URL utilizza un protocollo per cui curl non è stato compilato.
URL malformato. La sintassi dell'URL non è valida o non è stata analizzata.
Impossibile risolvere il proxy. Il nome host del proxy specificato non è stato risolto.
File parziale. Il trasferimento è stato interrotto e solo una parte del file è stata ricevuta.
Errore di scrittura. curl non è riuscito a scrivere i dati ricevuti su disco (permesso negato o disco pieno).
Impossibile leggere il file. Un file locale referenziato nella richiesta non è stato aperto o letto.
Risposta vuota dal server. Il server ha chiuso la connessione senza inviare dati.
Problema con il certificato CA SSL. Impossibile leggere o analizzare il file del certificato CA specificato.
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
Abilita l'output verboso
Esegui
curl -v URLper 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
Controlla il codice di stato HTTP
Esegui
curl -o /dev/null -s -w "%{http_code}" URLper 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
Mostra gli errori silenziosamente
Esegui
curl -sS URLper 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.