Contenu

Plusieurs serveurs virtuels Apache par nom (host-based) en SSL

Contenu
Avertissement
Dernière modification de cet article le 2013-05-23, le contenu pourrait être dépassé/obsolète.

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 dans ServerName, soit dans ServerAlias). 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”) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<IfModule mod_ssl.c>

    <VirtualHost *:443>
        ServerAdmin webmaster@domaine1.tld
        DocumentRoot /var/www/domaine1.tld/pub

        ErrorLog ${APACHE_LOG_DIR}/domaine1.tld/error.log
        CustomLog ${APACHE_LOG_DIR}/domaine1.tld/access.log combined

        SSLEngine on

        SSLCertificateFile    /etc/ssl/certs/ssl-cert-domaine1.tld.pem
        SSLCertificateKeyFile /etc/ssl/private/ssl-cert-domaine1.tld.key

        ...
    </VirtualHost>

    <VirtualHost *:443>
        ServerAdmin webmaster@domaine2.tld
        DocumentRoot /var/www/domaine2.tld/pub

        ErrorLog ${APACHE_LOG_DIR}/domaine2.tld/error.log
        CustomLog ${APACHE_LOG_DIR}/domaine2.tld/access.log combined

        SSLEngine on

        SSLCertificateFile    /etc/ssl/certs/ssl-cert-domaine1.tld.pem
        SSLCertificateKeyFile /etc/ssl/private/ssl-cert-domaine1.tld.key

        ...
    </VirtualHost>

</IfModule>

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> :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
...
<IfModule mod_ssl.c>
     # If you add NameVirtualHost *:443 here, you will also have to change
     # the VirtualHost statement in /etc/apache2/sites-available/default-ssl
     # to <VirtualHost *:443>
     # Server Name Indication for SSL named virtual hosts is currently not
     # supported by MSIE on Windows XP.
     NameVirtualHost *:443
     Listen 443
</IfModule>
...

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>