Problème de certificat SSL ou HTTPS : diagnostic et correction
Un problème SSL se manifeste par un avertissement plein écran dans le navigateur (« Votre connexion n'est pas privée », NET::ERR_CERT_DATE_INVALID, NET::ERR_CERT_AUTHORITY_INVALID), un cadenas barré, ou des ressources qui refusent de se charger. Les visiteurs quittent la page, les API refusent de communiquer et les navigateurs récents bloquent purement et simplement l'accès.
Les causes les plus courantes sont un certificat expiré, un renouvellement automatique Let's Encrypt qui a échoué en silence, une chaîne de certificats incomplète, un certificat qui ne couvre pas le nom de domaine utilisé (www ou sous-domaine) ou du contenu mixte, c'est-à-dire des ressources chargées en HTTP dans une page HTTPS.
Cette page vous aide à lire le message d'erreur exact, à vérifier votre certificat avec les bons outils, à corriger la configuration du serveur et à mettre en place un renouvellement fiable pour que le problème ne revienne pas.
Symptômes typiques
- Avertissement « Votre connexion n'est pas privée » avec un code NET::ERR_CERT_DATE_INVALID, NET::ERR_CERT_AUTHORITY_INVALID ou NET::ERR_CERT_COMMON_NAME_INVALID.
- Le cadenas est barré ou le navigateur affiche « Non sécurisé » alors que la page est en HTTPS.
- Le site fonctionne sans www mais pas avec www, ou l'inverse, ou un sous-domaine renvoie une erreur de certificat.
- Certaines images, feuilles de style ou scripts ne se chargent pas et la console du navigateur signale « Mixed Content ».
- Un client API, une application mobile ou un script curl renvoie « certificate verify failed » ou « unable to get local issuer certificate ».
- Le site fonctionne sur les navigateurs récents mais pas sur d'anciens appareils, ou l'inverse.
Causes possibles
Certificat expiré
Les certificats Let's Encrypt durent trois mois, les certificats commerciaux un an. Sans renouvellement automatique fonctionnel ou sans rappel, l'expiration passe inaperçue jusqu'à l'avertissement des visiteurs.
Renouvellement Let's Encrypt en échec
Le port 80 est bloqué, le fichier .well-known/acme-challenge est intercepté par une redirection ou une règle .htaccess, l'enregistrement DNS a changé, le service certbot ou le timer systemd est désactivé, ou les quotas de Let's Encrypt ont été atteints.
Chaîne de certificats incomplète
Le serveur envoie le certificat du site sans les certificats intermédiaires. Les navigateurs de bureau compensent souvent, mais les mobiles, les anciens appareils et les clients API échouent.
Nom de domaine non couvert
Le certificat a été émis pour example.fr mais pas pour www.example.fr, ou pour un sous-domaine oublié. Un certificat multi-domaines (SAN) ou wildcard est nécessaire.
Contenu mixte
Des URL en http:// codées en dur dans le contenu, le thème, les fichiers CSS ou les réglages du CMS (siteurl WordPress, PS_SHOP_DOMAIN_SSL PrestaShop) après passage en HTTPS.
Configuration serveur ou proxy
Mauvais fichier de certificat dans Nginx ou Apache, vhost par défaut servi pour le domaine, CDN ou reverse proxy (Cloudflare, load balancer) avec un mode SSL incompatible, protocoles TLS obsolètes désactivés côté client.
Horloge système incorrecte
Un serveur ou un poste client dont la date est fausse considère un certificat valide comme non encore valide ou expiré.
Contrôles à effectuer
- 1
Lire l'erreur exacte
Cliquez sur le cadenas ou sur « Avancé » dans l'avertissement du navigateur : le code d'erreur indique s'il s'agit de la date (DATE_INVALID), de l'autorité (AUTHORITY_INVALID, chaîne incomplète ou certificat auto-signé) ou du nom (COMMON_NAME_INVALID).
- 2
Analyser le certificat depuis l'extérieur
Le test SSL Labs (ssllabs.com/ssltest) donne un rapport complet : validité, chaîne, noms couverts, protocoles. En ligne de commande : openssl s_client -connect example.fr:443 -servername example.fr | openssl x509 -noout -dates -subject -issuer.
- 3
Vérifier la chaîne
Dans la sortie d'openssl s_client, la section « Certificate chain » doit contenir le certificat du site puis un ou plusieurs intermédiaires. « Verify return code: 21 (unable to verify the first certificate) » signale une chaîne incomplète.
- 4
Tester le renouvellement
certbot certificates liste les certificats et leur date d'expiration ; certbot renew --dry-run simule le renouvellement et affiche l'erreur exacte (port 80 inaccessible, challenge introuvable, DNS). systemctl list-timers montre si le timer certbot est actif.
- 5
Repérer le contenu mixte
Ouvrez la console du navigateur (F12) : les messages « Mixed Content » indiquent chaque ressource chargée en HTTP. Un scanner comme Why No Padlock fait le même travail sur une URL donnée.
- 6
Vérifier la configuration du serveur
Dans Nginx : ssl_certificate doit pointer vers fullchain.pem (pas cert.pem) ; nginx -t valide la syntaxe. Dans Apache : SSLCertificateFile et SSLCertificateChainFile ou un fichier combiné ; apachectl configtest valide.
- 7
Contrôler la date du serveur
date et timedatectl status doivent afficher l'heure correcte et une synchronisation NTP active.
Solutions
Renouveler ou réémettre le certificat
certbot renew (ou certbot --nginx / --apache pour une nouvelle émission) après avoir corrigé la cause de l'échec, ou renouvellement auprès de l'autorité commerciale puis installation du nouveau certificat.
Rétablir le renouvellement automatique
Réactiver le timer systemd ou la tâche cron de certbot, autoriser le port 80 et le chemin .well-known/acme-challenge, ou passer à la validation DNS (DNS-01) si le port 80 ne peut pas être ouvert.
Installer la chaîne complète
Utiliser fullchain.pem avec Let's Encrypt, ou concaténer certificat et intermédiaires fournis par l'autorité, puis recharger le serveur web.
Couvrir tous les noms
Réémettre le certificat avec tous les domaines et sous-domaines nécessaires (option -d multiple de certbot) ou utiliser un certificat wildcard via validation DNS.
Éliminer le contenu mixte
Corriger les URL en base de données (wp search-replace pour WordPress, réglages SSL de PrestaShop), dans le thème et les fichiers CSS, puis ajouter l'en-tête Content-Security-Policy: upgrade-insecure-requests en filet de sécurité.
Corriger la configuration du proxy ou du CDN
Aligner le mode SSL du CDN (Full strict sur Cloudflare avec un certificat valide côté origine), configurer les certificats sur le load balancer, forcer la redirection HTTP vers HTTPS en un seul endroit.
Quand contacter un professionnel ?
- Le site est en production et affiche un avertissement plein écran à tous les visiteurs.
- certbot renew --dry-run échoue et le message d'erreur ne vous parle pas.
- L'infrastructure comporte un load balancer, un CDN, un reverse proxy ou plusieurs serveurs et vous ne savez pas où est installé le certificat.
- Des applications mobiles ou des partenaires API refusent de se connecter à cause du certificat.
- Vous voulez mettre en place un renouvellement automatique fiable et une surveillance de l'expiration.
L'intervention proposée par Agencei
- 1
Diagnostic
Analyse du certificat, de la chaîne, des noms couverts et de la configuration TLS depuis l'extérieur et sur le serveur, identification de la cause exacte de l'erreur.
- 2
Correction immédiate
Renouvellement ou réémission du certificat, installation de la chaîne complète, correction de la configuration Nginx, Apache, proxy ou CDN, rechargement des services.
- 3
Traitement du contenu mixte
Correction des URL dans la base de données, le thème et les fichiers, mise en place des redirections et des en-têtes de sécurité.
- 4
Automatisation du renouvellement
Configuration de certbot ou d'un client ACME avec validation HTTP ou DNS, hooks de rechargement des services, test à blanc.
- 5
Surveillance
Alerte sur l'expiration du certificat et test régulier de la validité depuis l'extérieur.
Questions fréquentes
Pourquoi mon certificat Let's Encrypt ne s'est-il pas renouvelé ?
Les raisons les plus fréquentes sont un port 80 bloqué, une redirection qui empêche l'accès à .well-known/acme-challenge, un changement de DNS ou de serveur, ou un timer certbot désactivé. certbot renew --dry-run affiche la cause précise.
Le site est en HTTPS mais le cadenas reste barré, pourquoi ?
C'est presque toujours du contenu mixte : une image, un script ou une feuille de style est chargé en HTTP. La console du navigateur liste les ressources concernées.
Faut-il un certificat payant ?
Pour la grande majorité des sites, non : Let's Encrypt fournit des certificats reconnus par tous les navigateurs. Les certificats payants apportent une garantie contractuelle, une validation étendue ou une durée d'un an, utiles dans certains contextes d'entreprise.
Le certificat fonctionne sur ordinateur mais pas sur mobile, comment est-ce possible ?
Généralement à cause d'une chaîne incomplète : les navigateurs de bureau récupèrent parfois l'intermédiaire manquant, les mobiles et les clients API non. Servir fullchain.pem règle le problème.
Combien de temps pour corriger un problème SSL ?
Un renouvellement ou une chaîne manquante se corrige souvent en moins d'une heure. Le contenu mixte sur un site volumineux ou une infrastructure avec CDN et load balancer peuvent demander plus de temps.
Services associés
Sécurité
Nettoyage de site piraté, durcissement, analyse de vulnérabilités, WAF, sauvegardes et accès.
Voir ce serviceSupport informatique
Assistance applicative et serveurs, gestion des incidents et engagements de service clairs.
Voir ce serviceAccompagnement DevOps
Mise en place de la CI/CD, de l'infrastructure as code, de la supervision et des pratiques GitOps.
Voir ce serviceMaintenance informatique
Supervision, mises à jour, sauvegardes et amélioration continue de vos applications en production.
Voir ce serviceParlez-nous de votre projet
Décrivez votre besoin en quelques lignes : nous revenons vers vous avec une première analyse et les prochaines étapes.