Servir multiples VirtualHost SSL con una única IP en Ubuntu

apache2


En entornos empresariales es común encontrar aplicaciones web que deben correr sobre https para funcionar correctamente, lo primero que piensas es “bueno, montemos un servidor Web Apache y configuremos las aplicaciones sobre VirtualHost”.
El problema viene cuando te encuentras que los virtualHost sobre SSL no funcionan, la razón? al transmitir los datos cifrados, el servidor web no tiene un mecanismo para saber que VirtualHost esta solicitando el navegador.
La solución mas sencilla es utilizar los VirtualHost basados en IP. Pero debido a la escasez de direcciones IPv4 este ya no es un escenario que podamos considerar.

Para solucionar este problema la IETF publicó el RFC4366 con el cual TLS pasa a soportar extensiones a nivel Cliente-Servidor, en este caso la que nos interesa es SNI (Server Name Indication).

SNI permite que el ciente, antes de cifrar la conexión, envié al servidor el nombre del dominio al que desea acceder.

Para que SNI funcione correctamente, son necesarios los siguientes requisitos:

  • OpenSSL 0.9.8f o posterior compilado con soporte para extensiones TLS (enable-tlsext; desde Openssl 0.9.8k las extensiones vienen activadas por defecto).
  • Apache2 2.2.12 o superior compilado contra la librería OpenSSL que tenga dichas extensiones activadas.
    • El navegador web del cliente debe soportar también SNI

    • Mozilla Firefox 2.0 o superior
    • Opera 8.0 or superior (Con TLS 1.1 habilitado)
    • Internet Explorer 7.0 or superior (sólo Vista, Win7 y Win8)
    • Google Chrome
    • Safari 3.2.1 o superior en Mac OS X 10.5.6 o superior

Activación

En Ubuntu, editamos los siguientes archivos de configuración y agregamos:

/etc/apache2/httpd.conf

SSLStrictSNIVHostCheck on

/etc/apache2/ports.conf


...
    NameVirtualHost *:443
    Listen 443
...

Luego editamos nuestros VirtualHost SSL como si fueran VirtualHost normales:

/etc/apache2/sites-available/default-ssl

<VirtualHost *:443>
  ServerName virtualhost1.dominio.com
  DocumentRoot /home/web/virtualhost1

  ErrorDocument 500 500.html
  ErrorDocument 404 404.html
  ErrorDocument 403 403.html
  ErrorLog        /var/log/apache2/virtualhost1.dominio.com-error.log
  TransferLog     /var/log/apache2/virtualhost1.dominio.com-access.log
  CustomLog       /var/log/apache2/virtualhost1.dominio.com-traff.log traff
  CustomLog       /var/log/apache2/virtualhost1.dominio.com-combined.log combined

  SSLEngine on
  SSLProtocol all -SSLv2
  SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM
  SSLCertificateFile      /etc/ssl/certs/virtualhost1.dominio.com.crt
  SSLCertificateKeyFile   /etc/ssl/private/virtualhost1.dominio.com.key

<Directory /home/web/virtualhost1>
    Options -Indexes FollowSymLinks
    AllowOverride None
</Directory>
</VirtualHost>

Finalmente reiniciamos el apache para recargar la nueva configuración

sudo service apache2 restart

Si en los logs de error de apache nos encontramos con el siguiente mensaje de error, es que nuestro navegador no es compatible con SNI

[error] No hostname was provided via SNI for a name based virtual host

Un comentario en “Servir multiples VirtualHost SSL con una única IP en Ubuntu

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s