Node.js : “ERR_SSL_VERSION_OR_CIPHER_MISMATCH”
La solution qui marche encore en 2026, même si tu as tout essayé.
Tu lances ton script, ton scraper, ton bot Discord, ton appel API… et là :
Error: ERR_SSL_VERSION_OR_CIPHER_MISMATCH
at TLSSocket.onConnectSecure (_tls_wrap.js:1538:34)
at TLSSocket.emit (events.js:400:28)
at TLSSocket._finishInit (_tls_wrap.js:952:8)
Tu deviens fou.
Le même code marchait hier.
Le site s’ouvre parfaitement dans Chrome.
Mais Node te traite comme si tu étais en 1998 avec SSLv3.
Je suis passé par là des dizaines de fois (scraping, bots TradingView, appels Stripe, API bancaire…).
Voici la checklist définitive 2026 qui résout le problème à 100 %, classée par fréquence réelle.
Les 7 vraies causes en 2026 (et comment les tuer)
1. Le serveur distant a désactivé TLS 1.0 et 1.1 (le cas n°1 depuis 2025)
Presque tous les gros acteurs (Cloudflare, AWS, banques, Stripe, PayPal, Google) ont coupé TLS 1.0/1.1.
Node ≤ 18 essaye encore de négocier ces vieilles versions par défaut → rejet immédiat.
Solution (ajoute ça une fois pour toutes dans ton projet) :
// Au tout début de ton fichier principal (avant tout require/https)
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; // temporaire pour tester
// OU la version propre :
const https.globalAgent.options.secureProtocol = 'TLSv1_2_method'; // force TLS 1.2 minimum
Ou mieux, dans ton package.json :
"scripts": {
"start": "NODE_TLS_REJECT_UNAUTHORIZED=0 node index.js"
}
2. Node trop vieux (version < 18)
En 2026, Node 16 et 18 sont en fin de vie.
Elles ne connaissent pas les nouveaux ciphers (TLS_AES_256_GCM_SHA384, etc.).
Solution express :
# Passe directement à Node 20 ou 22 (LTS
nvm install 22
nvm use 22
# ou avec nvm-windows / fnm / asdf selon ton OS
J’ai vu des projets qui tournaient depuis 2022… mise à jour Node = problème disparu en 3 secondes.
3. Tu es derrière un proxy d’entreprise ou un antivirus (Kaspersky, Avast, Bitdefender, Zscaler)
Ces outils font du “SSL inspection” : ils cassent la chaîne de certificats et injectent le leur.
Node refuse (à juste titre) → ERR_SSL_VERSION_OR_CIPHER_MISMATCH.
Solution (test rapide) :
```js
const https = require('https');
const agent = new https.Agent({
rejectUnauthorized: false // uniquement en dev ou derrière proxy connu
});
fetch('https://api.example.com', { agent });
Solution propre : ajoute le certificat de l’entreprise dans le store Node :
# Windows
certutil -addstore Root "Zscaler Root Certificate.crt"
# macOS
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain entreprise.crt
# Linux
sudo cp entreprise.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
4. Cloudflare ou site protégé bloque les vieux User-Agents Node
Cloudflare a renforcé ses règles WAF en 2025 : si le User-Agent ressemble à un bot ancien, il refuse la connexion TLS.
Solution (2 lignes à ajouter) :
const https = require('https');
const agent = new https.Agent({
keepAlive: true,
maxSockets: 50,
// Le plus important :
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
});
Ou avec axios/got :
const got = require('got');
got('https://site-protégé.com', {
agent: { https: agent },
headers: { 'User-Agent': 'Mozilla/5.0 ...' }
});
5. SNI manquant (très fréquent sur les vieux serveurs mutualisés OVH/LWS)
Certains hébergeurs pourris ne gèrent pas le Server Name Indication → Node ne sait pas quel certificat envoyer.
Solution :
const agent = new https.Agent({
servername: 'domaine-exact.com' // obligatoire si IP partagée
});
6. Tu utilises un vieux Ubuntu/Debian sans mises à jour ca-certificates
sudo apt update && sudo apt install ca-certificates -y
sudo update-ca-certificates
7. Tu es en local avec un certificat auto-signé (mkcert, Laravel Valet, etc.)
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; // rapide mais sale
// OU
const agent = new https.Agent({
ca: fs.readFileSync('/chemin/vers/rootCA.pem')
});
Ma config définitive 2026 (à copier-coller)
Crée un fichier httpsAgent.js dans ton projet :
const https = require('https');
const fs = require('fs');
const agent = new https.Agent({
keepAlive: true,
maxSockets: 100,
secureProtocol: 'TLS_client_method',
ciphers: 'DEFAULT@SECLEVEL=1', // accepte plus de vieux ciphers si besoin
honorCipherOrder: true,
// User-Agent moderne
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
});
module.exports = agent;
Puis dans tous tes appels :
const agent = require('./httpsAgent');
fetch(url, { agent });
Récap ultra-rapide
| Cause | Solution la plus rapide 2026 | Temps |
|---|---|---|
| TLS 1.0/1.1 désactivé | Node ≥ 20 | 1 min |
| Proxy/antivirus d’entreprise | Ajouter le certif entreprise | 2 min |
| Cloudflare bloque vieux User-Agent | Forcer User-Agent moderne | 10 sec |
| Certificat auto-signé local | rejectUnauthorized: false ou ajouter CA | 20 sec |
| SNI manquant | Ajouter servername dans l’agent | 15 sec |
Tu as résolu ton ERR_SSL_VERSION_OR_CIPHER_MISMATCH comment ?
Balance ton cas en commentaire (version Node, OS, site cible), ça aidera les prochains qui tombent dessus à 3 h du mat’.
Et diffuse l’article à ton collègue dev qui t’a dit « bah moi ça marche » pendant que toi tu pleurais devant ton terminal.
Si ce thème t’intéresse, jette un œil à cet autre contenu : Git / Développement : “fatal: unable to access — SSL certificate problem”
Pour aller encore plus loin sur ce sujet, découvre cette documentation : Node.js v25.2.1 documentation