lunes, enero 21, 2013

Configurar 2 certificados SSL en un mismo Apache

Tengo un servidor Apache funcionando con su nombre de dominio, un SSL y un proxypass hacia una máquina interna en la red que tiene la aplicación. Esto funciona bien desde hace tiempo.

Resulta que se hizo una aplicación nueva que debe estar en SSL con su propio dominio y certificado SSL.

Para configurar el dominio no hay problema solamente agregué un VirtualHost por nombre y funcionaba ok. (uno así para HTTP y otro para HTTPS usando los certificados)


Usar 2 puertos distintos: se verá muy feo. porque tendríamos que acceder a http://server:8443/algo y puede que algunos ISP incluso bloqueen puertos y puede dar problemas.

La parte del "directory" la puse porque me daba un problema de que no tenía acceso al directorio. Al final no revisé si era necesaria o no.

En el DocumentRoot tengo un index.html que hace un META REFRESH hacia la url http://web.server.com/miaplicacionweb o http://movil.server.com/miaplicacionmovil

Al momento de querer poner el certificado la cosa se complicó. Puse el SSL y me dió este error:
Init: You should not use name-based virtual hosts in conjunction with SSL!!

Leyendo la documentación encontré que hay un problema con esta configuración ya que el apache no puede usar múltiples SSL en una misma IP+Puerto.
http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html#vhosts2

Entiendo que el problema es por esto: El SSL cifra el contenido de la página. Cuando Apache debe decidir cual virtualhost usar, para saber que SSL se usa debe decifrar el contenido de la página y como está cifrada apache no sabe cual certificado utilizar.

En el caso de tener múltiples IP's puede filtrar el virtualhost por IP sin tener que descifrar nada y ahí si funciona.
(confuso: si.    Estoy seguro: no. Pero eso entendí :p )

Alternativas:
Poner 2 IP's en la misma máquina: hay que tener 2 IP's públicas.

Lo primero que se hizo fué solicitar 2 IP's públicas. Como era una máquina virtual se le creó una segunda tarjeta de red y se le puso una segunda IP.

Como estaba atras de un Firewall las IP's publicas se nateaban en algún router y llegaban a las IP's privadas. Algo así como:
200.x.x.1 Publica1 apunta a 192.0.1.1 Privada1 (eth1)
200.x.x.2 Publica2 apunta a 192.0.1.2 Privada2 (eth2)

Al tener esto y los DNS's configurados:
web.server.com en 200.x.x.1
movil.server.com en 200.x.x.2
* esto lo confirmaba haciendo un nslookup web.server.com y luego un telnet web.server.com 80 (para ver si respondía el puerto).

Luego hice la configuración de virtualhost por IP. (IP-NAMED dice la configuración de apache). Perdí 4 horas de mi vida tratando de entender porque no funcionaban los virtualhost.

Para ver el problema le puse un log distinto a cada virtual host. Luego de batallar un buen rato encontré que el problema era que yo estaba usando en el virtualhost las ips publicas y no las internas. Al final, la conclusión es que hay que usar las ip's privadas. Dejando la configuración algo asi:


Para HTTP:



y para el HTTPS:



y ya. con eso debe de estar funcionando correctamente.

saludos!

3 comentarios:

Anónimo dijo...

Hola Carlos, saludos y gracias por el blog.
Justo voy a implementar lo mismo, tu apache si funciono perfecto verdad ?
con los dos Cert

carcasco dijo...

si funcionó. Suerte con tu instalación.

Juan Sosa dijo...

Voy a implementar los certificados ssl es más creo que voy a copiar el codigo tal cual, veamos que tal me sale, saludos