Códigos de Erro do curl: Referência Completa
Quando um comando curl falha, devolve um código de saída numérico (também chamado código de erro do curl) que identifica o tipo de erro. Pode verificar o código de saída do curl executando echo $? imediatamente após o comando curl (ou $LASTEXITCODE no PowerShell). O código de saída 0 significa sucesso; qualquer outro número indica um problema específico — desde falhas na resolução DNS e timeouts de conexão até problemas com certificados SSL. Esta página é uma referência completa dos códigos de erro do curl mais comuns com explicações, causas e correções. Se estiver a trabalhar com comandos curl no seu código, cole-os no curl2code para converter para a linguagem de programação à sua escolha.
Tabela de Referência Rápida
Sucesso. A operação foi concluída sem erros.
Protocolo não suportado. O URL usa um protocolo para o qual o curl não foi compilado com suporte.
URL malformado. A sintaxe do URL é inválida ou não pôde ser analisada.
Não foi possível resolver o proxy. O nome do host do proxy especificado não pôde ser resolvido.
A pesquisa DNS falhou — não foi possível resolver o nome do host para um endereço IP.
A conexão TCP falhou — o servidor está inativo, a porta está bloqueada ou a firewall está a rejeitar conexões.
Ficheiro parcial. A transferência foi interrompida e apenas parte do ficheiro foi recebida.
O servidor devolveu um erro HTTP (4xx/5xx) e a flag --fail foi usada.
Erro de escrita. O curl não conseguiu escrever os dados recebidos no disco (permissão negada ou disco cheio).
A operação excedeu o tempo máximo permitido (DNS, conexão ou transferência).
O handshake SSL/TLS falhou — incompatibilidade de versão de protocolo ou cipher suite.
Não foi possível ler o ficheiro. Um ficheiro local referenciado no pedido não pôde ser aberto ou lido.
Resposta vazia do servidor. O servidor fechou a conexão sem enviar quaisquer dados.
A conexão foi reiniciada — o servidor terminou a conexão durante a transferência de dados.
A verificação do certificado SSL falhou — expirado, autoassinado ou pacote de CA desatualizado.
Problema com certificado CA SSL. Não foi possível ler ou analisar o ficheiro de certificado CA especificado.
Erro de stream HTTP/2. Ocorreu um erro ao nível do protocolo HTTP/2 durante a transferência.
Erro 6: Não Foi Possível Resolver o Host
- O que significa
- O seu terminal mostra
curl: (6) Could not resolve host. O curl não conseguiu resolver o nome do host para um endereço IP — a pesquisa DNS falhou antes de qualquer tentativa de conexão. - Causas
- As causas mais comuns são: um erro de digitação no nome do host (por exemplo,
curl https://apiexample.comem vez deapi.example.com), problemas no servidor DNS (o DNS configurado está inativo ou inacessível), sem conexão de rede (Wi-Fi desligado, VPN não conectada), ou o domínio genuinamente não existe. - Como corrigir
- Primeiro, verifique se o URL está correto. Depois, teste a resolução DNS diretamente:
nslookup api.example.comoudig api.example.com. Se o DNS falhar, tente um servidor DNS diferente:curl --dns-servers 8.8.8.8 https://api.example.com. Verifique o seu/etc/resolv.confou as definições de rede. Se estiver atrás de uma VPN empresarial, certifique-se de que o DNS interno consegue resolver o host.
$ curl https://api.exmple.com/usersErro 7: Falha ao Conectar
- O que significa
- O seu terminal mostra
curl: (7) Failed to connect to host port: Connection refused. O curl resolveu o nome do host mas não conseguiu estabelecer uma conexão TCP ao servidor — a conexão foi ativamente recusada ou expirou ao nível TCP. - Causas
- As causas comuns incluem: o servidor está inativo ou não está em execução, uma firewall está a bloquear a porta (verifique as firewalls locais e do lado do servidor), a porta está errada (por exemplo, o serviço executa na 8080 mas está a conectar à 443), ou o backlog de escuta do servidor está cheio sob carga elevada.
- Como corrigir
- Verifique se o servidor está em execução:
ping api.example.cometelnet api.example.com 443. Verifique se a porta correta está aberta:nmap -p 443 api.example.com. Desative temporariamente a firewall local para testar. Se estiver a usar Docker, certifique-se de que a porta do contentor está publicada. Tente com modo verboso:curl -v https://api.example.compara ver exatamente onde a conexão falha.
$ curl https://localhost:8080/apiErro 22: HTTP Devolveu Erro
- O que significa
- O seu terminal mostra
curl: (22) The requested URL returned error. O servidor devolveu um código de estado de erro HTTP (4xx ou 5xx) e o curl foi invocado com-fou--fail, que diz ao curl para tratar erros HTTP como falhas. - Causas
- O erro é acionado por códigos de estado HTTP como 400 (Bad Request), 401 (Unauthorized), 403 (Forbidden), 404 (Not Found) ou 500 (Internal Server Error) — mas apenas quando
--failé usado. Sem--fail, o curl sai com código 0 mesmo em erros HTTP. Causas comuns: URL errado, autenticação em falta, permissões insuficientes ou erros do lado do servidor. - Como corrigir
- Execute o curl sem
--failpara ver o corpo completo da resposta — frequentemente contém a mensagem de erro real. Verifique o código de estado HTTP:curl -w "%{http_code}" -o /dev/null -s URL. Para 401/403: verifique o seu token de autenticação ou chave de API. Para 404: verifique novamente o caminho do URL. Para 500: o problema está do lado do servidor.
$ curl --fail https://api.example.com/nonexistentErro 28: A Operação Expirou
- O que significa
- O seu terminal mostra
curl: (28) Operation timed outoucurl: (28) Connection timed out. A operação demorou mais do que o tempo permitido. Este é o erro de curl mais comum — pode ocorrer durante a resolução DNS, conexão TCP, handshake SSL ou transferência de dados. - Causas
- As causas típicas incluem: servidor lento ou sobrecarregado que não responde a tempo, congestionamento de rede ou perda de pacotes, firewall a descartar pacotes silenciosamente (sem rejeição, apenas silêncio), valores de timeout excessivamente restritos definidos com
--connect-timeoutou--max-time, ou uma configuração incorreta de proxy a causar atrasos. - Como corrigir
- Aumente o timeout:
curl --connect-timeout 30 --max-time 120 URL. Use o modo verboso para ver onde fica bloqueado:curl -v URL. Teste a latência da rede:ping api.example.cometraceroute api.example.com. Se estiver atrás de um proxy, tente contorná-lo:curl --noproxy '*' URL. Para transferências de ficheiros grandes, considere usar--retry 3com--retry-delay 5.
$ curl --connect-timeout 5 https://slow-api.example.com/dataErro 35: Erro de Conexão SSL
- O que significa
- O seu terminal mostra
curl: (35) SSL connect error. O handshake SSL/TLS falhou — o curl não conseguiu estabelecer uma conexão segura com o servidor. - Causas
- Causas comuns: incompatibilidade da versão TLS (o servidor requer TLS 1.3 mas o seu curl só suporta até TLS 1.2), incompatibilidade de cipher suites, configuração SSL incorreta do servidor (certificado expirado apresentado durante o handshake, cadeia incompleta), o servidor não suporta realmente HTTPS na porta indicada, ou um proxy ou firewall está a interceptar a conexão SSL (MITM).
- Como corrigir
- Force uma versão TLS específica:
curl --tlsv1.2 URLoucurl --tlsv1.3 URL. Verifique o que o servidor suporta:openssl s_client -connect api.example.com:443. Atualize o curl e o OpenSSL para as versões mais recentes. Se o servidor usa um certificado autoassinado, normalmente é o erro 60 — o erro 35 indica tipicamente uma falha de handshake ao nível do protocolo.
$ curl https://legacy-server.example.com/apiErro 56: Falha na Receção — Conexão Foi Reiniciada
- O que significa
- O seu terminal mostra
curl: (56) Recv failure: Connection reset by peer. A conexão foi estabelecida com sucesso, mas a receção de dados falhou — o servidor fechou ou reiniciou a conexão inesperadamente durante a transferência. - Causas
- Isto acontece frequentemente quando: o servidor falha ou reinicia durante a transferência, um balanceador de carga ou proxy fecha a conexão (timeout de inatividade, pedido demasiado grande), uma firewall termina conexões de longa duração, o servidor tem um timeout de keep-alive mais curto do que o esperado, ou há uma interrupção de rede entre o cliente e o servidor.
- Como corrigir
- Tente o pedido novamente — problemas de rede transitórios são a causa mais comum. Use o modo verboso:
curl -v URLpara ver o ponto exato da falha. Se o erro ocorre durante uploads grandes, tente transferência em blocos:curl -H "Transfer-Encoding: chunked" URL. Para operações Git que mostramRPC failed; curl 56, aumente o buffer:git config http.postBuffer 524288000.
$ curl https://api.example.com/large-downloadErro 60: Problema com Certificado SSL
- O que significa
- O seu terminal mostra
curl: (60) SSL certificate problem: unable to get local issuer certificate. O curl não conseguiu verificar o certificado SSL do servidor contra o seu pacote de CA (Autoridade de Certificação). O handshake TLS foi concluído ao nível do protocolo, mas a validação do certificado falhou. - Causas
- As causas mais comuns: o servidor usa um certificado autoassinado, o certificado expirou, a cadeia de certificados está incompleta (certificados intermédios em falta), o pacote de CA do curl está desatualizado (comum em sistemas antigos ou em contentores Docker), ou o Common Name / SAN do certificado não corresponde ao nome do host pedido.
- Como corrigir
- Atualize o pacote de CA:
curl --cacert /path/to/cacert.pem URL. Descarregue um pacote atualizado de https://curl.se/ca/cacert.pem. Para diagnosticar:openssl s_client -connect api.example.com:443 -showcerts. Para certificados autoassinados em desenvolvimento, usecurl -k URL(nunca em produção — desativa toda a verificação de certificados). Em Docker, instale o pacoteca-certificates.
$ curl https://self-signed.example.com/apiOutros Códigos de Erro
Sucesso. A operação foi concluída sem erros.
Protocolo não suportado. O URL usa um protocolo para o qual o curl não foi compilado com suporte.
URL malformado. A sintaxe do URL é inválida ou não pôde ser analisada.
Não foi possível resolver o proxy. O nome do host do proxy especificado não pôde ser resolvido.
Ficheiro parcial. A transferência foi interrompida e apenas parte do ficheiro foi recebida.
Erro de escrita. O curl não conseguiu escrever os dados recebidos no disco (permissão negada ou disco cheio).
Não foi possível ler o ficheiro. Um ficheiro local referenciado no pedido não pôde ser aberto ou lido.
Resposta vazia do servidor. O servidor fechou a conexão sem enviar quaisquer dados.
Problema com certificado CA SSL. Não foi possível ler ou analisar o ficheiro de certificado CA especificado.
Erro de stream HTTP/2. Ocorreu um erro ao nível do protocolo HTTP/2 durante a transferência.
Como Depurar Erros do curl
Quando o curl falha, estas três flags ajudam-no a identificar rapidamente a causa raiz — desde a resolução DNS até ao handshake SSL e ao payload da resposta.
- 1
Ativar saída verbosa
Execute
curl -v URLpara ver o ciclo completo de pedido/resposta: resolução DNS, conexão TCP, handshake TLS, cabeçalhos do pedido enviados e cabeçalhos da resposta recebidos. Esta é a flag de depuração mais útil. - 2
Verificar o código de estado HTTP
Execute
curl -o /dev/null -s -w "%{http_code}" URLpara obter apenas o código de estado HTTP (200, 404, 500, etc.) sem o corpo da resposta. Útil para verificações rápidas de saúde e scripting. - 3
Mostrar erros silenciosamente
Execute
curl -sS URLpara suprimir a barra de progresso (-s) mas ainda mostrar erros (-S). Perfeito para scripts onde deseja uma saída limpa mas precisa de detetar falhas.
Perguntas Frequentes
Como verificar o código de saída do curl?
Após executar um comando curl, o código de saída é armazenado na variável especial da shell. Em Bash/Zsh, execute echo $? imediatamente após o comando curl. Em PowerShell, use $LASTEXITCODE. Em scripts, pode verificá-lo com uma condição: if curl -sf URL; then echo "OK"; else echo "Failed with code $?"; fi. O código de saída 0 significa sucesso; qualquer outro número indica um erro. Para ver tanto o código de estado HTTP como o código de saída do curl, combine curl -w "%{http_code}" -o /dev/null -s URL; echo "Exit: $?". Note que o código de saída do curl é diferente do código de estado HTTP — o curl devolve 0 mesmo para HTTP 404, a menos que use a flag --fail.
Como corrigir o erro 28 do curl (operação expirou)?
O erro 28 significa que o pedido excedeu o tempo máximo permitido. Primeiro, aumente o timeout: curl --connect-timeout 30 --max-time 120 URL. O --connect-timeout limita a fase de conexão TCP, enquanto --max-time limita toda a operação. Em seguida, diagnostique o gargalo com curl -v URL — a saída verbosa mostra exatamente onde o curl fica bloqueado (DNS, conexão, TLS ou transferência). Correções comuns: verifique a sua conexão de rede e definições DNS, confirme que o servidor está a responder (ping e telnet), contorne proxies com --noproxy '*', e para downloads grandes adicione --retry 3 --retry-delay 5 para tentativas automáticas.
Como corrigir erros de certificado SSL do curl (erro 60)?
O erro 60 significa que o curl não consegue verificar o certificado SSL do servidor. A correção depende da causa. Para um pacote de CA desatualizado: descarregue um novo de https://curl.se/ca/cacert.pem e use curl --cacert /path/to/cacert.pem URL. Para contentores Docker: instale o pacote ca-certificates (apt-get install ca-certificates). Para certificados autoassinados em desenvolvimento: use curl -k URL para ignorar a verificação — mas nunca use -k em produção pois desativa toda a verificação de certificados. Para diagnosticar: execute openssl s_client -connect host:443 -showcerts para inspecionar a cadeia de certificados. Se o certificado expirou ou o nome do host não corresponde, o problema está do lado do servidor.
O que significa o erro 7 do curl (falha ao conectar)?
O erro 7 significa que o curl resolveu o nome do host para um endereço IP mas não conseguiu estabelecer uma conexão TCP. O servidor recusou ativamente a conexão ou a tentativa de conexão expirou ao nível da rede. Causas comuns: o serviço não está em execução no host alvo (verifique com systemctl status ou docker ps), uma firewall está a bloquear a porta (teste com telnet host port), está a usar a porta errada (por exemplo, 80 em vez de 443, ou 8080 para um servidor de desenvolvimento), ou o backlog de escuta do servidor está cheio sob carga elevada. Para depurar: use curl -v URL e procure por "Connected to" ou "Connection refused" na saída.