Cette veille techno va nous permettre de créer plusieurs instances web HTTPS sur un serveur ayant une seule IP, autrement dit du virtualhosting par nom over SSL.
Pour comprendre SSL en détails, je vous recommande la lecture de cet article.
Sur une debian Squeeze avec Apache2 et le module ssl par défaut, la configuration de plusieurs instances nous retournera un warning au redémarrage comme ceci:
Apache démarre finalement mais lorsque vous essayerez les accès en https, le serveur présentera un seul et même certificat. Cette problématique est due au protocole de Handshake de SSL/TLS.
Heureusement les choses évoluent et notamment l'extension de TLS nommé SNI (Server Name Indication) permet de résoudre ce problème. Toutefois cette évolution est limitée au support des navigateurs utilisateurs.
Plusieurs méthodes semblent possibles, apache avec le module GnuTLS ou avec le module SSL (>=OpenSSL 0.9.8).
libapache2-mod-gnutls
a2dismod ssl a2enmod gnutls service apache2 restart
vi /etc/apache2/apache.conf
<IfModule mod_gnutls.c>
Listen 443
NameVirtualhost *:443
GnuTLSCache dbm /var/cache/gnutls
GnuTLSCacheTimeout 600
</IfModule>
vi /etc/apache2/sites-available/gnutls.conf
<IfModule mod_gnutls.c> <VirtualHost *:443> ServerName first.test.local:443 DocumentRoot /data/www/first GnuTLSEnable on GnuTLSCacheTimeout 500 GnuTLSExportCertificates on GnuTLSClientCAFile /root/demoCA/cacert.pem GnuTLSCertificateFile /root/ssl/first/first.test.local.crt GnuTLSKeyFile /root/ssl/first/first.test.local.key CustomLog /var/log/apache2/first.test.local-access.log combined ErrorLog /var/log/apache2/first.test.local-error.log </VirtualHost> <VirtualHost 192.168.1.27:443> ServerName second.test.local:443 DocumentRoot /data/www/second GnuTLSEnable on GnuTLSExportCertificates on GnuTLSCacheTimeout 500 GnuTLSPriorities NORMAL GnuTLSCertificateFile /root/ssl/second/second.test.local.crt GnuTLSKeyFile /root/ssl/second/second_key.pem CustomLog /var/log/apache2/second.test.local-access.log combined ErrorLog /var/log/apache2/second.test.local-error.log </VirtualHost> </IfModule>
a2ensite gnutls.conf
2enmod ssl a2dismod gnutls service apache2 restart
vi /etc/apache2/ports.conf
<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.
Listen 443
NameVirtualHost *:443
</IfModule>
vi /etc/apache2/sites-available/openssl.conf
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName first.test.local:443 DocumentRoot /data/www/first SSLEngine on SSLCertificateFile /root/ssl/first/first.test.local.crt SSLCertificateKeyFile /root/ssl/first/first.test.local.key SSLCACertificateFile /root/demoCA/cacert.pem CustomLog /var/log/apache2/first.test.local-access.log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" ErrorLog /var/log/apache2/first.test.local-error.log </VirtualHost> <VirtualHost *:443> ServerName second.test.local:443 DocumentRoot /data/www/second SSLEngine on SSLCertificateFile /root/ssl/second/second.test.local.crt SSLCertificateKeyFile /root/ssl/second/second_key.pem SSLCACertificateFile /root/demoCA/cacert.pem CustomLog /var/log/apache2/second.test.local-access.log combined ErrorLog /var/log/apache2/second.test.local-error.log </VirtualHost> </IfModule>
a2ensite openssl.conf
J'ai personnellement validé mes tests avec les navigateurs actuels: