Support SNI pour Apache sur une Debian Lenny

 

Il est facile à l'heure actuelle de mettre à disposition plusieurs vhosts sur une seule adresse IP, ce qui permet d'avoir plusieurs sites délivrés avec un seul serveur Apache.

Cependant dès que nous voulons mettre plusieurs vhosts SSL nous ne pouvons pas utiliser plusieurs certificats différents.

Une solution est d'ajouter des noms alternatifs dans le certificat, voir cet article : Mise en place d'une infrastructure PKI, ce qui produit quelques warnings mais cela fonctionne. Cependant dès que nous voulons avoir des certificats différents Apache ne sait plus gérer. C'est alors le premier certificat lu dans la conf des vhosts qui est pris en compte pour tout les vhosts ssl. Ceci se produit car quand le client demande le certificat au serveur, il ne précise pas de nom de domaine, le serveur est alors incapable de savoir quel certifcat choisir.

Il est donc nécessaire de redéfinir la phase de négociation des échanges TLS/SSL. Ceci doit se faire côté serveur, mais aussi côté client.

Côté serveur, il faut pour résoudre ce problème utiliser le support SNI d'Apache et d'OpenSSL. Parmi les paquets Debian Lenny, le support SNI est déjà activé (à partir de la version 0.9.8f, par contre pour Apache le support SNI n'est intégré qu'à partir de la version 2.2.12 et sur Debian Lenny les paquets par défaut sont en version 2.2.9.

Nous allons donc voir comment mettre en place une version plus récente d'Apache pour supporter le SNI.

Les serveur supportant le SNI

  • Apache 2.2.12 ou supérieur en utilisant mod_ssl ou mod_gnutls
  • Cherokee avec le support TLS compilé
  • Les nouvelles versions de lighttpd 1.4.x and 1.5.x
  • Nginx avec le OpenSSL supportant le SNI

Les clients supportant SNI

  • Mozilla Firefox 2.0 ou supérieur
  • Opera 8.0 ou supérieur (le protocal TLS 1.1 doit être activé)
  • Internet Explorer 7 (Vista, mais pas XP) ou supérieur
  • Google Chrome (Vista, mais pas XP)
  • Safari 3.2.1 Mac OS X 10.5.6

Pour tester votre navigateur : Test navigateur client

Installer les paquets nécessaires

# apt-get install dpkg-dev build-essential libcap2-dev autoconf sharutils
 dpatch lsb-relase libapr1-dev libaprutil1-dev 

Installer les dépendances d'Apache

# apt-get build-dep apache2

On récupère les sources de la version squeeze d'Apache 

# cd /usr/src
# wget http://ftp.de.debian.org/debian/pool/main/a/apache2/apache2_2.2.15-2.dsc
# wget http://ftp.de.debian.org/debian/pool/main/a/apache2/apache2_2.2.15.orig.tar.gz
# wget http://ftp.de.debian.org/debian/pool/main/a/apache2/apache2_2.2.15-2.diff.gz

 

Installation de debhelper

Pour compiler cette version d'Apache on va avoir besoins du paquet debhelper version squeeze, pour cela deux possibilités :

1/ modifier le fichier /etc/apt/sources.list en modifiant lenny par testing, puis faire un apt-get install debhelper ;

2/ récupérer le fichier le fichier .deb à cette adresse et en faire un dpkg -i nom_du_paquet ;

Construction des paquets Apache

# dpkg-source -x apache2_2.2.15-2.dsc
# cd apache2-2.2.15/
# dpkg-buildpackage -us -uc -d

L'option -d va nous permettre de faire la création des paquets en outrepassant les problèmes de dépendances.

On se retrouve alors avec une série de fichiers .deb

Installation d'Apache

# cd ..
# dpkg -i apache2_2.2.15-2_i386.deb apache2.2-bin_2.2.15-2_i386.deb 
apache2.2-common_2.2.15-2_i386.deb apache2-mpm-prefork_2.2.15-2_i386.deb 
apache2-suexec_2.2.15-2_i386.deb apache2-utils_2.2.15-2_i386.deb

Reste plus ensuite qu'à installer les modules habituels php, python, etc ...

A lire pour aller plus loin

http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI

http://en.wikipedia.org/wiki/Server_Name_Indication