Erreurs

❌ Erreur SSL/TLS "SSL Handshake Failed" — Causes et Solutions

🔒 SSL / TLS

L'établissement de la connexion TLS a échoué — protocole, certificat ou cipher incompatible

🔒 SSL/TLS 📋 6 causes 🔧 5 solutions
Le SSL Handshake Failed survient lors de la négociation TLS entre client et serveur. Le handshake établit la connexion sécurisée — s'il échoue, aucune donnée ne peut être échangée. L'erreur peut venir du client, du serveur ou des deux.

⚠️ Causes possibles

⚠️
Version TLS incompatible
Le client supporte TLS 1.3 mais le serveur est limité à TLS 1.0/1.1 (ou inversement)
⚠️
Cipher suite incompatible
Aucun algorithme de chiffrement commun entre client et serveur
⚠️
Certificat invalide ou expiré
Le serveur présente un certificat expiré, auto-signé ou avec un nom incorrect
⚠️
SNI manquant ou incorrect
Le client n'envoie pas le bon nom de serveur (SNI) — problème avec les vhosts
⚠️
Chaîne de certificats incomplète
Les certificats intermédiaires manquent — le client ne peut pas vérifier la chaîne
⚠️
Firewall ou proxy intercepte TLS
Un équipement réseau tente d'inspecter le trafic TLS et présente son propre certificat

🔧 Solutions étape par étape

1

Diagnostiquer avec OpenSSL

terminal
# Tester la connexion TLS complète
openssl s_client -connect monsite.fr:443

# Tester avec un protocole spécifique
openssl s_client -connect monsite.fr:443 -tls1_2
openssl s_client -connect monsite.fr:443 -tls1_3

# Voir la chaîne de certificats complète
openssl s_client -connect monsite.fr:443 -showcerts

# Tester avec SNI explicite
openssl s_client -connect 192.168.1.10:443 -servername monsite.fr

# Voir les cipher suites proposées
openssl s_client -connect monsite.fr:443 -cipher 'ALL' 2>&1 | grep Cipher
2

Vérifier et corriger la config TLS Nginx

terminal
# Config TLS recommandée dans /etc/nginx/nginx.conf
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;

# Vérifier la config
nginx -t

# Recharger
systemctl reload nginx

# Tester le résultat
curl -v --tlsv1.2 https://monsite.fr
openssl s_client -connect monsite.fr:443 2>&1 | grep -E "Protocol|Cipher\"
3

Vérifier et corriger la config TLS Apache

terminal
# /etc/apache2/mods-enabled/ssl.conf
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
SSLHonorCipherOrder off
SSLSessionTickets off

# Vérifier
apachectl configtest

# Recharger
systemctl reload apache2

# Test SSL Labs (online)
# https://www.ssllabs.com/ssltest/analyze.html?d=monsite.fr
4

Corriger la chaîne de certificats

terminal
# Voir le certificat et la chaîne actuels
openssl s_client -connect monsite.fr:443 -showcerts 2>/dev/null | \
  openssl x509 -noout -subject -issuer

# Vérifier si des certificats intermédiaires manquent
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/mon-cert.pem

# Construire la chaîne complète
# Concaténer : certificat + intermédiaires + racine
cat mon-cert.pem intermediaire.pem > fullchain.pem

# Nginx — utiliser le fullchain
ssl_certificate /etc/ssl/certs/fullchain.pem;
ssl_certificate_key /etc/ssl/private/mon-key.pem;

# Vérifier la chaîne
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt fullchain.pem
5

Renouveler avec Let's Encrypt / Certbot

terminal
# Installer certbot
apt install certbot python3-certbot-nginx

# Obtenir un certificat
certbot --nginx -d monsite.fr -d www.monsite.fr

# Renouveler manuellement
certbot renew

# Tester le renouvellement sans appliquer
certbot renew --dry-run

# Configurer le renouvellement automatique (cron)
crontab -e
# 0 3 * * * certbot renew --quiet && systemctl reload nginx

# Vérifier le certificat actuel
certbot certificates

🛡️ Comment éviter cette erreur

  • ✅ Utiliser ssl_protocols TLSv1.2 TLSv1.3 uniquement — bannir TLS 1.0 et 1.1
  • ✅ Configurer le renouvellement automatique Certbot avec cron ou systemd timer
  • ✅ Tester régulièrement avec SSL Labs pour obtenir une note A+
  • ✅ Utiliser openssl s_client -connect HOST:443 comme premier réflexe de diagnostic TLS
Ajouter Les Fibrés à mes sources préférées
Retrouvez plus souvent nos guides dans vos résultats Google