Múltiples VirtualHost en SSL en una única IP (SNI)
Resumiendo mucho el funcionamiento de los VirtualHost en Apache, se
puede decir que el cliente (nuestro navegador) envía al servidor el
nombre del dominio al que deseamos acceder y Apache lo busca en sus
configuraciones para entregarte la web. De esta forma en un solo
servidor podemos tener alojados múltiples páginas web, cada una con su
VirtualHost.
Para solucionar este problema se publicó en 2006 el RFC 4366. En resumen, TLS pasaba a tener extensiones a nivel cliente y servidor. Una de las cuales permite que el cliente en el establecimiento de la conexión (antes de comenzar el cifrado) pueda indicar el dominio al que desea acceder. La que nos hace la magia es SNI. Para que esto funcione es necesario cumplir una serie de requisitos:
SSLStrictSNIVHostCheck on
Una vez hecho configuraríamos nuestros VirtualHost SSL como si fuesen los de toda la vida (sin SSL).
Fuente: Miguel Angel Nieto
GET /blog/ HTTP/1.1 Host: javirodriguez.com.es User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.0.6) Gecko/2009020911 Firefox/3.0.6 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8 Accept-Language: es,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alivePero la cosa cambia si las webs deben ser transmitidas mediante HTTPS, esto es, estableciendo una conexión SSL. Gracias a esta tecnología es posible que todo el tráfico entre el servidor y nuestro navegador vaya cifrado y esta es la raíz del problema. Al tener todos los datos cifrados, el servidor no puede saber que dominio está pidiendo el navegador, por lo que los VirtualHost en base a nombres (dominios) pierden utilidad. Para paliar este problema, se ponían múltiples IPs en el servidor y se asignaba cada IP a un VirtualHost. De esta forma, cada web HTTPS tenia como destino una IP distinta y así el servidor era capaz de darte la web que estabas buscando. Esto es, se pasaba de tener VirtualHost por nombre a tenerlos por IP. Si tenías dos páginas web esto no era problema, pero si tenías 200… acelerarías la implantación de IPV6 y eso no es bueno
Para solucionar este problema se publicó en 2006 el RFC 4366. En resumen, TLS pasaba a tener extensiones a nivel cliente y servidor. Una de las cuales permite que el cliente en el establecimiento de la conexión (antes de comenzar el cifrado) pueda indicar el dominio al que desea acceder. La que nos hace la magia es SNI. Para que esto funcione es necesario cumplir una serie de requisitos:
- OpenSSL 0.9.8f o posterior con extensiones TLS (enable-tlsext)
- Apache compilado con dicho OpenSSL
- Navegadores Mozilla Firefox 2.0, Opera 8.0 Internet Explorer 7.0, Google Chome, Safari 3.2.1
SSLStrictSNIVHostCheck on
Una vez hecho configuraríamos nuestros VirtualHost SSL como si fuesen los de toda la vida (sin SSL).
Listen 443 NameVirtualHost *:443Si vemos el siguiente error en los logs de Apache es que nuestro navegador no es compatible:ServerName test1.javirodriguez.com.es ServerAlias test1.javirodriguez.com.es DocumentRoot /var/www/test1 Options FollowSymLinks AllowOverride All ErrorLog /var/log/apache2/test1error.log CustomLog /var/log/apache2/test1access.log combined env=!client-ip-request SSLEngine on SSLCertificateFile /etc/ssl/test.pem SSLCertificateKeyFile /etc/ssl/test.keyServerName test2.javirodriguez.com.es ServerAlias test2.javirodriguez.com.es DocumentRoot /var/www/test2 Options FollowSymLinks AllowOverride All ErrorLog /var/log/apache2/test2error.log CustomLog /var/log/apache2/test2access.log combined env=!client-ip-request SSLEngine on SSLCertificateFile /etc/ssl/test.pem SSLCertificateKeyFile /etc/ssl/test.key
[error] No hostname was provided via SNI for a name based virtual hostY listo, ya puedes tener múltiples VirtualHost con SSL en una única IP
Fuente: Miguel Angel Nieto
Comentarios