====== Disposer de plusieurs virtualhosts SSL sur Apache2 ====== Comme vous avez pu le constater si vous avez tenté la configuration de plusieurs virtualhosts sécurisés par SSL sous Apache2, Apache2 indique une erreur telle que : [warn] vhost2 VirtualHost overlap on port 443, the first (vhost1) has precedence Si vous ne disposez pas des avertissements, vous pourrez voir sur un navigateur une alerte de sécurité pour tout virtualhost SSL autre que celui par défaut, en effet, ce sera toujours le premier certificat SSL qui sera envoyé si vous utilisez mod_ssl (qui repose sur OpenSSL), la librairie par défaut. ===== Quelle en est la cause principale ? ===== Le support SNI, soit Server Name Indication, dans les librairies SSL. Cette option n'est pas activée par défaut dans OpenSSL. Lorsqu'un client se connecte au serveur web en HTTPS, la connexion SSL est établie avant de connaitre le nom d'hôte cible, donc le certificat SSL qui est envoyé pour établir la connexion est toujours celui par défaut. Dans OpenSSL, le support SNI a été intégré dans les versions supérieures à 0.9.8k, cependant, il n'est pas activé par défaut, il est nécessaire de recompiler OpenSSL pour en profiter. Une autre librairie, GnuTLS, en dispose nativement, elle peut donc être utilisée directement pour créer des virtualhosts SSL sécurisés disposant chacun de leur propre certificat SSL. Sachez qu'avec un OS récent (Debian squeeze avec les mises à jour de sécurité ou Ubuntu en version LTS 12.04 par exemple), OpenSSL est dans une version où le support SNI est compilé par défaut, inutile alors de le recompiler ou d'utiliser GnuTLS, cela devrait fonctionner immédiatement. ===== Comment contourner cette problématique ? ===== ==== En recompilant Apache2 et OpenSSL ==== La problématique ainsi que les prérequis pour utiliser OpenSSL avec SNI et Apache2 est expliquée sur le [[http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI|wiki d'Apache.org]]. ==== En utilisant la librairie GnuTLS ==== Si recompiler les deux programmes ne vous tente pas, vous pouvez abandonner mod_ssl au profit de mod_gnutls, installez d'abord le paquet : apt-get install libapache2-mod-gnutls Désactivez SSL et activez GnuTLS : a2dismod ssl a2enmod gnutls Enfin configurez les virtualhosts avec les certificats : * retirez les informations relatives à mod_ssl, soit les deux lignes suivantes : ... * ajoutez les informations pour le certificat SSL : ServerName domain1.tld DocumentRoot /var/www/domain1 [...] GnuTLSEnable on GnuTLSExportCertificates on GnuTLSCacheTimeout 500 GnuTLSCertificateFile /etc/ssl/certs/domain1.crt #GnuTLSClientCAFile /etc/ssl/ca.gandi.net.cert GnuTLSKeyFile /etc/ssl/private/domain1.key #GnuTLSPriorities NONE:+AES-128-CBC:+ARCFOUR-128:+RSA:+SHA1:+MD5:+COMP-NULL:$ GnuTLSPriorities NORMAL # SSL Protocol Adjustments: BrowserMatch ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force$ [...] * Puis effectuez la même opération pour les autres virtualhosts * Enfin redémarrez Apache2 [[http://isp-control.net/forum/thread-4696.html|Source : Multiple SSL certificates on a single IP/port using mod_GnuTLS]]