Plusieurs serveurs virtuels Apache par nom (host-based) en SSL
Les serveurs virtuels Apache permettent d’héberger, sur une même machine (et sur une même installation d’Apache) plusieurs sites Internet différents (ayant chacun leur propre FQDN). Il existe deux variantes de ce système bien pratique pour économiser sur les serveurs web :
- Par IP (IP-based) : Apache recherche le
<VirtualHost>
ayant le couple adresse IP et port (généralement 80) du client (le navigateur) - Par nom (host-based, name-based) : Le serveur regarde l’entête
Host
(eg.Host: domaine.tld
) reçue du client et recherche le<VirtualHost>
où figure ce FQDN (soit dansServerName
, soit dansServerAlias
). Cette technique peut être combiné avec un choix par IP, mais généralement on utilise le wildcard * (eg.<VirtualHost *:80>
) pour fonctionner avec n’importe quelle adresse IP)
Voir la documentation Apache pour plus d’informations ce sujet, notamment la manière dont Apache décide quel serveur virtuel va traiter la demande. C’est souvent la variante par nom qui est utilisée car plus simple (pas besoin d’ajouter des interfaces réseau au serveur pour avoir de nouvelles adresses IP : l’aiguillage se passe au niveau DNS), plus souple (il est assez facile de configurer/modifier une zone DNS) et moins onéreux (l’achat d’adresses IP est plus cher qu’un nom de domaine -qu’on devra de toutes façon acquérir-, d’autant plus si c’est des IPv4).
En revanche, le host-based pose problème lors de l’hébergement de sites en https:// car l’entête Host
n’est pas
envoyé au serveur avant d’avoir établi une connexion sécurisée, or la négociation SSL préalable à cette connexion
requiert un certificat, un certificat qui dépend du
FQDN du site (il faut qu’il corresponde au
CN du certificat) : c’est un peu l’histoire de la poule et de
l’œuf où l’on a besoin de l’un pour avoir et l’autre de l’autre pour avoir l’un…
Je vais vous montrer comment faire, sous Apache 2.2.12 et avec OpenSSL 0.9.8f (minimums requis pour gérer le Server
Name Indication (SNI) qui pallie l’absence d’entête Host
) pour avoir plusieurs
VHost par nom (name-based) en HTTPS, sur une seule adresse IP et
sans avoir l’avertissement “_default_ VirtualHost overlap on port 443, the first has precedence”
Créer son/ses VHosts en adaptant les chemins vers les certificats dans les directives et SSLCertificate* SSLCA*.
On peut bien entendu, placer chaque bloc <VirtualHost>
dans un fichier différent (comme avec Debian dans
“/etc/apache2/sites-available
”) :
|
|
Si vous tentez de redémarrer votre serveur Apache vous risquez d’avoir l’avertissement suivant :
[warn] _default_ VirtualHost overlap on port 443, the first has precedence
Pour l’éviter, il faut modifier le fichier “/etc/apache2/ports.conf” et y rajouter :
NameVirtualHost *:443
dans la section <IfModule mod_ssl.c>
:
|
|
Comme indiqué dans les commentaires, il faut aussi penser à modifier la configuration du serveur virtuel “default-ssl” (si vous vous en servez) :
Passer de : <VirtualHost *:443>
A : <VirtualHost _default_:443>
Si vous aimez le contenu, vous pouvez aider
Sponsor