Retour au blog Monitoring - 8 min

Certificat SSL expiré : que faire dans l’heure

Le certificat est déjà expiré : confirmez la date, renouvelez, rechargez le serveur, vérifiez dehors. Le processus viendra ensuite.

Quand le certificat est déjà expiré, le navigateur bloque avant d’afficher le site. Vous avez une heure pour remettre un certificat valide, pas pour rédiger une procédure. La procédure, celle d’avant l’échéance, est dans renouveler les certificats avant l’échéance. Ici, le notAfter est dans le passé et les visiteurs voient l’avertissement.

Confirmer que c’est bien la date

L’avertissement « connexion non privée » couvre plusieurs pannes. Ouvrez le certificat présenté :

  • date de fin dépassée : c’est cet incident ;
  • nom qui ne contient pas le domaine : mauvais vhost ou mauvais fichier, un renouvellement du certificat d’un autre nom ne corrigera rien ;
  • émetteur inconnu ou chaîne incomplète : le fichier servi n’inclut pas l’intermédiaire, ou c’est un certificat d’origine non public servi directement au visiteur.

``bash echo | openssl s_client -connect exemple.fr:443 -servername exemple.fr 2>/dev/null | openssl x509 -noout -dates -subject ``

-servername est indispensable si plusieurs sites partagent l’IP. Regardez notAfter et le sujet. Refaites la commande pour www si le certificat peut différer.

Si un CDN est devant le site, cette commande voit le certificat du bord, pas celui de l’origine. Un bord encore valide avec un mode « Full (strict) » et une origine expirée produit une erreur 526 ou équivalente, pas forcément le même écran. Renouvelez le certificat que la connexion réelle utilise. Le panneau qui affiche une date future peut être l’autre maillon.

Renouveler maintenant, puis faire prendre le fichier

  1. Hébergement mutualisé : lancez le renouvellement Let’s Encrypt / AutoSSL « maintenant », pas au prochain cycle. Le cycle, lui, a déjà manqué.
  2. Serveur que vous administrez : certbot renew (un certificat expiré est dû) ou le client ACME équivalent. Si la validation HTTP-01 échoue parce que le port 80 est cassé ou qu’une redirection avale /.well-known/acme-challenge/, passez par le DNS (DNS-01) ou par le bouton de l’hébergeur, qui n’a pas besoin que le TLS actuel fonctionne.
  3. Installez la chaîne complète (certificat + intermédiaire), pas seulement le certificat feuille.
  4. Rechargez le serveur web (nginx -s reload, reload Apache, ou l’action du panneau). Tant que le processus n’a pas relu le fichier, les visiteurs restent sur l’ancien.
  5. Vérifiez depuis l’extérieur, en navigation privée et avec la commande openssl ci-dessus. Le cache du navigateur ne garde en général pas un succès TLS à votre place : un avertissement qui reste après un notAfter futur veut dire que vous parlez encore à l’ancien certificat (CDN, IPv6, mauvais nœud).

Ne demandez pas aux visiteurs d’ajouter une exception. Prévenez-les par un canal qui ne dépend pas de ce TLS : téléphone, e-mail déjà parti, status page hébergée ailleurs. Une sonde externe qui contrôle le certificat, comme SiteGarde peut le faire sur l’URL publique, doit repasser au vert sur le même nom que les visiteurs utilisent. Le panneau d’admin qui « voit » le nouveau fichier ne suffit pas.

Contrôlez aussi les noms qui partagent souvent l’échéance : www, le domaine nu, mail si le même certificat servait la messagerie. Un cadenas rétabli sur l’accueil avec un SMTP encore expiré casse les formulaires dans la foulée.

Si le renouvellement ne part pas

  • Quota Let’s Encrypt atteint (trop d’échecs dans la semaine) : le message d’erreur le dit. Il faut attendre la fenêtre indiquée ou passer par un autre nom de validation, pas relancer en boucle.
  • Le compte de l’hébergeur n’a plus le droit de délivrer : facturation, ou offre qui n’inclut pas le TLS. C’est un ticket, pas un fichier à éditer à la main.
  • Vous n’avez pas la clé privée de l’ancien certificat : inutile. Faites émettre un certificat neuf.

Dans l’heure, un certificat neuf et un reload valent mieux qu’un debug du cron qui a échoué il y a un mois. Le cron se répare après, quand notAfter est de nouveau dans le futur. Sinon la même panne revient à la prochaine échéance, souvent 90 jours pour Let’s Encrypt.

Notez l’heure de début, l’heure où le test externe a montré la nouvelle date, et pourquoi le renouvellement automatique n’a pas eu lieu. Cette note est l’entrée du processus : alerte à 30 jours, boîte lue par deux personnes, essai réel du renouvellement. Sans elle, l’incident de cet après-midi se répète à la date que vous venez d’écrire dans le certificat.

Questions fréquentes

Comment être sûr que l’avertissement vient de la date, pas du nom ?

Ouvrez le détail du certificat dans le navigateur, ou via openssl s_client. Le champ de fin (notAfter) est dépassé. Si la date est bonne mais le nom ne correspond pas, ce n’est pas un renouvellement : c’est le mauvais certificat ou le mauvais vhost.

Faut-il dire aux visiteurs de cliquer sur « Continuer quand même » ?

Non. Cet avertissement existe pour une bonne raison, et vous ne contrôlez pas ce qu’ils accepteraient. Prévenez par un canal qui marche encore (téléphone, autre domaine, réseau social) que vous corrigez, sans leur demander de contourner le navigateur.

Le cadenas Cloudflare peut-il être valide alors que l’origine a expiré ?

Oui, si le visiteur parle au certificat du CDN. En mode Full (strict), un certificat d’origine expiré coupe quand même le site. Renouvelez le certificat que le proxy exige, pas seulement celui affiché dans un autre panneau.

Surveiller mes URL