« Restriction » entre VirtualHosts Apache

Blog Evolix

29 août 2025

L’utilisation de VirtualHosts séparés en fonction des noms de domaine est très répandue sur les serveurs Apache multi-sites. Il est intéressant de se pencher sur les mécanismes de restriction entre VirtualHosts, notamment dans le cas d’une connexion HTTPS où il y a eu récemment un renforcement de ce mécanisme (à partir de la version 2.4.64 sortie en juillet 2025) qui peut causer des changements de comportement.

Cas d’une connexion HTTP non chiffrée

Même si ce cas est de moins en moins courant, il est intéressant de rappeler le mécanisme de base pour une connexion HTTP non chiffrée : le seul moyen pour Apache de sélectionner le bon VirtualHost lors d’une requête client est de se baser sur l’entête HTTP Host (obligatoire à partir de HTTP/1.1). Voici un exemple avec netcat :

$ echo -e "GET / HTTP/1.1\r\nHost: www.debian.org\r\n\r\n" | nc www.debian.org 80
HTTP/1.1 302 Found
…

En conséquence, dans le cas d’une connexion HTTP, on peut accéder à n’importe quel VirtualHost si l’on connaît les options ServerName et ServerAlias, il n’y a pas spécialement de « restriction ». Évidemment on peut préciser des options dans le VirtualHost comme Require all denied mais c’est un autre sujet.

Rappel du fonctionnement de SNI

Avec HTTPS, il existe l’extension SNI qui consiste à ce qu’une requête client indique un nom de domaine AVANT la partie chiffrement. Cela permet notamment à Apache de sélectionner le bon certificat SSL avant de passer à la phase de chiffrement.

Pour faire une requête avec SNI, on peut utiliser l’option -servername de la commande openssl s_client :

$ openssl s_client -connect 130.89.148.77:443 -servername www.debian.org

Ainsi si l’on fait un tcpdump, on verra passer en clair « www.debian.org » au début de l’échange :

# tcpdump -s0 -XX -ni any port 443
…
    0x00c0:  002f 00ff 0100 00b0 0000 0013 0011 0000  ./..............
    0x00d0:  0e77 7777 2e64 6562 6961 6e2e 6f72 6700  .www.debian.org.
    0x00e0:  0b00 0403 0001 0200 0a00 1600 1400 1d00  ................
…

Évidemment les navigateurs web modernes utilisent SNI depuis des années, sinon une bonne partie des sites Internet souvent hébergés derrière une même adresse IP ne fonctionnerait pas.

Cas d’une connexion HTTPS

Apache a un mécanisme de restriction pour empêcher d’accéder à un VirtuaHost qui ne correspond pas au SNI présenté. Cela va renvoyer une erreur 421 Misdirected Request :

$ echo -e "GET / HTTP/1.1\r\nHost: www.example.com\r\n\r\n" | openssl s_client -connect 130.89.148.77:443 -quiet -servername www.debian.org

HTTP/1.1 421 Misdirected Request
<title>421 Misdirected Request</title>
<h1>Misdirected Request</h1>
<p>The client needs a new connection for this
request as the requested host name does not match
the Server Name Indication (SNI) in use for this
connection.</p>

Pour être précis, cela n’impose pas forcément une correspondance avec le certificat SSL, mais si l’on envoie un entête HTTP Host correspondant à un autre VirtualHost, on sera bloqué.

On peut donc distinguer deux mécanismes distincts :

  1. Apache va sélectionner le « meilleur » VirtualHost qui correspond au SNI présenté (et lui envoyer le certificat SSL correspondant à l’option SSLCertificateKeyFile du VirtualHost)
  2. Une fois qu’Apache a sélectionné le VirtualHost, il n’autorise d’utiliser l’entête HTTP Host que pour un nom de domaine valide pour ce VirtualHost (donc dans ServerName ou ServerAlias)

Une particularité c’est le « VirtualHost par défaut » : si l’on indique un SNI qui ne correspond à rien, on va être renvoyé vers le VirtualHost par défaut, que l’on pourra solliciter avec n’importe quel nom de domaine… sauf ceux présents dans les autres VirtualHosts !

Restriction renforcée à partir d’Apache 2.4.64

Si l’on n’utilise pas SNI, jusqu’ici Apache ne faisait pas de restriction particulière : on est renvoyé vers le « VirtualHost par défaut », et l’on peut solliciter n’importe quel nom de domaine et accéder à n’importe quel VirtualHost.

$ echo -e "GET / HTTP/1.1\r\nHost: www.debian.org.fr\r\n\r\n" | openssl s_client -connect 130.89.148.77:443 -quiet
HTTP/1.1 200 OK

Mais dans le cadre de la correction de la faille CVE-2025-23048, Apache 2.4.64 a patché (ahah) son code pour étendre la restriction exposée un peu plus haut, voici le patch : https://github.com/apache/httpd/commit/c4cfa50c9068e8b8134c530ab21674e77d1278a2

Le patch est assez simple : le code qui renvoie le 421 Misdirected Request a simplement été déplacé pour s’appliquer aussi au cas sans SNI.

Ainsi, à partir d’Apache 2.4.64, la requête précédente devrait donner :

$ echo -e "GET / HTTP/1.1\r\nHost: www.debian.org.fr\r\n\r\n" | openssl s_client -connect 130.89.148.77:443 -quiet
HTTP/1.1 421 Misdirected Request

Cela n’est pas encore le cas car a priori le serveur hébergeant « www.debian.org » tourne sous Debian 12 (bookworm) avec Apache 2.4.62.

Apache 2.4.65 est la version actuellement présente en Debian 13 (trixie) et dans Debian 11 (bullseye) depuis mi-août (via une mise à jour de sécurité LTS). Apache 2.4.65 devrait arriver dans Debian 12 (bookworm) le 6 septembre 2025 (sortie de Debian 12.12). On peut voir cela sur https://packages.debian.org/apache2

En pratique, chez nous ce changement a nécessité quelques adaptations de configuration :

par admin le 29 août 2025 à 12:17

Certificats racine Sectigo E46/R46

Blog Evolix

19 juin 2025

L’autorité de certification Sectigo a commencé à vendre depuis quelques semaines des certificats SSL/TLS signés par un certificat racine non reconnus sur certains systèmes. On vous explique pourquoi et comment résoudre ce problème.

Lorsqu’un logiciel tente d’établir une connexion SSL/TLS avec un tiers (souvent un serveur distant) il reçoit un certificat de ce serveur et vérifie s’il a été signé par un certificat racine de confiance.
La liste des certificats racine de confiance peut être gérée de plusieurs manières. En général, les navigateurs embarquent leur propre liste qui est mise à jour en même temps que le navigateur. Mais la plupart des logiciels ou bibliothèques utilisent le dépôt de confiance de leur système d’exploitation.
Il est assez rare que des nouveaux certificats racine soient ajoutés (ou retirés) et les mises à jour sont peu fréquentes et habituellement anticipables. De plus, les nouveaux certificats racine sont généralement signés de manière croisée par des certificats existants et déjà reconnus, pour faciliter leur mise en œuvre. À titre d’exemple, Let’s Encrypt a mis plusieurs années pour enfin pouvoir utiliser son propre certificat racine et se passer des signatures croisées d’autres autorités de certification.

Dans le cas présent, Sectigo (une autorité de certification majeure) a commencé il y a quelques semaines à signer des certificats avec 2 nouveaux certificats racine (appelés « E46 » et « R46 »).
Ces certificats racine ont été créés en 2021. Ils ont été diffusés en 2023 et par exemple Mozilla a commencé à les incorporer dans son dépôt de confiance en 2023.

Lors de connexions SSL/TLS à des services utilisant des certificats signés par E46 ou R46, les logiciels qui utilisent un dépôt de confiance contenant les certificats racine E46 et R46 peuvent valider la chaîne de confiance sans problème. Mais si les logiciels ne peuvent pas valider la chaîne de confiance, la connexion échoue. En cas d’erreur SSL/TLS on incrimine prioritairement (souvent à raison) une erreur de configuration du serveur qui présente le certificat, mais ici c’est plutôt le dépôt de confiance qui doit être mis à jour.

Debian – que nous utilisons sur nos serveurs – gère sa liste de certificats racine via le paquet ca-certificates. La première mention concrète de cette question remonte à février 2025 (l’intégration des certificats a été ralentie par des questions à propos de signatures croisées et de clarté sur l’utilisation effective de ces certificats). Depuis vendredi 13 juin 2025, un nouveau paquet ca-certificates contenant les certificats racine de Sectigo est disponible pour Debian 12 (la version stable actuelle).
Depuis jeudi 19 juin 2025, des paquets faits par Evolix sont disponibles pour Debian 9, 10 et 11 et ont été déployés sur nos serveurs (et conteneurs) infogérés. Et en parallèle les équipes Debian LTS et eLTS préparent des paquets plus officiels pour Debian 8/9/10/11. Les Debian en versions inférieures à 8 ne receveront pas de mise à jour par paquet. Pour rappel, Evolix supporte uniquement Debian 10, 11 et 12.

À noter qu’il est également possible d’intégrer des certificats racine manuellement si besoin.

Tout cela montre d’une part à quel point la notion de « chaîne de confiance » sur laquelle repose SSL/TLS est à la fois critique et fragile, et qu’une bonne communication entre les parties prenantes est nécessaire.

J’ai un serveur dédié infogéré par Evolix, suis-je concerné ?

Vous pouvez être concerné uniquement si vous faites des connexions SSL/TLS vers un service réseau externe qui a changé récemment son certificat. Depuis vendredi 20 juin 2025, si votre serveur (ou conteneur) est en Debian 9, 10, 11 et 12 vous ne devriez plus avoir de problème avec le dépôt de confiance du système. Si vous constatez un souci, ouvrez nous un ticket.

J’ai un serveur avec un Apache/Nginx en HTTPS, suis-je concerné ?

Vous êtes potentiellement concerné si vous avez mis en place un nouveau certificat Sectigo depuis environ 3 semaines. Dans ce cas, l’impact est que certains de vos utilisateurs ou clients risquent d’avoir des problèmes pour vous joindre tant qu’ils n’ont pas mis à jour le dépôt de confiance du système.

J’utilise Java sur mon serveur infogéré par Evolix, suis-je concerné ?

Java utilise sa propre liste de certificats racine, mais si vous utilisez Java installé par défaut sur le système, la liste devrait être identique et tout devrait être résolu à partir du vendredi 20 juin 2025 en Debian 9, 10, 11 et 12. Par contre, si vous utilisez une version spécifique de Java, vous devez gérer vous-même la liste des certificats avec la commande keytool.

J’utilise Docker sur mon serveur infogéré par Evolix, suis-je concerné ?

Pour rappel, Docker est un « mini-système indépendant », donc chaque conteneur intègre sa propre liste de certificats racine. Si vous avez besoin de mettre à jour cette liste, vous devrez reconstruire vos images.

par admin le 19 juin 2025 à 15:09