Tutoriel

eMudhra : vérifier le magasin de confiance de vos serveurs

Sécurité & Monitoring9 min de lecture8 étapes

En octobre 2026, huit autorités intermédiaires eMudhra ont été bloquées par les navigateurs, mais un serveur n'est pas un navigateur : curl, git, Python, Node, Java et vos conteneurs portent chacun leur propre liste d'autorités de confiance. Que vous gériez un parc de machines clients ou vos propres serveurs, la question n'est plus « le navigateur protège-t-il l'utilisateur ? », mais « quelle machine fait encore confiance à ces certificats, et à quel endroit exact ? ». Ce guide donne l'audit complet, commande par commande, et dit honnêtement ce qui attendait encore un correctif amont à la date de sa rédaction.

Sommaire· Ce qui s'est passé, avec les dates1/11
  1. 01Ce qui s'est passé, avec les dates
  2. 02Pourquoi « les navigateurs ont bloqué » ne clôt pas le dossier
  3. 03Où vit un magasin de confiance sur une machine
  4. 04Prérequis chiffrés de l'audit
  5. 05La procédure, serveur par serveur
  6. 06Où chercher, composant par composant
  7. 07Les conteneurs : le correctif de l'hôte ne passe pas
  8. 08Si un certificat client chaîne sur ces autorités
  9. 09Testez avant et après, sur des hôtes réels
  10. 10Dépannage : les erreurs que vous allez voir
  11. 11Ce qui reste en attente, et qui porte quoi

Ce qui s'est passé, avec les dates

Le 17 octobre 2026, un chercheur signale aux programmes racine que huit autorités intermédiaires eMudhra ont été créées avec des clés mal générées. Firefox et Chrome bloquent ces certificats le jour même. Le 20 octobre 2026, Microsoft commence à les bloquer et le bundle de curl passe à sa version du 20 octobre. Le 22 octobre 2026, Apple suit pour les applications qui passent par ses frameworks réseau.

Le 20 octobre 2026, Debian publie aussi l'avis DSA-6572-1 : le paquet ca-certificates en version 20250419+deb13u1, pour Debian stable (trixie), retire les certificats nommés « emSign ECC Root CA - G3 » et « Comodo AAA Services root ». Deux précisions comptent pour la suite. L'avis parle d'intermédiaires eMudhra compromis, mais les deux certificats qu'il nomme portent des noms de racines. Et il ne liste de version corrigée que pour trixie : pour les autres distributions, il faut lire l'avis de la distribution concernée, pas supposer.

Pourquoi « les navigateurs ont bloqué » ne clôt pas le dossier

C'est l'objection la plus courante, et elle est à moitié juste. Les navigateurs qui imposent la transparence des certificats (Certificate Transparency) ne pouvaient pas être attaqués par ces intermédiaires, selon la page de référence du chercheur. Mais un serveur qui appelle une API, un script de déploiement qui clone un dépôt, une tâche planifiée qui télécharge une archive ou un conteneur qui installe une dépendance ne sont pas des navigateurs. Ces clients vérifient la chaîne contre un fichier, et ne contrôlent généralement ni la transparence ni la révocation. Le 28 octobre 2026, la page de référence du chercheur indiquait par exemple que les outils en ligne de commande d'Apple (git, curl, python3) faisaient encore confiance à ces certificats.

Seconde objection : qui est responsable ? L'agence tient la relation avec le client. L'infrastructure, elle, se contrôle serveur par serveur, et personne d'autre ne le fera à votre place.

Où vit un magasin de confiance sur une machine

  • Le paquet système — ca-certificates sur Debian, Ubuntu et Alpine, le même nom sur RHEL et dérivées. C'est la référence de tout ce qui lit /etc/ssl/certs.
  • Le bundle de curl — selon la compilation, curl lit le magasin système ou un fichier à part. curl-config --ca indique lequel.
  • Python et certifi — le module certifi embarque son propre bundle, et pip s'en sert. Une mise à jour du système ne le touche pas.
  • Node.js — le binaire embarque une liste d'autorités. NODE_EXTRA_CA_CERTS en ajoute, il n'en retire aucune.
  • Java — le fichier cacerts du JDK est un magasin indépendant du reste. Le correctif OpenJDK était encore en attente sur la page de référence, et rien ne garantit que votre distribution y répercute la mise à jour du paquet système.
  • Chaque image de conteneur — elle a son propre /etc/ssl/certs, figé à la date de sa construction. Le correctif de l'hôte ne la traverse pas.

Prérequis chiffrés de l'audit

Prévoyez un accès root ou sudo sur chaque machine, environ 15 minutes pour la première passe d'un serveur, puis 5 minutes en routine une fois les commandes mémorisées. Il y a cinq emplacements à inspecter par machine (paquet système, curl, certifi, Node, Java) et un de plus par image de conteneur. Gardez sous la main au moins deux hôtes de test dont vous connaissez la chaîne, par exemple www.votre-domaine.com et une API que vos applications appellent. Pour les services Java, prévoyez enfin une fenêtre de redémarrage : un magasin remplacé n'est relu qu'au démarrage de la JVM.

La procédure, serveur par serveur

  1. Relever la version du paquet

    dpkg -l ca-certificates sur Debian et Ubuntu, rpm -q ca-certificates sur RHEL et dérivées, apk info -v ca-certificates sur Alpine. Sur Debian stable (trixie), la version corrigée de l'avis DSA-6572-1 est 20250419+deb13u1 : si la vôtre est plus ancienne, passez à l'étape suivante.

  2. Mettre à jour le magasin

    Sur Debian et Ubuntu : apt update puis apt install --only-upgrade ca-certificates, puis update-ca-certificates. Sur RHEL et dérivées : dnf upgrade ca-certificates puis update-ca-trust. Sur Alpine : apk upgrade ca-certificates.

  3. Vérifier que les certificats retirés ont disparu

    ls /usr/share/ca-certificates/mozilla | grep -i -E 'emSign_ECC_Root_CA_-_G3|Comodo_AAA'
    ls /etc/ssl/certs | grep -i -E 'emSign_ECC_Root_CA_-_G3|Comodo_AAA'
    Le motif cible uniquement les deux certificats nommés par l'avis Debian, car d'autres racines emSign ou Comodo valides restent légitimement présentes. Après la mise à jour, aucune ligne ne doit sortir. Une ligne signale un magasin resté à l'ancienne version, ou un répertoire alimenté à la main. Vérifiez les noms de fichier réels sur une machine à jour.

  4. Tester une chaîne depuis le serveur

    openssl s_client -connect www.votre-domaine.com:443 -showcerts affiche chaque certificat envoyé et se termine par la ligne Verify return code. Le code 0 signifie que la chaîne est acceptée par le magasin local. Complétez avec curl -v https://www.votre-domaine.com et lisez la ligne SSL certificate verify ok.

  5. Inventorier les bundles hors du magasin système

    curl-config --ca donne le chemin du bundle de curl.
    python3 -c "import certifi; print(certifi.where())" donne celui de Python.
    echo $NODE_EXTRA_CA_CERTS montre les ajouts éventuels de Node.
    readlink -f $(which java) remonte au JDK, dont lib/security/cacerts est le magasin.

  6. Mettre à jour certifi

    pip show certifi donne la version installée, python3 -m pip install --upgrade certifi la met à jour. La page de référence du chercheur liste certifi 2026.10.19 parmi les versions corrigées. Refaites l'opération dans chaque environnement virtuel, car chacun a sa copie.

  7. Contrôler le magasin Java

    keytool -list -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit | grep -i -E 'emsign ecc|aaa' cherche les entrées concernées ; les alias varient selon le JDK, comparez donc avec la liste de la page de référence. Le correctif OpenJDK était encore en attente à la date de cette page : si une entrée concernée est présente, notez la machine comme « en attente amont » plutôt que « corrigée ».

  8. Consigner le résultat dans votre audit mensuel

    Une ligne par serveur : date, version de ca-certificates, chemins des bundles, résultat du test de chaîne. Cette trace est ce que vous montrez au client quand il demande ce qui a été vérifié, et elle s'insère dans la checklist d'audit mensuel de vos VPS clients.

Où chercher, composant par composant

Faites défiler le tableau

ComposantOù vit la liste de confianceCommande de contrôle
Système Debian, UbuntuPaquet ca-certificates, répertoire /etc/ssl/certs`dpkg -l ca-certificates`
Système RHEL et dérivéesPaquet ca-certificates, magasin géré par update-ca-trust`rpm -q ca-certificates`
curlMagasin système ou bundle de compilation`curl-config --ca`
Python, pipModule certifi, indépendant du système`python3 -c "import certifi; print(certifi.where())"`
Node.jsListe intégrée au binaire, plus NODE_EXTRA_CA_CERTS`echo $NODE_EXTRA_CA_CERTS`
JavaFichier cacerts du JDK`keytool -list -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit`
Conteneur Docker/etc/ssl/certs propre à chaque image`docker run --rm IMAGE ls /etc/ssl/certs`

Les conteneurs : le correctif de l'hôte ne passe pas

Un conteneur n'hérite pas du magasin de son hôte. Il embarque celui de son image de base, figé le jour de la construction. Mettre à jour ca-certificates sur le serveur ne change donc rien pour vos conteneurs. Pour inspecter une image, lancez docker run --rm IMAGE ls /etc/ssl/certs, ou docker run --rm IMAGE dpkg -l ca-certificates si l'image est basée sur Debian ou Ubuntu.

Le remède est la reconstruction : docker build --pull --no-cache -t mon-application:2026-10 . tire la dernière image de base et refait la couche des certificats. Sans --pull, Docker réutilise la base en cache, et vous reconstruisez le même défaut. Redéployez ensuite, puis relancez le contrôle sur le conteneur en marche. Pensez aux images tierces (base de données, proxy, outil de supervision) que vous ne construisez pas : leur éditeur doit publier une nouvelle version, et il faut le vérifier.

Si un certificat client chaîne sur ces autorités

Il y a deux cas, et il faut les séparer. Le premier : un certificat émis pour votre client, ou pour vous, a été signé par l'un des intermédiaires concernés. Lisez l'émetteur avec openssl x509 -in certificat.pem -noout -subject -issuer -dates, puis la chaîne servie avec openssl s_client -connect www.votre-domaine.com:443 -showcerts. La page de référence publie la liste des intermédiaires touchés (fichier impacted-intermediates.json) : comparez-la à ce que vous lisez. Si l'émetteur y figure, demandez à l'autorité émettrice une réémission sous une autre chaîne, sans attendre l'expiration.

Le second cas : un partenaire se connecte chez vous par certificat client (mTLS) et votre serveur l'accepte parce que son magasin contient une autorité concernée. Après mise à jour, ce partenaire peut être refusé, ce qui est le comportement voulu mais doit être annoncé. Prévenez-le avant, listez les certificats clients actifs, et gardez une trace de la date de remplacement.

Testez avant et après, sur des hôtes réels

Retirer une racine peut casser des chaînes légitimes qui s'y rattachent. Avant la mise à jour, lancez curl -sS -o /dev/null -w '%{http_code}\n' https://www.votre-domaine.com sur trois ou quatre hôtes que vos applications appellent vraiment, puis relancez la même commande après. Un changement de code ou une erreur de vérification se règle tout de suite, sur un serveur, plutôt qu'en production un lundi matin.

Dépannage : les erreurs que vous allez voir

Après la mise à jour, quatre messages reviennent. curl: (60) SSL certificate problem: unable to get local issuer certificate : le serveur distant envoie une chaîne incomplète, ou sa chaîne passait par un certificat désormais retiré. Testez avec openssl s_client -showcerts, puis demandez au propriétaire du service de corriger sa chaîne.

ssl.SSLCertVerificationError: CERTIFICATE_VERIFY_FAILED côté Python : l'interpréteur utilise le magasin de certifi ou celui du système, selon l'application. Relevez le chemin avec certifi.where() et mettez à jour le bon composant.

PKIX path building failed: unable to find valid certification path to requested target côté Java : le fichier cacerts ne contient pas l'autorité attendue ou a été remplacé. Vérifiez avec keytool, puis redémarrez la JVM.

Verify return code: 20 (unable to get local issuer certificate) dans openssl s_client : l'autorité n'est plus dans /etc/ssl/certs. Si le site est légitime, c'est un signal à traiter côté serveur distant, pas à contourner en désactivant la vérification.

Ce qui reste en attente, et qui porte quoi

À la date de la page de référence, mise à jour le 28 octobre 2026, le noyau NSS était corrigé en version 3.131.1 et le bundle de curl l'était depuis le 20 octobre 2026, mais le correctif OpenJDK restait en attente, et les outils en ligne de commande d'Apple continuaient de faire confiance aux certificats. Relisez cette page avant de dire à un client que tout est corrigé : l'état change, et votre rapport doit indiquer la date de la vérification.

Pour une agence, le partage est simple. Vous gardez la relation avec le client et le rapport qui lui prouve ce qui a été contrôlé. Le contrôle lui-même se fait machine par machine. Si vous gérez vos propres serveurs, le rapport est le même, sans le client : une ligne par machine, avec la date.

Les serveurs d'un client, réunis au même endroit

Avec ServOrbit.com, les hébergements, les VPS et les domaines d'un client se retrouvent au même endroit, ce qui simplifie le suivi de ce que vous gérez.

Besoin d'aide ?

Parcourez notre centre d'aide et notre FAQ, ou contactez notre équipe — rappel, WhatsApp ou e-mail. Support en français, anglais et arabe.

Écrire sur WhatsApps'ouvre dans un nouvel onglet