Posts tagged with “ssl”
Postfix TLS con múltiples certificados
Cuando hablamos de TLS o SSL siempre nos encontramos con el mismo problema, el certificado. Este debe ser único por puerto e IP, de forma que dependiendo de a donde se conecte el cliente le entregamos un certificado u otro acorde a su dominio. Esto es algo con lo que tenemos que pelear constantemente en Apache, creando un VirtualHost por cada IP y asignándole un certificado.
Postfix no se libra y también necesitamos una IP por certificado, de forma que a cada cliente le muestre el certificado de su dominio y nos evitemos los famosos warning. Para hacerlo en primer lugar es necesario tener una IP por cada dominio. Una vez completado ese simple requisito pasamos a configurar Postfix. Primero ponemos TLS a nivel global en Postfix dentro del main.cf:
#TLS smtpd_use_tls = yes smtpd_tls_key_file = /etc/ssl/dominio1.com.key smtpd_tls_cert_file = /etc/ssl/dominio1.com.crt smtpd_tls_received_header = yes smtpd_tls_session_cache_timeout = 3600s tls_random_source = dev:/dev/urandom
Ahora tenemos que hacer que Postfix arranque un proceso smtpd por cada una de las IPs/Dominios. Esto lo hacemos en el master.cf. Al mismo tiempo que indicamos la IP, también le indicamos el certificado que usará:
\#========================================================================== \# service type private unpriv chroot wakeup maxproc command + args \# (yes) (yes) (yes) (never) (100) \#========================================================================== 10.10.10.1:smtp inet n - - - - smtpd 127.0.0.1:smtp inet n - - - - smtpd 10.10.20.1:smtp inet n - - - - smtpd -o smtpd_tls_cert_file=/etc/ssl/dominio2.com.crt 10.10.30.1:smtp inet n - - - - smtpd -o smtpd_tls_cert_file=/etc/ssl/dominio3.com.crt 10.10.40.1:smtp inet n - - - - smtpd -o smtpd_tls_cert_file=/etc/ssl/dominio4.com.crt
Listo, en cada IP entregará un certificado :)
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.
GET /blog/ HTTP/1.1 Host: miguelangelnieto.net 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-alive
Pero 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
Para activar esta extensión añadimos la siguiente línea a httpd.conf:
SSLStrictSNIVHostCheck on
Una vez hecho configuraríamos nuestros VirtualHost SSL como si fuesen los de toda la vida (sin SSL).
Listen 443 NameVirtualHost *:443 <VirtualHost *:443> ServerName test1.irontec.com ServerAlias test1.irontec.com DocumentRoot /var/www/test1 Options FollowSymLinks <Directory /var/www/test1> AllowOverride All </Directory> 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.key </VirtualHost> <VirtualHost *:443> ServerName test2.irontec.com ServerAlias test2.irontec.com DocumentRoot /var/www/test2 Options FollowSymLinks <Directory /var/www/test2> AllowOverride All </Directory> 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 </VirtualHost>
Si vemos el siguiente error en los logs de Apache es que nuestro navegador no es compatible:
[error] No hostname was provided via SNI for a name based virtual host
Y listo, ya puedes tener múltiples VirtualHost con SSL en una única IP :)







