L’erreur SSL certificate problem: unable to get local issuer certificate (ou ses variantes) est l’un des maux de tête les plus courants en développement. Elle signifie que l’outil ne peut pas vérifier la chaîne de certificats du serveur — généralement parce que les certificats racine CA sur votre système sont obsolètes ou manquants.
Ce guide couvre les corrections appropriées — pas seulement les contournements -k / --insecure qui désactivent la sécurité.
La cause profonde
Vos outils vérifient les certificats SSL par rapport à un bundle CA — un fichier contenant les certificats racine de confiance. Lorsque ce bundle est obsolète, manquant, ou que le serveur a une chaîne incomplète, la vérification échoue.
Votre outil → "Ce certificat est-il signé par une CA de confiance ?"
Bundle CA → "Je n'ai pas le certificat racine de cette CA"
→ ERREUR : unable to get local issuer certificate
curl
Erreur
curl: (60) SSL certificate problem: unable to get local issuer certificate
Correction 1 : Mettre à jour les certificats CA (correction appropriée)
# Debian/Ubuntu
sudo apt update && sudo apt install ca-certificates
sudo update-ca-certificates
# CentOS/RHEL
sudo yum update ca-certificates
# macOS (Homebrew curl)
brew install ca-certificates
Correction 2 : Spécifier le chemin du bundle CA
curl --cacert /etc/ssl/certs/ca-certificates.crt https://example.com
Correction 3 : Définir la variable d’environnement
export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
Ne faites pas ceci (sauf pour tester)
curl -k https://example.com # Désactive TOUTE vérification de certificat
Git
Erreur
fatal: unable to access 'https://...': SSL certificate problem: unable to get local issuer certificate
Correction 1 : Mettre à jour les certificats CA (comme pour curl)
sudo apt update && sudo apt install ca-certificates
Correction 2 : Pointer Git vers le bon bundle CA
git config --global http.sslCAInfo /etc/ssl/certs/ca-certificates.crt
Correction 3 : Sur Windows (Git for Windows)
Git for Windows inclut ses propres certificats CA. Mettez à jour Git vers la dernière version, ou :
git config --global http.sslBackend schannel
Cela indique à Git d’utiliser le magasin de certificats intégré de Windows au lieu du sien.
Ne faites pas ceci en production
git config --global http.sslVerify false # Désactive TOUTE vérification SSL pour Git
Python (requests / pip)
Erreur (requests)
requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED]
Erreur (pip)
pip install ... Could not fetch URL https://...: connection error: [SSL: CERTIFICATE_VERIFY_FAILED]
Correction 1 : Mettre à jour certifi (le bundle CA de Python)
pip install --upgrade certifi
La bibliothèque requests de Python utilise le paquet certifi pour les certificats CA, pas le magasin système.
Correction 2 : Pointer vers le bundle CA système
import requests
response = requests.get('https://example.com', verify='/etc/ssl/certs/ca-certificates.crt')
Ou via variable d’environnement :
export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
Correction 3 : Python sur macOS (problème courant)
Python sur macOS a souvent un magasin de certificats vide après l’installation. Exécutez :
# Trouver votre installation Python
python3 -c "import ssl; print(ssl.get_default_verify_paths())"
# Installer les certificats (Python macOS depuis python.org)
/Applications/Python\ 3.x/Install\ Certificates.command
Correction pour pip spécifiquement
pip install --upgrade pip
pip config set global.cert /etc/ssl/certs/ca-certificates.crt
Node.js
Erreur
Error: unable to get local issuer certificate
code: 'UNABLE_TO_GET_ISSUER_CERT_LOCALLY'
Correction 1 : Définir NODE_EXTRA_CA_CERTS
export NODE_EXTRA_CA_CERTS=/etc/ssl/certs/ca-certificates.crt
Cela ajoute des CA supplémentaires sans remplacer le bundle intégré de Node.
Correction 2 : Pour les certificats auto-signés en développement
// Uniquement pour le développement — ajoute une CA spécifique
const https = require('https');
const fs = require('fs');
const agent = new https.Agent({
ca: fs.readFileSync('/path/to/custom-ca.pem'),
});
fetch('https://internal-service.local', { agent });
Ne faites pas ceci en production
export NODE_TLS_REJECT_UNAUTHORIZED=0 # Désactive TOUTE vérification SSL
Proxy d’entreprise / environnements enterprise
De nombreux réseaux d’entreprise utilisent un proxy d’inspection TLS qui re-signe le trafic avec une CA interne. Vos outils ne font pas confiance à cette CA interne.
Correction : Obtenez le certificat CA d’entreprise auprès de votre service informatique et ajoutez-le :
# À l'échelle du système (Debian/Ubuntu)
sudo cp corporate-ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
# Python
export REQUESTS_CA_BUNDLE=/path/to/corporate-ca-bundle.pem
# Node.js
export NODE_EXTRA_CA_CERTS=/path/to/corporate-ca.pem
# Git
git config --global http.sslCAInfo /path/to/corporate-ca-bundle.pem
Conteneurs Docker
Les images Docker ont souvent des bundles CA obsolètes. Correction :
# Basé sur Debian
RUN apt-get update && apt-get install -y ca-certificates && update-ca-certificates
# Alpine
RUN apk add --no-cache ca-certificates
Diagnostic rapide
# Tester si la connexion SSL fonctionne avec openssl
openssl s_client -connect example.com:443 -servername example.com < /dev/null 2>/dev/null | grep "Verify return code"
# "0 (ok)" = la chaîne est correcte, le bundle CA de votre outil est le problème
# "21 (unable to verify)" = la chaîne du serveur est incomplète
# Vérifier quel bundle CA votre système utilise
python3 -c "import certifi; print(certifi.where())"
curl-config --ca 2>/dev/null || echo "Check /etc/ssl/certs/"
Questions fréquentes
Pourquoi ça fonctionne dans mon navigateur mais pas dans curl/Python ?
Les navigateurs maintiennent leur propre magasin CA (mis à jour avec le navigateur). Les outils CLI utilisent le bundle CA du système ou le leur (Python utilise certifi, Git for Windows inclut le sien). Si le bundle système est obsolète, les outils CLI échouent tandis que les navigateurs fonctionnent correctement.
Est-il sûr de désactiver la vérification SSL ?
Pour un test rapide : oui, si vous comprenez que vous ne vérifiez pas l’identité du serveur. Pour le code en production ou CI/CD : jamais. Désactiver la vérification vous expose aux attaques de type man-in-the-middle. Corrigez toujours la cause profonde (mettre à jour le bundle CA ou corriger la chaîne du serveur).
Le certificat du serveur est correct mais j’obtiens toujours des erreurs
Vérifiez si votre outil passe par un proxy qui re-signe le trafic. Les réseaux d’entreprise, certains VPN et les logiciels antivirus font cela. La CA du proxy n’est pas dans le magasin de confiance de votre outil.