Codes d'erreur curl : référence complète

Quand une commande curl échoue, elle retourne un code de sortie numérique (aussi appelé code d'erreur curl) qui identifie le type d'erreur. Vous pouvez vérifier le code de sortie curl en exécutant echo $? immédiatement après la commande curl (ou $LASTEXITCODE dans PowerShell). Le code de sortie 0 signifie succès ; tout autre nombre indique un problème spécifique — des échecs de résolution DNS et des timeouts de connexion aux problèmes de certificats SSL. Cette page est une référence complète des codes d'erreur curl les plus courants avec des explications, causes et solutions. Si vous travaillez avec des commandes curl dans votre code, collez-les dans curl2code pour les convertir dans le langage de programmation de votre choix.

Tableau de référence rapide

0CURLE_OK

Succès. L'opération s'est terminée sans aucune erreur.

1CURLE_UNSUPPORTED_PROTOCOL

Protocole non supporté. L'URL utilise un protocole pour lequel curl n'a pas été compilé.

3CURLE_URL_MALFORMAT

URL malformée. La syntaxe de l'URL est invalide ou n'a pas pu être analysée.

5CURLE_COULDNT_RESOLVE_PROXY

Impossible de résoudre le proxy. Le nom d'hôte du proxy spécifié n'a pas pu être résolu.

6CURLE_COULDNT_RESOLVE_HOST

La recherche DNS a échoué — le nom d'hôte n'a pas pu être résolu en adresse IP.

7CURLE_COULDNT_CONNECT

La connexion TCP a échoué — le serveur est arrêté, le port est bloqué ou le pare-feu rejette les connexions.

18CURLE_PARTIAL_FILE

Fichier partiel. Le transfert a été interrompu et seule une partie du fichier a été reçue.

22CURLE_HTTP_RETURNED_ERROR

Le serveur a retourné une erreur HTTP (4xx/5xx) et le flag --fail était utilisé.

23CURLE_WRITE_ERROR

Erreur d'écriture. curl n'a pas pu écrire les données reçues sur le disque (permission refusée ou disque plein).

28CURLE_OPERATION_TIMEDOUT

L'opération a dépassé le temps maximum autorisé (DNS, connexion ou transfert).

35CURLE_SSL_CONNECT_ERROR

Le handshake SSL/TLS a échoué — incompatibilité de version de protocole ou de suite de chiffrement.

37CURLE_FILE_COULDNT_READ_FILE

Impossible de lire le fichier. Un fichier local référencé dans la requête n'a pas pu être ouvert ou lu.

52CURLE_GOT_NOTHING

Réponse vide du serveur. Le serveur a fermé la connexion sans envoyer aucune donnée.

56CURLE_RECV_ERROR

La connexion a été réinitialisée — le serveur a coupé la connexion pendant le transfert de données.

60CURLE_SSL_CACERT

La vérification du certificat SSL a échoué — expiré, auto-signé ou bundle CA obsolète.

77CURLE_SSL_CACERT_BADFILE

Problème de certificat CA SSL. Impossible de lire ou d'analyser le fichier de certificat CA spécifié.

92CURLE_HTTP2_STREAM

Erreur de flux HTTP/2. Une erreur de protocole HTTP/2 au niveau du flux s'est produite pendant le transfert.

Erreur 6 : Impossible de résoudre l'hôte

Ce que cela signifie
Votre terminal affiche curl: (6) Could not resolve host. curl n'a pas pu résoudre le nom d'hôte en adresse IP — la recherche DNS a échoué avant toute tentative de connexion.
Causes
Les causes les plus courantes sont : une faute de frappe dans le nom d'hôte (par ex. curl https://apiexample.com au lieu de api.example.com), des problèmes de serveur DNS (votre DNS configuré est en panne ou inaccessible), pas de connexion réseau (Wi-Fi déconnecté, VPN non connecté), ou le domaine n'existe réellement pas.
Comment résoudre
D'abord, vérifiez que l'URL est correcte. Puis testez la résolution DNS directement : nslookup api.example.com ou dig api.example.com. Si le DNS échoue, essayez un serveur DNS différent : curl --dns-servers 8.8.8.8 https://api.example.com. Vérifiez votre /etc/resolv.conf ou vos paramètres réseau. Si vous êtes derrière un VPN d'entreprise, assurez-vous que le DNS interne peut résoudre l'hôte.
$ curl https://api.exmple.com/users

Erreur 7 : Échec de connexion

Ce que cela signifie
Votre terminal affiche curl: (7) Failed to connect to host port: Connection refused. curl a résolu le nom d'hôte mais n'a pas pu établir une connexion TCP avec le serveur — la connexion a été activement refusée ou a expiré au niveau TCP.
Causes
Les causes courantes incluent : le serveur est arrêté ou ne fonctionne pas, un pare-feu bloque le port (vérifiez les pare-feu locaux et côté serveur), le port est incorrect (par ex. le service tourne sur 8080 mais vous vous connectez au 443), ou le backlog d'écoute du serveur est plein sous forte charge.
Comment résoudre
Vérifiez que le serveur fonctionne : ping api.example.com et telnet api.example.com 443. Vérifiez si le bon port est ouvert : nmap -p 443 api.example.com. Désactivez temporairement le pare-feu local pour tester. Si vous utilisez Docker, assurez-vous que le port du conteneur est publié. Essayez en mode verbeux : curl -v https://api.example.com pour voir exactement où la connexion échoue.
$ curl https://localhost:8080/api

Erreur 22 : Erreur HTTP retournée

Ce que cela signifie
Votre terminal affiche curl: (22) The requested URL returned error. Le serveur a retourné un code d'état HTTP d'erreur (4xx ou 5xx) et curl a été invoqué avec -f ou --fail, ce qui indique à curl de traiter les erreurs HTTP comme des échecs.
Causes
L'erreur est déclenchée par des codes d'état HTTP comme 400 (Bad Request), 401 (Unauthorized), 403 (Forbidden), 404 (Not Found), ou 500 (Internal Server Error) — mais uniquement lorsque --fail est utilisé. Sans --fail, curl sort avec le code 0 même en cas d'erreurs HTTP. Causes courantes : mauvaise URL, authentification manquante, permissions insuffisantes, ou bugs côté serveur.
Comment résoudre
Exécutez curl sans --fail pour voir le corps complet de la réponse — il contient souvent le message d'erreur réel. Vérifiez le code d'état HTTP : curl -w "%{http_code}" -o /dev/null -s URL. Pour 401/403 : vérifiez votre token d'authentification ou clé API. Pour 404 : revérifiez le chemin de l'URL. Pour 500 : le problème est côté serveur.
$ curl --fail https://api.example.com/nonexistent

Erreur 28 : Opération expirée

Ce que cela signifie
Votre terminal affiche curl: (28) Operation timed out ou curl: (28) Connection timed out. L'opération a pris plus de temps que le temps autorisé. C'est l'erreur curl la plus courante — elle peut survenir lors de la résolution DNS, de la connexion TCP, du handshake SSL ou du transfert de données.
Causes
Les causes typiques incluent : un serveur lent ou surchargé qui ne répond pas à temps, une congestion réseau ou perte de paquets, un pare-feu qui abandonne silencieusement les paquets (pas de rejet, juste du silence), des valeurs de timeout trop strictes définies avec --connect-timeout ou --max-time, ou une mauvaise configuration du proxy causant des délais.
Comment résoudre
Augmentez le timeout : curl --connect-timeout 30 --max-time 120 URL. Utilisez le mode verbeux pour voir où ça bloque : curl -v URL. Testez la latence réseau : ping api.example.com et traceroute api.example.com. Si vous êtes derrière un proxy, essayez de le contourner : curl --noproxy '*' URL. Pour les transferts de gros fichiers, pensez à utiliser --retry 3 avec --retry-delay 5.
$ curl --connect-timeout 5 https://slow-api.example.com/data

Erreur 35 : Erreur de connexion SSL

Ce que cela signifie
Votre terminal affiche curl: (35) SSL connect error. Le handshake SSL/TLS a échoué — curl n'a pas pu établir une connexion sécurisée avec le serveur.
Causes
Causes courantes : incompatibilité de version TLS (le serveur exige TLS 1.3 mais votre curl ne supporte que TLS 1.2), incompatibilité de suite de chiffrement, mauvaise configuration SSL du serveur (certificat expiré présenté lors du handshake, chaîne incomplète), le serveur ne supporte pas réellement HTTPS sur le port donné, ou un proxy ou pare-feu intercepte la connexion SSL (MITM).
Comment résoudre
Forcez une version TLS spécifique : curl --tlsv1.2 URL ou curl --tlsv1.3 URL. Vérifiez ce que le serveur supporte : openssl s_client -connect api.example.com:443. Mettez à jour curl et OpenSSL vers les dernières versions. Si le serveur utilise un certificat auto-signé, c'est généralement l'erreur 60 — l'erreur 35 indique typiquement un échec de handshake au niveau du protocole.
$ curl https://legacy-server.example.com/api

Erreur 56 : Échec de réception — Connexion réinitialisée

Ce que cela signifie
Votre terminal affiche curl: (56) Recv failure: Connection reset by peer. La connexion a été établie avec succès, mais la réception des données a échoué — le serveur a fermé ou réinitialisé la connexion de manière inattendue pendant le transfert.
Causes
Cela arrive souvent quand : le serveur plante ou redémarre en cours de transfert, un load balancer ou proxy coupe la connexion (timeout d'inactivité, requête trop volumineuse), un pare-feu termine les connexions de longue durée, le serveur a un timeout keep-alive plus court que prévu, ou il y a une perturbation réseau entre le client et le serveur.
Comment résoudre
Réessayez la requête — les problèmes réseau transitoires sont la cause la plus courante. Utilisez le mode verbeux : curl -v URL pour voir le point exact de l'échec. Si l'erreur survient lors de gros uploads, essayez le transfert par morceaux : curl -H "Transfer-Encoding: chunked" URL. Pour les opérations Git affichant RPC failed; curl 56, augmentez le tampon : git config http.postBuffer 524288000.
$ curl https://api.example.com/large-download

Erreur 60 : Problème de certificat SSL

Ce que cela signifie
Votre terminal affiche curl: (60) SSL certificate problem: unable to get local issuer certificate. curl n'a pas pu vérifier le certificat SSL du serveur par rapport à son bundle CA (Autorité de Certification). Le handshake TLS s'est terminé au niveau du protocole, mais la validation du certificat a échoué.
Causes
Les causes les plus courantes : le serveur utilise un certificat auto-signé, le certificat a expiré, la chaîne de certificats est incomplète (certificats intermédiaires manquants), le bundle CA de curl est obsolète (courant sur les anciens systèmes ou dans les conteneurs Docker), ou le Common Name / SAN du certificat ne correspond pas au nom d'hôte demandé.
Comment résoudre
Mettez à jour le bundle CA : curl --cacert /path/to/cacert.pem URL. Téléchargez un bundle mis à jour depuis https://curl.se/ca/cacert.pem. Pour diagnostiquer : openssl s_client -connect api.example.com:443 -showcerts. Pour les certificats auto-signés en développement, utilisez curl -k URL (jamais en production — cela désactive toute vérification de certificat). Dans Docker, installez le package ca-certificates.
$ curl https://self-signed.example.com/api

Autres codes d'erreur

0CURLE_OK

Succès. L'opération s'est terminée sans aucune erreur.

1CURLE_UNSUPPORTED_PROTOCOL

Protocole non supporté. L'URL utilise un protocole pour lequel curl n'a pas été compilé.

3CURLE_URL_MALFORMAT

URL malformée. La syntaxe de l'URL est invalide ou n'a pas pu être analysée.

5CURLE_COULDNT_RESOLVE_PROXY

Impossible de résoudre le proxy. Le nom d'hôte du proxy spécifié n'a pas pu être résolu.

18CURLE_PARTIAL_FILE

Fichier partiel. Le transfert a été interrompu et seule une partie du fichier a été reçue.

23CURLE_WRITE_ERROR

Erreur d'écriture. curl n'a pas pu écrire les données reçues sur le disque (permission refusée ou disque plein).

37CURLE_FILE_COULDNT_READ_FILE

Impossible de lire le fichier. Un fichier local référencé dans la requête n'a pas pu être ouvert ou lu.

52CURLE_GOT_NOTHING

Réponse vide du serveur. Le serveur a fermé la connexion sans envoyer aucune donnée.

77CURLE_SSL_CACERT_BADFILE

Problème de certificat CA SSL. Impossible de lire ou d'analyser le fichier de certificat CA spécifié.

92CURLE_HTTP2_STREAM

Erreur de flux HTTP/2. Une erreur de protocole HTTP/2 au niveau du flux s'est produite pendant le transfert.

Comment déboguer les erreurs curl

Quand curl échoue, ces trois flags vous aident à identifier rapidement la cause racine — de la résolution DNS au handshake SSL en passant par le contenu de la réponse.

  1. 1

    Activer la sortie verbeuse

    Exécutez curl -v URL pour voir le cycle complet requête/réponse : résolution DNS, connexion TCP, handshake TLS, en-têtes de requête envoyés et en-têtes de réponse reçus. C'est le flag de débogage le plus utile.

  2. 2

    Vérifier le code d'état HTTP

    Exécutez curl -o /dev/null -s -w "%{http_code}" URL pour obtenir uniquement le code d'état HTTP (200, 404, 500, etc.) sans le corps de la réponse. Utile pour les vérifications rapides et les scripts.

  3. 3

    Afficher les erreurs silencieusement

    Exécutez curl -sS URL pour supprimer la barre de progression (-s) tout en continuant d'afficher les erreurs (-S). Parfait pour les scripts où vous voulez une sortie propre mais devez détecter les échecs.

Questions fréquemment posées

Comment vérifier le code de sortie de curl ?

Après avoir exécuté une commande curl, le code de sortie est stocké dans la variable spéciale du shell. En Bash/Zsh, exécutez echo $? immédiatement après la commande curl. En PowerShell, utilisez $LASTEXITCODE. Dans les scripts, vous pouvez le vérifier avec une condition : if curl -sf URL; then echo "OK"; else echo "Failed with code $?"; fi. Le code de sortie 0 signifie succès ; tout autre nombre indique une erreur. Pour voir à la fois le code d'état HTTP et le code de sortie curl, combinez curl -w "%{http_code}" -o /dev/null -s URL; echo "Exit: $?". Notez que le code de sortie de curl est différent du code d'état HTTP — curl retourne 0 même pour un HTTP 404 sauf si vous utilisez le flag --fail.

Comment résoudre l'erreur curl 28 (opération expirée) ?

L'erreur 28 signifie que la requête a dépassé le temps maximum autorisé. D'abord, augmentez le timeout : curl --connect-timeout 30 --max-time 120 URL. Le --connect-timeout limite la phase de connexion TCP, tandis que --max-time limite l'opération entière. Ensuite, diagnostiquez le goulot d'étranglement avec curl -v URL — la sortie verbeuse montre exactement où curl est bloqué (DNS, connexion, TLS ou transfert). Solutions courantes : vérifiez votre connexion réseau et vos paramètres DNS, vérifiez que le serveur répond (ping et telnet), contournez les proxies avec --noproxy '*', et pour les gros téléchargements ajoutez --retry 3 --retry-delay 5 pour les tentatives automatiques.

Comment résoudre les erreurs de certificat SSL curl (erreur 60) ?

L'erreur 60 signifie que curl ne peut pas vérifier le certificat SSL du serveur. La solution dépend de la cause. Pour un bundle CA obsolète : téléchargez-en un nouveau depuis https://curl.se/ca/cacert.pem et utilisez curl --cacert /path/to/cacert.pem URL. Pour les conteneurs Docker : installez le package ca-certificates (apt-get install ca-certificates). Pour les certificats auto-signés en développement : utilisez curl -k URL pour ignorer la vérification — mais n'utilisez jamais -k en production car cela désactive toute vérification de certificat. Pour diagnostiquer : exécutez openssl s_client -connect host:443 -showcerts pour inspecter la chaîne de certificats. Si le certificat a expiré ou si le nom d'hôte ne correspond pas, le problème est côté serveur.

Que signifie l'erreur curl 7 (échec de connexion) ?

L'erreur 7 signifie que curl a résolu le nom d'hôte en adresse IP mais n'a pas pu établir une connexion TCP. Le serveur a activement refusé la connexion ou la tentative de connexion a expiré au niveau réseau. Causes courantes : le service ne fonctionne pas sur l'hôte cible (vérifiez avec systemctl status ou docker ps), un pare-feu bloque le port (testez avec telnet host port), vous utilisez le mauvais port (par ex. 80 au lieu de 443, ou 8080 pour un serveur de développement), ou le backlog d'écoute du serveur est plein sous forte charge. Pour déboguer : utilisez curl -v URL et cherchez « Connected to » ou « Connection refused » dans la sortie.