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 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 :
<IfModule mod_ssl.c>
...
</IfModule>
  • ajoutez les informations pour le certificat SSL :
<VirtualHost *:443>
    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$

    [...]
</VirtualHost>
  • Puis effectuez la même opération pour les autres virtualhosts
  • Enfin redémarrez Apache2

Source : Multiple SSL certificates on a single IP/port using mod_GnuTLS

Dernière modification: le 27/02/2013 à 10:36 par EM2419-GANDI