curl est l’outil de transfert de données le plus répandu dans l’écosystème
DevOps — installé par défaut sur la quasi-totalité des distributions Linux.
Ils est utilisé pour tester une API REST en une ligne, télécharger des fichiers,
automatiser des webhooks ou déboguer des problèmes réseau. Contrairement à
Postman, curl s’exécute directement dans un terminal ou un script shell, ce qui
le rend indispensable dans les pipelines CI/CD et l’administration système.
Cheatsheet curl
Section intitulée « Cheatsheet curl »| Commande | Description |
|---|---|
curl URL | Requête GET simple |
curl -o fichier URL | Télécharger dans un fichier nommé |
curl -O URL | Télécharger en gardant le nom distant |
curl -I URL | Afficher uniquement les en-têtes HTTP |
curl -L URL | Suivre les redirections |
curl -X POST -d "data" URL | Envoyer des données POST |
curl -H "Header: value" URL | Ajouter un en-tête personnalisé |
curl -u user:pass URL | Authentification HTTP Basic |
curl -F "file=@path" URL | Téléverser un fichier (multipart) |
curl -c cookies.txt URL | Sauvegarder les cookies |
curl -b cookies.txt URL | Envoyer les cookies |
curl -w "%{http_code}" URL | Afficher le code HTTP |
curl --silent --fail URL | Mode silencieux pour scripts |
Les fonctionnalités de curl
Section intitulée « Les fonctionnalités de curl »Curl (abréviation de Client URL) est un outil en ligne de commande conçu pour transférer des données vers ou depuis un serveur, en utilisant des protocoles comme HTTP, HTTPS, FTP, SFTP, SCP, LDAP, ou encore SMTP.
Il s’utilise aussi bien pour :
- Télécharger un fichier depuis Internet,
- Tester des points d’accès d’une API REST,
- Soumettre des formulaires HTML,
- Automatiser des transferts de fichiers,
- Effectuer des requêtes HTTP complexes avec headers, authentification ou cookies.
Contrairement à des outils plus lourds comme Postman, curl s’utilise
directement depuis un terminal, dans des scripts, ou au sein de pipelines
DevOps. Sa légèreté et sa compatibilité multi-protocole en font un outil
de diagnostic et d’automatisation redoutablement efficace, que l’on soit
développeur ou administrateur système.
Installation
Section intitulée « Installation »# Version du dépôt (généralement plus ancienne)sudo apt update && sudo apt install -y curl
# Vérifier la versioncurl --versionsudo dnf install -y curlcurl --versionPour obtenir la version 8.18.0 avec toutes les fonctionnalités :
# Dépendancessudo apt install -y build-essential libssl-dev libnghttp2-dev
# Télécharger et compilercd /tmpcurl -LO https://curl.se/download/curl-8.18.0.tar.gztar xzf curl-8.18.0.tar.gzcd curl-8.18.0./configure --with-openssl --prefix=$HOME/.localmake -j$(nproc)make install
# Ajouter au PATHexport PATH="$HOME/.local/bin:$PATH"Vérifiez l’installation :
curl --versioncurl 8.18.0 (x86_64-pc-linux-gnu) libcurl/8.18.0 OpenSSL/3.0.13 zlib/1.3 nghttp2/1.59.0Release-Date: 2026-01-07Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns mqtt pop3 pop3s rtsp smb smbs smtp smtps telnet tftp ws wssFeatures: alt-svc AsynchDNS HSTS HTTP2 HTTPS-proxy IPv6 Largefile libz NTLM SSL threadsafe TLS-SRP UnixSocketsSyntaxe de base
Section intitulée « Syntaxe de base »La commande curl repose sur une structure simple et directe. En version
minimale, elle se compose d’une URL, mais sa puissance vient des nombreuses
options que l’on peut ajouter selon le besoin.
curl [options] [URL]Les options essentielles
Section intitulée « Les options essentielles »Voici les options les plus utilisées pour bien démarrer :
-
-o fichier: enregistre le contenu dans un fichier local nomméfichier.Fenêtre de terminal curl -o page.html https://example.com -
-O: télécharge le fichier en conservant le nom d’origine sur le serveur.Fenêtre de terminal curl -O https://example.com/fichier.zip -
-L: suit automatiquement les redirections HTTP (très utile sur des URLs raccourcies ou déplacées).Fenêtre de terminal curl -L https://example.com/ancien-lien -
-I: affiche uniquement les en-têtes HTTP (headers).Fenêtre de terminal curl -I https://example.com -
-X: spécifie une méthode HTTP (GET, POST, PUT, DELETE…).Fenêtre de terminal curl -X DELETE https://api.example.com/ressource -
-d: envoie des données dans le corps de la requête (POST par défaut).Fenêtre de terminal curl -d "nom=Jean&age=30" https://example.com/formulaire -
-H: ajoute un en-tête personnalisé (ex. JSON, token, cookie…).Fenêtre de terminal curl -H "Content-Type: application/json" https://api.example.com -
-u: utilise une authentification de type HTTP Basic.Fenêtre de terminal curl -u admin:motdepasse https://example.com/admin
Usages courants
Section intitulée « Usages courants »L’un des usages les plus fréquents de curl, c’est le téléchargement de
contenu depuis une URL. Il peut s’agir de pages HTML, d’archives, d’images, ou
de scripts. Voici comment le faire efficacement.
Enregistrer dans un fichier spécifique
Section intitulée « Enregistrer dans un fichier spécifique »Pour télécharger une page ou un fichier et choisir le nom local :
curl -o page.html https://example.com % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed100 513 0 513 0 0 10421 0 0Cela écrit le contenu de la réponse dans un fichier nommé page.html.
Afficher uniquement les en-têtes HTTP
Section intitulée « Afficher uniquement les en-têtes HTTP »L’option -I permet de récupérer les métadonnées sans télécharger le contenu :
curl -I https://example.comHTTP/2 200date: Sat, 24 Jan 2026 08:44:59 GMTcontent-type: text/htmlcf-ray: 9c2e40871e88791b-CDGlast-modified: Fri, 23 Jan 2026 20:51:32 GMTallow: GET, HEADaccept-ranges: bytesage: 3591cf-cache-status: HITserver: cloudflareConserver le nom du fichier distant
Section intitulée « Conserver le nom du fichier distant »Si vous voulez récupérer un fichier en gardant son nom original (extrait de l’URL) :
curl -O https://example.com/script.shCela crée un fichier script.sh dans le répertoire courant.
Suivre les redirections
Section intitulée « Suivre les redirections »Certains liens vous redirigent automatiquement (HTTP 301 ou 302). Sans option,
curl ne les suit pas. Il faut ajouter -L :
curl -LO https://bit.ly/exemple-lienCela permet d’atteindre l’URL finale et de récupérer le bon fichier.
Reprendre un téléchargement interrompu
Section intitulée « Reprendre un téléchargement interrompu »curl peut reprendre un téléchargement si la connexion est interrompue :
curl -C - -O https://example.com/long-fichier.zipL’option -C - détecte la taille du fichier existant et continue depuis là.
Télécharger plusieurs fichiers
Section intitulée « Télécharger plusieurs fichiers »Utilisez plusieurs options -O :
curl -O https://site1.com/fichier1.txt -O https://site2.com/fichier2.jpgOu utilisez une boucle shell pour automatiser :
for url in $(cat urls.txt); do curl -O "$url"; doneEnvoi de requêtes HTTP
Section intitulée « Envoi de requêtes HTTP »curl est aussi un outil puissant pour interagir avec des APIs REST. Il
permet d’envoyer tous types de requêtes HTTP : GET, POST, PUT, DELETE, avec
des données, des en-têtes, ou de l’authentification.
Requête GET (par défaut)
Section intitulée « Requête GET (par défaut) »La méthode GET est celle utilisée par défaut. Elle permet de récupérer des
données sans en envoyer.
curl -s https://httpbin.org/get{ "args": {}, "headers": { "Accept": "*/*", "Host": "httpbin.org", "User-Agent": "curl/8.18.0", "X-Amzn-Trace-Id": "Root=1-69748697-791d1c236921ff1653569139" }, "origin": "86.229.137.201", "url": "https://httpbin.org/get"}Requête POST avec des données simples
Section intitulée « Requête POST avec des données simples »Envoyer des données application/x-www-form-urlencoded :
curl -X POST -d "nom=Alice&age=28" https://api.example.com/inscriptionPar défaut, -d utilise POST, donc -X POST est optionnel ici.
Requête POST avec JSON
Section intitulée « Requête POST avec JSON »Envoyer une charge utile JSON nécessite de définir l’en-tête Content-Type :
curl -s -X POST \ -H "Content-Type: application/json" \ -d '{"email":"test@example.com","password":"1234"}' \ https://httpbin.org/post{ "args": {}, "data": "{\"email\":\"test@example.com\",\"password\":\"1234\"}", "files": {}, "form": {}, "headers": { "Accept": "*/*", "Content-Length": "46", "Content-Type": "application/json", "Host": "httpbin.org", "User-Agent": "curl/8.18.0" }, "json": { "email": "test@example.com", "password": "1234" }, "origin": "86.229.137.201", "url": "https://httpbin.org/post"}Envoyer des données depuis un fichier
Section intitulée « Envoyer des données depuis un fichier »Plutôt que d’inclure le JSON en ligne, utilisez @ pour lire depuis un fichier :
echo '{"nom":"Jean","age":30}' > data.jsoncurl -s -X POST \ -H "Content-Type: application/json" \ -d @data.json \ https://httpbin.org/post{ "data": "{\"nom\":\"Jean\",\"age\":30}", "json": { "age": 30, "nom": "Jean" }}Requête PUT ou DELETE
Section intitulée « Requête PUT ou DELETE »Simuler des requêtes de modification ou suppression :
curl -s -X PUT \ -H "Content-Type: application/json" \ -d '{"status":"actif"}' \ https://httpbin.org/put{ "data": "{\"status\":\"actif\"}", "json": { "status": "actif" }}curl -s -X DELETE https://httpbin.org/delete{ "args": {}, "headers": { "Accept": "*/*", "Host": "httpbin.org", "User-Agent": "curl/8.18.0" }, "json": null}Envoi de plusieurs en-têtes
Section intitulée « Envoi de plusieurs en-têtes »Vous pouvez envoyer plusieurs headers HTTP personnalisés :
curl -s \ -H "Authorization: Bearer mon_token_secret" \ -H "Accept: application/json" \ https://httpbin.org/headers{ "headers": { "Accept": "application/json", "Authorization": "Bearer mon_token_secret", "Host": "httpbin.org", "User-Agent": "curl/8.18.0" }}Authentification
Section intitulée « Authentification »De nombreuses APIs ou serveurs exigent une authentification pour accéder à leurs
ressources. curl prend en charge plusieurs méthodes : HTTP Basic, token
Bearer, ou encore authentification FTP/SFTP.
Authentification HTTP Basic
Section intitulée « Authentification HTTP Basic »C’est la forme la plus simple, où l’on transmet un nom d’utilisateur et un mot de passe encodés en base64 :
curl -s -u testuser:testpass https://httpbin.org/basic-auth/testuser/testpass{ "authenticated": true, "user": "testuser"}Cette méthode fonctionne pour les APIs ou interfaces d’administration protégées par une fenêtre d’identification classique dans le navigateur.
Authentification via en-tête Bearer (token)
Section intitulée « Authentification via en-tête Bearer (token) »De nombreuses APIs modernes utilisent un jeton d’authentification (JWT ou
autre) à inclure dans l’en-tête HTTP Authorization :
curl -H "Authorization: Bearer VOTRE_TOKEN" https://api.example.com/profilCe type de jeton est souvent obtenu via une requête POST en échange
d’identifiants (flow OAuth ou authentification custom).
Authentification avec fichiers de configuration
Section intitulée « Authentification avec fichiers de configuration »Pour éviter de taper ses identifiants en clair ou d’utiliser des tokens en ligne
de commande, curl permet de stocker des options dans un fichier :
Exemple : curl.conf
--user utilisateur:motdepasse--url https://api.example.com/securiseEt pour l’utiliser :
curl -K curl.confAuthentification FTP ou SFTP
Section intitulée « Authentification FTP ou SFTP »curl peut aussi s’authentifier à un serveur FTP :
curl -u ftpuser:ftppass ftp://ftp.example.com/fichier.txtOu en SFTP :
curl -u user:sftpmdp sftp://serveur.example.com/dossier/Utilisation avec FTP/SFTP
Section intitulée « Utilisation avec FTP/SFTP »La commande curl permet également de transférer des fichiers via les
protocoles FTP et SFTP, en lecture comme en écriture. C’est très utile pour
automatiser des transferts vers des serveurs distants, des sauvegardes ou des
publications.
Télécharger un fichier via FTP
Section intitulée « Télécharger un fichier via FTP »Pour récupérer un fichier depuis un serveur FTP :
curl -u utilisateur:motdepasse ftp://ftp.example.com/fichier.txt -O-u: fournit les identifiantsftp://: spécifie le protocole-O: conserve le nom du fichier d’origine
Téléverser un fichier via FTP
Section intitulée « Téléverser un fichier via FTP »Pour envoyer un fichier vers un serveur FTP :
curl -T monfichier.txt -u utilisateur:motdepasse ftp://ftp.example.com/-T: indique le fichier à téléverser
Téléverser un fichier via SFTP
Section intitulée « Téléverser un fichier via SFTP »Même principe que pour FTP, mais avec un protocole sécurisé :
curl -T fichier.txt -u user:motdepasse sftp://sftp.example.com/chemin/Lister le contenu d’un répertoire FTP
Section intitulée « Lister le contenu d’un répertoire FTP »Pour obtenir la liste des fichiers d’un répertoire distant :
curl -u utilisateur:motdepasse ftp://ftp.example.com/Cela renvoie une vue brute du contenu du répertoire cible.
Ajouter un port personnalisé
Section intitulée « Ajouter un port personnalisé »Si le serveur n’utilise pas les ports standards :
curl -u user:pass ftp://ftp.example.com:2121/fichier.txt -OTéléversement de fichiers
Section intitulée « Téléversement de fichiers »Avec curl, il est aussi possible de téléverser (uploader) des fichiers
vers un serveur, notamment via des formulaires HTML (en multipart/form-data)
ou via FTP/SFTP.
Téléverser un fichier avec POST (multipart/form-data)
Section intitulée « Téléverser un fichier avec POST (multipart/form-data) »Pour simuler l’envoi d’un fichier depuis un formulaire HTML :
echo "fichier test upload" > upload.txtcurl -s -F "file=@upload.txt" https://httpbin.org/post{ "files": { "file": "fichier test upload\n" }, "headers": { "Content-Type": "multipart/form-data; boundary=------------------------ym8RxeZV33VnKHabQKinXP", "User-Agent": "curl/8.18.0" }}-F: envoie les données comme un formulaire@: indique que le contenu du fichier doit être envoyé
Téléverser plusieurs fichiers en une seule requête
Section intitulée « Téléverser plusieurs fichiers en une seule requête »On peut envoyer plusieurs champs, y compris plusieurs fichiers :
curl -F "photo1=@image1.jpg" -F "photo2=@image2.jpg" https://example.com/galerieEt aussi ajouter des champs texte en même temps :
curl -F "titre=Vacances" -F "photo=@plage.jpg" https://example.com/albumTéléversement via PUT (API REST)
Section intitulée « Téléversement via PUT (API REST) »Certaines APIs acceptent l’envoi de fichiers via une méthode PUT :
curl -T script.sh -X PUT https://api.example.com/scripts/Vous pouvez aussi définir un en-tête MIME spécifique :
curl -T data.csv -H "Content-Type: text/csv" https://api.example.com/donneesUtilisation avancée
Section intitulée « Utilisation avancée »Au-delà des requêtes simples, curl offre des options puissantes pour des
usages plus complexes : proxy, user-agent, cookies, debug, configuration,
etc.
Utiliser un proxy
Section intitulée « Utiliser un proxy »Pour faire passer une requête par un serveur proxy HTTP :
curl -x http://proxy.mondomaine.local:3128 https://example.comEt pour un proxy avec authentification :
curl -x http://proxy:port -U utilisateur:motdepasse https://example.comSpécifier un User-Agent personnalisé
Section intitulée « Spécifier un User-Agent personnalisé »Certains serveurs répondent différemment selon le navigateur simulé. Pour changer l’identifiant du client :
curl -s -A "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36" \ https://httpbin.org/user-agent{ "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36"}Gérer les cookies
Section intitulée « Gérer les cookies »-
Enregistrer les cookies dans un fichier :
Fenêtre de terminal curl -s -c cookies.txt -L https://httpbin.org/cookies/set/session/abc123 -
Vérifier le fichier cookies :
Fenêtre de terminal cat cookies.txtSortie # Netscape HTTP Cookie Filehttpbin.org FALSE / FALSE 0 session abc123 -
Réutiliser les cookies :
Fenêtre de terminal curl -s -b cookies.txt https://httpbin.org/cookiesSortie {"cookies": {"session": "abc123"}}
Afficher les métriques de la requête
Section intitulée « Afficher les métriques de la requête »L’option -w (write-out) permet d’extraire des métriques :
curl -s -w "\n--- Métriques ---\nCode HTTP: %{http_code}\nTemps total: %{time_total}s\nTaille: %{size_download} octets\n" \ -o /dev/null https://example.com--- Métriques ---Code HTTP: 200Temps total: 0.074715sTaille: 513 octetsLimiter le débit
Section intitulée « Limiter le débit »Simuler une connexion lente avec --limit-rate :
curl --limit-rate 100k -O https://example.com/film.mp4Utiliser un fichier de configuration
Section intitulée « Utiliser un fichier de configuration »Vous pouvez enregistrer les options curl dans un fichier texte :
options.conf :
--user utilisateur:mdp--header "Accept: application/json"--url https://api.example.com/dataEt exécuter :
curl -K options.confBonnes pratiques
Section intitulée « Bonnes pratiques »Pour tirer le meilleur parti de curl, adoptez ces habitudes qui rendent vos
commandes plus sûres, plus lisibles et plus réutilisables.
Toujours vérifier la version installée
Section intitulée « Toujours vérifier la version installée »Certaines fonctionnalités peuvent ne pas être disponibles dans les versions plus anciennes :
curl --versionCela vous donne aussi les protocoles pris en charge (HTTP/2, SSL, etc.).
Utiliser --silent pour les scripts automatisés
Section intitulée « Utiliser --silent pour les scripts automatisés »Pour éviter le bruit dans les scripts (barres de progression ou erreurs mineures) :
curl --silent --fail --show-error -o fichier.txt https://example.com--silent: supprime la sortie normale--fail: renvoie une erreur si le HTTP code ≥ 400--show-error: affiche les erreurs s’il y en a
Préférer les fichiers de configuration pour les commandes longues
Section intitulée « Préférer les fichiers de configuration pour les commandes longues »Plutôt que de taper une commande de 5 lignes, placez les options dans un fichier
curl.conf et lancez :
curl -K curl.confC’est plus lisible, versionnable et facile à relire.
Toujours spécifier les en-têtes explicitement pour les API
Section intitulée « Toujours spécifier les en-têtes explicitement pour les API »De nombreuses APIs nécessitent Content-Type: application/json. Soyez explicite
:
curl -H "Content-Type: application/json" ...Ne jamais exposer de mots de passe dans des scripts partagés
Section intitulée « Ne jamais exposer de mots de passe dans des scripts partagés »Évitez les identifiants en dur dans les lignes de commande. Utilisez des variables d’environnement ou des fichiers sécurisés :
curl -u "$USER:$MDP" ...Ou encore :
source .env && curl -u "$FTP_USER:$FTP_PASS" ...Dépannage
Section intitulée « Dépannage »| Problème | Cause probable | Solution |
|---|---|---|
curl: (6) Could not resolve host | DNS ou nom de domaine incorrect | Vérifier l’URL et la connexion réseau |
curl: (7) Failed to connect | Port fermé ou firewall | Vérifier que le service écoute |
curl: (35) SSL connect error | Certificat invalide ou expiré | Ajouter --insecure (dev uniquement) ou mettre à jour ca-certificates |
curl: (51) SSL peer certificate | Nom de domaine ne correspond pas | Vérifier le CN du certificat |
curl: (56) Recv failure | Connexion interrompue | Réessayer avec -C - pour reprendre |
| HTTP 401 Unauthorized | Token ou credentials invalides | Vérifier -u ou header Authorization |
| HTTP 403 Forbidden | Permissions insuffisantes | Vérifier les droits d’accès |
| HTTP 429 Too Many Requests | Rate limiting | Ajouter un délai entre les requêtes |
Contrôle de connaissances
Section intitulée « Contrôle de connaissances »Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
À retenir
Section intitulée « À retenir »curltransfère des données via 25+ protocoles (HTTP, FTP, SFTP, etc.)- L’option
-oenregistre dans un fichier,-Oconserve le nom distant -Iaffiche les en-têtes HTTP,-Lsuit les redirections- Pour les APIs :
-Xdéfinit la méthode,-Hajoute des headers,-denvoie des données -u user:passpour l’auth Basic,-H "Authorization: Bearer TOKEN"pour les tokens-F "file=@chemin"téléverse des fichiers en multipart--silent --fail --show-errorpour une utilisation dans les scripts- Mettez à jour vers 8.18.0 pour corriger 6 CVE de sécurité
- Utilisez des variables d’environnement pour les credentials sensibles
Prochaines étapes
Section intitulée « Prochaines étapes »Ressources
Section intitulée « Ressources »- Site officiel : curl.se
- Documentation : curl.se/docs
- Changelog 8.18.0 : curl.se/changes.html
- CVE curl : curl.se/docs/security.html
FAQ - Questions Fréquemment Posées
Section intitulée « FAQ - Questions Fréquemment Posées »Définition
curl (Client URL) est un outil CLI universel de transfert de données supportant 25+ protocoles, principalement utilisé pour interactions HTTP(S) et APIs REST.
| Caractéristique | Description |
|---|---|
| Type | Client transfert multi-protocoles |
| Protocoles | HTTP, HTTPS, FTP, SFTP, SCP, SMTP, POP3, IMAP, LDAP... |
| Usage principal | APIs REST, téléchargements, webhooks |
| Authentification | Basic, Digest, Bearer, OAuth, certificats |
| Format sortie | Texte brut, JSON, XML, binaire |
| Cross-platform | Linux, macOS, Windows, Docker |
Protocoles supportés
# HTTP/HTTPS (APIs)
curl https://api.github.com/users/octocat
# FTP (téléchargement)
curl ftp://ftp.example.com/fichier.txt -u user:pass
# SMTP (envoi email)
curl smtp://smtp.gmail.com:587 --mail-from user@example.com
# LDAP (annuaire)
curl ldap://ldap.example.com/ou=users,dc=example,dc=com
Cas d'usage DevOps
- Healthchecks : Vérifier disponibilité services
- Webhooks : Déclencher CI/CD (GitLab/GitHub)
- APIs : Terraform, Kubernetes, Vault, Consul
- Monitoring : Métriques Prometheus, logs Loki
- Automation : Scripts bash, Ansible, Docker
Contexte : Indispensable pour automatisation, tests APIs, intégration continue.
Usages par catégorie
| Catégorie | Cas d'usage | Exemple |
|---|---|---|
| APIs REST | CRUD opérations | curl -X POST -d '{"name":"test"}' api.com/users |
| Téléchargements | Fichiers, releases | curl -LO https://get.k8s.io/v1.28.0/kubectl |
| Healthchecks | Monitoring services | curl -f http://app:8080/health || alert |
| Webhooks | CI/CD triggers | curl -X POST -H "Token: xxx" gitlab.com/hook |
| Upload | Artifacts, images | curl -F "file=@build.tar.gz" registry.com/upload |
| Debug HTTP | Headers, redirects | curl -vL https://site.com |
Exemples pratiques
# 1. Test API REST
curl -H "Accept: application/json" \
-H "Authorization: Bearer TOKEN" \
https://api.example.com/v1/users
# 2. POST JSON
curl -X POST \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"secret"}' \
https://api.com/login
# 3. Healthcheck automatique
curl -f -s -o /dev/null http://app:8080/health
if [ $? -eq 0 ]; then echo "OK"; else echo "DOWN"; fi
# 4. Téléchargement avec reprise
curl -C - -O https://releases.ubuntu.com/22.04/ubuntu.iso
# 5. Webhook CI/CD GitLab
curl -X POST -F token=TOKEN -F ref=main \
https://gitlab.com/api/v4/projects/123/trigger/pipeline
DevOps : curl = couteau suisse HTTP pour scripts, CI/CD, K8s, Terraform.
Syntaxe générale
curl [OPTIONS] [URL]
Options fondamentales
| Option | Signification | Usage |
|---|---|---|
-X METHOD |
Méthode HTTP | -X POST, -X DELETE |
-H "Header" |
En-tête custom | -H "Content-Type: application/json" |
-d DATA |
Données POST | -d "key=value" |
-o FILE |
Sortie vers fichier | -o download.zip |
-O |
Nom fichier distant | Garde nom original URL |
-L |
Follow redirects | Suit redirections 3xx |
-s |
Silent | Pas de progress bar |
-f |
Fail silently | Code erreur si HTTP 4xx/5xx |
-v |
Verbose | Détails debug |
Méthodes HTTP
# GET (défaut)
curl https://api.com/users
# POST
curl -X POST -d "name=test" https://api.com/users
# PUT
curl -X PUT -d "name=updated" https://api.com/users/1
# DELETE
curl -X DELETE https://api.com/users/1
# PATCH
curl -X PATCH -d "email=new@example.com" https://api.com/users/1
Combinaisons courantes
# API REST avec auth
curl -H "Authorization: Bearer TOKEN" \
-H "Accept: application/json" \
https://api.example.com/v1/data
# POST JSON
curl -X POST \
-H "Content-Type: application/json" \
-d '{"key":"value"}' \
https://api.com/endpoint
# Téléchargement avec redirect
curl -LO https://github.com/org/repo/releases/latest/download/file.tar.gz
# Healthcheck script
curl -fs http://localhost:8080/health > /dev/null
# Timeout (30s max)
curl --max-time 30 https://slow-api.com
Téléchargement basique
# -O : garde nom fichier distant
curl -O https://example.com/fichier.zip
# -o : nom personnalisé
curl -o mon_fichier.zip https://example.com/download
Options téléchargement
| Option | Effet | Exemple |
|---|---|---|
-O |
Nom original URL | curl -O https://site.com/file.tar.gz |
-o FILE |
Nom custom | curl -o backup.tar.gz https://site.com/data |
-C - |
Reprendre téléchargement | curl -C - -O https://site.com/big.iso |
-L |
Suivre redirects | curl -LO https://github.com/org/latest |
--limit-rate |
Limite vitesse | curl --limit-rate 1M -O https://... |
Exemples pratiques
# Kubernetes kubectl
curl -LO https://dl.k8s.io/release/v1.28.0/bin/linux/amd64/kubectl
# Avec progression
curl -# -O https://releases.ubuntu.com/22.04/ubuntu.iso
# Reprise après coupure
curl -C - -O https://example.com/big-file.tar.gz
# Limite bande passante (500 Ko/s)
curl --limit-rate 500k -O https://cdn.com/video.mp4
# Multiples fichiers
curl -O https://site.com/file[1-10].txt
Avec authentification
# HTTP Basic
curl -u user:pass -O https://secure.com/file.zip
# Token Bearer
curl -H "Authorization: Bearer TOKEN" \
-O https://api.com/download/file.tar.gz
DevOps : Télécharger binaires (Terraform, Helm, kubectl), artifacts CI/CD, releases GitHub.
Envoi POST données
# Données form-urlencoded (défaut)
curl -d "name=Jean&email=jean@example.com" https://api.com/users
# JSON
curl -X POST \
-H "Content-Type: application/json" \
-d '{"name":"Jean","email":"jean@example.com"}' \
https://api.com/users
# Depuis fichier
curl -d @data.json -H "Content-Type: application/json" https://api.com/endpoint
Formats données
| Format | Option | Exemple |
|---|---|---|
| Form URL | -d |
curl -d "key=value" URL |
| JSON | -d + header |
curl -H "Content-Type: application/json" -d '{...}' URL |
| Multipart | -F |
curl -F "field=value" -F "file=@path" URL |
| XML | -d + header |
curl -H "Content-Type: text/xml" -d '<xml>...</xml>' URL |
| Fichier | @file |
curl -d @payload.json URL |
Exemples APIs
# Login API
curl -X POST \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"secret"}' \
https://api.example.com/auth/login
# Webhook GitLab
curl -X POST \
-F "token=PIPELINE_TOKEN" \
-F "ref=main" \
-F "variables[DEPLOY_ENV]=production" \
https://gitlab.com/api/v4/projects/123/trigger/pipeline
# Kubernetes API
curl -X POST \
-H "Authorization: Bearer K8S_TOKEN" \
-H "Content-Type: application/json" \
-d '{"apiVersion":"v1","kind":"Pod",...}' \
https://k8s-api:6443/api/v1/namespaces/default/pods
Astuce : -d implique POST automatiquement (pas besoin -X POST).
Option -L (Location)
# Suit redirections automatiquement
curl -L https://example.com
# Avec téléchargement
curl -LO https://github.com/org/repo/releases/latest/download/file.tar.gz
Fonctionnement redirections
# SANS -L : s'arrête au 301/302
$ curl https://git.io/short-url
<html><body>You are being redirected...</body></html>
# AVEC -L : suit jusqu'au contenu final
$ curl -L https://git.io/short-url
[contenu réel du fichier]
Options combinées
| Commande | Effet |
|---|---|
curl -L URL |
Suit redirects basique |
curl -LI URL |
Headers finaux après redirects |
curl -Lv URL |
Verbose (voir chaîne redirections) |
curl -L --max-redirs 5 URL |
Max 5 redirections |
Cas d'usage
# GitHub releases (redirection vers CDN)
curl -LO https://github.com/kubernetes/kubectl/releases/latest/download/kubectl
# URL raccourcies
curl -L https://bit.ly/example > page.html
# Analyser redirections
curl -Lv https://shortened-url.com 2>&1 | grep '< Location:'
# Limiter redirections (sécurité)
curl -L --max-redirs 3 https://suspect-url.com
Debug redirections
# Voir toutes les étapes
curl -Lv https://t.co/shorturl 2>&1 | grep -E '^(>|<) (GET|HTTP|Location)'
# Sortie exemple :
> GET /shorturl HTTP/1.1
< HTTP/1.1 301 Moved Permanently
< Location: https://destination.com/page
> GET /page HTTP/1.1
< HTTP/1.1 200 OK
Sécurité : Utiliser --max-redirs pour éviter boucles infinies.
Méthodes authentification
| Type | Syntaxe | Usage |
|---|---|---|
| HTTP Basic | -u user:pass |
APIs simples |
| Bearer Token | -H "Authorization: Bearer TOKEN" |
APIs REST modernes |
| API Key | -H "X-API-Key: KEY" |
Services cloud |
| OAuth | -H "Authorization: OAuth ..." |
Applications tierces |
| Certificat | --cert client.pem --key key.pem |
mTLS |
HTTP Basic Auth
# Inline
curl -u admin:password https://api.example.com/users
# Prompt mot de passe (sécurisé)
curl -u admin: https://api.example.com/users
# Enter host password for user 'admin':
# Depuis variable
curl -u "$USER:$PASS" https://api.com/endpoint
Bearer Token
# Standard OAuth/JWT
curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
https://api.example.com/v1/data
# Depuis variable
TOKEN=$(cat ~/.secrets/api-token)
curl -H "Authorization: Bearer $TOKEN" https://api.com/secure
API Key
# Header custom
curl -H "X-API-Key: abc123def456" https://api.service.com/endpoint
# Query parameter
curl "https://api.com/data?api_key=abc123"
Certificats client (mTLS)
# Certificat + clé
curl --cert client.crt --key client.key https://secure-api.com
# Format PEM combiné
curl --cert client.pem https://api.com
# Avec CA custom
curl --cacert ca-bundle.crt --cert client.crt --key client.key https://api.com
Exemples DevOps
# Kubernetes API
curl --cacert /etc/kubernetes/pki/ca.crt \
--cert /etc/kubernetes/pki/apiserver-kubelet-client.crt \
--key /etc/kubernetes/pki/apiserver-kubelet-client.key \
https://kubernetes.default.svc:6443/api/v1/nodes
# HashiCorp Vault
curl -H "X-Vault-Token: hvs.CAESII..." \
https://vault.example.com:8200/v1/secret/data/myapp
# GitLab API
curl -H "PRIVATE-TOKEN: glpat-xxx" \
https://gitlab.com/api/v4/projects
Sécurité : Jamais d'identifiants en clair dans scripts versionnés (utiliser variables ENV).
Upload fichiers
# Formulaire multipart (web upload)
curl -F "file=@image.jpg" https://example.com/upload
# FTP upload
curl -T fichier.txt ftp://ftp.example.com/upload/ -u user:pass
# PUT HTTP
curl -X PUT --data-binary @backup.tar.gz https://storage.com/backups/
Méthodes upload
| Protocole | Syntaxe | Usage |
|---|---|---|
| Multipart | -F "file=@path" |
Formulaires web, APIs |
| FTP/SFTP | -T file |
Serveurs fichiers |
| PUT | -X PUT --data-binary @file |
APIs REST, S3 |
| POST | -d @file |
Webhooks, APIs |
Exemples pratiques
# Upload image vers API
curl -F "photo=@profile.jpg" \
-F "description=Mon avatar" \
-H "Authorization: Bearer TOKEN" \
https://api.example.com/users/me/avatar
# FTP avec structure
curl -T backup-$(date +%F).tar.gz \
ftp://backup.example.com/archives/ \
-u backupuser:password
# S3-compatible (MinIO/Wasabi)
curl -X PUT \
-H "x-amz-acl: private" \
--data-binary @file.zip \
https://bucket.s3.amazonaws.com/path/file.zip
# Multiples fichiers
curl -F "file1=@doc.pdf" \
-F "file2=@image.png" \
https://api.com/batch-upload
Upload avec progression
# Barre progression
curl -# -F "file=@large-video.mp4" https://cdn.com/upload
# Progression détaillée
curl -F "file=@data.tar.gz" \
--progress-bar \
https://storage.com/upload | tee /dev/null
Artifacts CI/CD
# Nexus Repository
curl -u admin:admin123 \
--upload-file target/app-1.0.jar \
https://nexus.example.com/repository/maven-releases/com/app/1.0/
# Artifactory
curl -H "X-JFrog-Art-Api: TOKEN" \
-T build/release.tar.gz \
https://artifactory.com/artifactory/libs-release-local/app/
Limite : Certains serveurs limitent taille (vérifier Content-Length).
Configuration proxy
# HTTP proxy
curl -x http://proxy.local:3128 https://example.com
# Avec authentification
curl -x http://user:pass@proxy.local:8080 https://api.com
# SOCKS5 proxy
curl -x socks5://localhost:1080 https://example.com
Variables environnement
# Configurer proxy global
export http_proxy=http://proxy.company.com:8080
export https_proxy=http://proxy.company.com:8080
export no_proxy=localhost,127.0.0.1,.local
# curl utilise automatiquement
curl https://api.example.com
Types proxy
| Type | Syntaxe | Port défaut |
|---|---|---|
| HTTP | http://proxy:port |
3128, 8080 |
| HTTPS | https://proxy:port |
3128 |
| SOCKS4 | socks4://proxy:port |
1080 |
| SOCKS5 | socks5://proxy:port |
1080 |
Exceptions (no_proxy)
# Contourner proxy pour certains domaines
curl -x http://proxy:8080 \
--noproxy localhost,192.168.0.0/16,.internal \
https://internal-api.company.local
# Variable environnement
export no_proxy="localhost,127.0.0.1,.local,.internal,10.0.0.0/8"
Cas d'usage entreprise
# Proxy corporate avec auth
curl -x http://employee:password@proxy.corp.com:8080 \
https://registry.hub.docker.com/v2/
# SSH tunnel comme proxy SOCKS
ssh -D 1080 -N bastion.company.com &
curl -x socks5://localhost:1080 https://internal-app.local
# Proxy pour Docker registry
curl -x $HTTP_PROXY \
https://registry.example.com/v2/_catalog
Debug proxy
# Verbose pour voir connexion proxy
curl -vx http://proxy:8080 https://example.com 2>&1 | grep -i proxy
# Tester connectivité proxy
curl -x http://proxy:8080 -I https://www.google.com
Config ~/.curlrc : Ajouter proxy = http://proxy:8080 pour proxy permanent.
Option -I (HEAD request)
# Headers seulement
curl -I https://example.com
# Sortie exemple :
HTTP/2 200
server: nginx
content-type: text/html
content-length: 1256
last-modified: Wed, 08 Jan 2026 10:30:00 GMT
etag: "abc123"
Méthodes affichage headers
| Commande | Effet |
|---|---|
curl -I URL |
HEAD request (headers seuls) |
curl -i URL |
Headers + body |
curl -v URL |
Headers + debug complet |
curl -D headers.txt URL |
Sauvegarde headers dans fichier |
Cas d'usage
# Vérifier code HTTP
curl -I -s https://api.com/health | head -1
# HTTP/2 200
# Extraire header spécifique
curl -I https://example.com 2>/dev/null | grep -i content-type
# content-type: application/json
# Tester redirections
curl -IL https://short.url | grep -E '^(HTTP|Location):'
# Vérifier cache
curl -I https://cdn.com/image.jpg | grep -i cache-control
Avec authentification
# API avec Bearer token
curl -I -H "Authorization: Bearer TOKEN" https://api.com/endpoint
# Basic auth
curl -I -u user:pass https://secure.example.com/resource
Headers custom
# Ajouter headers à la requête HEAD
curl -I \
-H "Accept: application/json" \
-H "User-Agent: MyScript/1.0" \
https://api.example.com
Scripts monitoring
# Healthcheck avec code HTTP
HTTP_CODE=$(curl -I -s -o /dev/null -w '%{http_code}' https://app.com/health)
if [ "$HTTP_CODE" = "200" ]; then
echo "OK"
else
echo "FAIL: $HTTP_CODE"
fi
# Extraire ETag pour cache
ETAG=$(curl -I -s https://cdn.com/app.js | grep -i etag | cut -d' ' -f2)
echo "Current ETag: $ETAG"
Différence : -I = HEAD request (pas de body), -i = GET avec headers affichés.
Mode verbose (-v)
# Debug complet requête/réponse
curl -v https://api.example.com
# Sortie exemple :
* Trying 93.184.216.34:443...
* Connected to example.com (93.184.216.34) port 443
> GET /api HTTP/1.1
> Host: api.example.com
> User-Agent: curl/7.68.0
> Accept: */*
< HTTP/1.1 200 OK
< Content-Type: application/json
< Content-Length: 234
{"status":"ok"}
Symboles verbose
| Symbole | Signification |
|---|---|
* |
Informations connexion |
> |
Headers ENVOYÉS |
< |
Headers REÇUS |
{ |
Données envoyées |
} |
Données reçues |
Niveaux debug
# Verbose standard
curl -v https://api.com
# Trace complet (encore plus détaillé)
curl --trace trace.txt https://api.com
# Trace ASCII lisible
curl --trace-ascii trace-ascii.txt https://api.com
Cas d'usage debug
# Vérifier headers envoyés
curl -v -H "Authorization: Bearer TOKEN" https://api.com 2>&1 | grep '^>'
# Analyser négociation SSL
curl -v https://secure-api.com 2>&1 | grep -E 'SSL|TLS'
# Identifier redirections
curl -vL https://short.url 2>&1 | grep -E '^(>|<) (GET|HTTP|Location)'
# Debug timeout
curl -v --connect-timeout 5 https://slow-api.com
Redirection stderr
# Verbose vers fichier (stdout = réponse)
curl -v https://api.com 2> debug.log > response.json
# Analyser seulement verbose
curl -v https://api.com 2>&1 >/dev/null | grep '^[*><]'
Exemples production
# Debug webhook qui échoue
curl -v -X POST \
-H "Content-Type: application/json" \
-d '{"event":"deploy"}' \
https://webhook.example.com/trigger 2>&1 | tee webhook-debug.log
# Vérifier certificat SSL
curl -v https://expired-cert.com 2>&1 | grep -A 5 'SSL certificate'
# Analyser performance
curl -v -w '\nTime: %{time_total}s\n' https://api.com
Alternative silencieuse
# Inverse de -v : mode silencieux complet
curl -s https://api.com # Pas de progress, pas de verbose
# Silent avec fail
curl -sf https://api.com/health || echo "API DOWN"
Usage : -v indispensable pour debug APIs, SSL, auth, timeouts.
Option --limit-rate
# Limite en kilobytes/sec
curl --limit-rate 100k -O https://example.com/film.mp4
# Limite en megabytes/sec
curl --limit-rate 2M -O https://cdn.com/ubuntu.iso
Unités supportées
| Unité | Signification | Exemple |
|---|---|---|
k ou K |
Kilobytes/s | --limit-rate 500k = 500 Ko/s |
m ou M |
Megabytes/s | --limit-rate 5M = 5 Mo/s |
g ou G |
Gigabytes/s | --limit-rate 1G = 1 Go/s |
| (nombre seul) | Bytes/s | --limit-rate 51200 = 50 Ko/s |
Cas d'usage
# Backup sans saturer réseau
curl --limit-rate 1M -O https://backup.com/database-dump.tar.gz
# Téléchargement heures bureau (priorité basse)
curl --limit-rate 200k -C - -O https://releases.ubuntu.com/22.04/ubuntu.iso
# Multiples fichiers limités
for file in file{1..10}.zip; do
curl --limit-rate 500k -O https://cdn.com/$file
done
Avec progression
# Voir vitesse réelle
curl --limit-rate 1M -# -O https://example.com/large-file.tar.gz
# Progress détaillé
curl --limit-rate 500k -O https://cdn.com/video.mp4
# Output montre ~500 Ko/s max
Script dynamique
#!/bin/bash
# Limite selon heure
heure=$(date +%H)
if [ $heure -ge 9 ] && [ $heure -le 18 ]; then
# Heures bureau : 500 Ko/s
rate="500k"
else
# Nuit : illimité
rate="100M"
fi
curl --limit-rate $rate -O https://backup.com/file.tar.gz
Combinaison options
# Limite + reprise + redirect
curl --limit-rate 1M -C - -LO https://releases.ubuntu.com/22.04/ubuntu.iso
# Limite + timeout
curl --limit-rate 500k --max-time 3600 -O https://cdn.com/big.zip
Note : Limite s'applique en moyenne (peut fluctuer légèrement).
Sauvegarde et réutilisation
# Sauvegarder cookies
curl -c cookies.txt https://app.com/login
# Réutiliser cookies
curl -b cookies.txt https://app.com/dashboard
# Les deux (save + load)
curl -b cookies.txt -c cookies.txt https://app.com/page
Options cookies
| Option | Effet | Exemple |
|---|---|---|
-c FILE |
Write cookies → fichier | curl -c jar.txt URL |
-b FILE |
Read cookies ← fichier | curl -b jar.txt URL |
-b "NAME=value" |
Cookie inline | curl -b "session=abc123" URL |
-j/--junk-session-cookies |
Ignorer cookies session | Relance propre |
Workflow session
# 1. Login (récupère cookie session)
curl -c cookies.txt \
-d "username=admin&password=secret" \
https://app.com/login
# 2. Actions authentifiées
curl -b cookies.txt https://app.com/api/users
curl -b cookies.txt https://app.com/api/settings
# 3. Logout
curl -b cookies.txt -c cookies.txt https://app.com/logout
Format fichier cookies (Netscape)
# Netscape HTTP Cookie File
.example.com TRUE / FALSE 1735689600 session_id abc123def456
.example.com TRUE / FALSE 0 user_pref theme=dark
Cookies inline
# Single cookie
curl -b "session=xyz789" https://api.com/data
# Multiple cookies
curl -b "session=xyz; user_id=42; theme=dark" https://app.com
# Header manuel (équivalent)
curl -H "Cookie: session=xyz; user_id=42" https://app.com
Cas d'usage DevOps
# Jenkins API avec crumb
CRUMB=$(curl -c jenkins-cookies.txt -s \
'http://jenkins:8080/crumbIssuer/api/json' \
| jq -r '.crumb')
curl -b jenkins-cookies.txt \
-H "Jenkins-Crumb: $CRUMB" \
-X POST http://jenkins:8080/job/myjob/build
# Application web avec CSRF
curl -c cookies.txt https://app.com/form
CSRF=$(grep csrf_token cookies.txt | cut -f7)
curl -b cookies.txt -d "csrf=$CSRF&data=value" https://app.com/submit
Cookies + redirects
# Suivre redirects avec cookies
curl -L -b cookies.txt -c cookies.txt https://app.com/login-redirect
Sécurité : Protéger fichiers cookies (chmod 600 cookies.txt), contiennent sessions actives.
Bonnes pratiques sécurité
# ❌ JAMAIS en clair dans scripts
curl -u admin:P@ssw0rd https://api.com # DANGER!
# ✅ Variables environnement
export API_USER="admin"
export API_PASS="secret"
curl -u "$API_USER:$API_PASS" https://api.com
# ✅ Fichier credentials protégé
chmod 600 ~/.api-credentials
source ~/.api-credentials # Export USER/PASS
curl -u "$API_USER:$API_PASS" https://api.com
Méthodes sécurisées
| Méthode | Sécurité | Usage |
|---|---|---|
| Fichier .env | ⭐⭐⭐ | source .env && curl -u "$USER:$PASS" |
| Prompt interactif | ⭐⭐⭐⭐ | read -sp "Password: " PASS |
| Vault (Hashicorp) | ⭐⭐⭐⭐⭐ | vault kv get secret/api |
| Secrets Manager | ⭐⭐⭐⭐⭐ | AWS/Azure/GCP Secrets |
| Tokens courte durée | ⭐⭐⭐⭐ | OAuth, JWT avec expiration |
Prompt sécurisé
#!/bin/bash
# Demander mot de passe sans écho
read -sp "API Password: " API_PASS
echo
curl -u "admin:$API_PASS" https://api.example.com/data
# Nettoyer variable
unset API_PASS
Fichier credentials
# ~/.api-credentials (chmod 600)
export API_TOKEN="eyJhbGciOiJIUzI1NiIs..."
export DB_PASSWORD="secret123"
# Script
#!/bin/bash
set -a # Auto-export
source ~/.api-credentials
set +a
curl -H "Authorization: Bearer $API_TOKEN" https://api.com
HashiCorp Vault
# Récupérer secret dynamiquement
API_TOKEN=$(vault kv get -field=token secret/api/production)
curl -H "Authorization: Bearer $API_TOKEN" \
https://api.example.com/secure
# Nettoyer
unset API_TOKEN
Secrets cloud
# AWS Secrets Manager
API_KEY=$(aws secretsmanager get-secret-value \
--secret-id prod/api/key \
--query SecretString --output text)
curl -H "X-API-Key: $API_KEY" https://api.com
# Azure Key Vault
TOKEN=$(az keyvault secret show \
--vault-name myVault \
--name api-token \
--query value -o tsv)
curl -H "Authorization: Bearer $TOKEN" https://api.com
CI/CD sécurisé
# GitLab CI (.gitlab-ci.yml)
deploy:
script:
- curl -H "Authorization: Bearer $API_TOKEN" https://api.com/deploy
variables:
API_TOKEN: $CI_API_TOKEN # Variable protégée GitLab
# GitHub Actions
- name: Deploy
run: |
curl -H "Authorization: Bearer ${{ secrets.API_TOKEN }}" \
https://api.example.com/deploy
Checklist sécurité
- ✅ Jamais credentials versionnés Git
- ✅
.envdans.gitignore - ✅ Tokens courte durée (rotation)
- ✅ Variables ENV en CI/CD
- ✅
unsetaprès usage - ✅ Logs sans credentials (
curl -s)
Règle d'or : Aucun secret en clair dans code source.
Option --insecure (-k)
# Accepte certificats SSL invalides
curl --insecure https://self-signed.example.com
# Forme courte
curl -k https://expired-cert.local
Ce que --insecure désactive
| Vérification | Normal | Avec --insecure |
|---|---|---|
| Validité certificat | ✅ Vérifié | ❌ Ignoré |
| Expiration | ✅ Vérifié | ❌ Ignoré |
| Autorité (CA) | ✅ Vérifié | ❌ Ignoré |
| Hostname match | ✅ Vérifié | ❌ Ignoré |
| Révocation | ✅ Vérifié | ❌ Ignoré |
Cas d'usage légitimes
# 1. Développement local (certificat auto-signé)
curl -k https://localhost:8443/api/test
# 2. Environnement test interne
curl -k https://dev-api.internal.local/health
# 3. Debug problème SSL
curl -kv https://problematic-site.com 2>&1 | grep -i ssl
Risques sécurité
⚠️ DANGERS :
- Vulnérable Man-in-the-Middle (MITM)
- Impossible vérifier identité serveur
- Trafic potentiellement intercepté
- Certificats expirés/révoqués acceptés
Alternatives sécurisées
# 1. Certificat CA custom (RECOMMANDÉ)
curl --cacert /path/to/ca-bundle.crt https://internal-api.com
# 2. Ajouter CA au système
sudo cp ca-cert.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
curl https://internal-api.com # Fonctionne sans --insecure
# 3. Variable environnement
export CURL_CA_BUNDLE=/etc/ssl/certs/custom-ca.pem
curl https://internal-api.com
# 4. Fichier config ~/.curlrc
echo "cacert = /etc/ssl/certs/ca-bundle.crt" >> ~/.curlrc
Workflow développement
# Dev local : générer certificat auto-signé
openssl req -x509 -newkey rsa:4096 -nodes \
-keyout key.pem -out cert.pem -days 365 \
-subj "/CN=localhost"
# Serveur test
python3 -m http.server --bind localhost 8443 \
--certificate cert.pem --key key.pem
# Client avec CA custom
curl --cacert cert.pem https://localhost:8443
Production : JAMAIS --insecure
# ❌ DANGEREUX en production
curl -k https://api.bank.com/transfer # VULNÉRABLE MITM!
# ✅ CORRECT
curl https://api.bank.com/transfer # Validation SSL complète
Détection dans scripts
# Audit scripts pour --insecure
grep -r "curl.*--insecure\|curl.*-k" /scripts/
# CI/CD : bloquer --insecure
if grep -q "curl.*-k" deploy.sh; then
echo "ERROR: --insecure detected!"
exit 1
fi
Règle : --insecure = JAMAIS en production, seulement dev/debug local.