JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

SNI: usar certificados SSL para varios dominios desde la misma IP (con IIS 8.0)

Cuando un navegador se conecta a un servidor web usando el protocolo comúnmente conocido como SSL (Secure Sockets Layer, de manera más formal SSL/TLS: Transport Layer Security), las comunicaciones se cifran entre ambos con el triple objeto de:

  • Evitar que se puedan inspeccionar (cifrado)
  • Evitar que se puedan modificar (no repudio)
  • Autenticar al servidor, y opcionalmente al cliente, aunque no es lo habitual (autenticación).

El handsahe de TLS se produce antes de que se intercambien cabeceras algunas entre cliente y servidor. Es decir, que en la comunicación que se inicia todo el tráfico va encriptado, incluso las propias peticiones, lo cual incluye el propio nombre de dominio al que nos conectamos. Esto presenta una dificultad para el servidor ya que hasta que recibe la petición y la descifra no sabe a qué dominio nos queremos conectar, pero si no lo sabe ¿cómo sabe qué certificado debe utilizar?

SSL-Secure

La respuesta tradicional a este problema ha sido que cada certificado SSL estuviese asignado a una única dirección IP. De este modo, según la dirección IP a la que se estuviese realizando la llamada, el servidor podría saber perfectamente qué certificado le correspondía, usar su clave privada para descifrar la petición inicial e iniciar el proceso de comunicación.

Esta solución, aunque válida, tenía varias pegas importantes, pero sobre todo estas dos:

  1. Si hay más de un dominio albergado en la misma IP, cualquier conexión a dicha IP a través e otros dominios no asociados al mismo certificado SSL generarían un aviso de seguridad por parte del navegador. El motivo es que se recibe la petición, se atiende con el certificado asociado a la IP, pero el nombre de dominio solicitado y el del certificado no coinciden.
  2. Si queríamos usar más de un certificado SSL en un servidor teníamos que disponer como mínimo de tantas direcciones IPs como certificados, lo cual encarece y complica la gestión del servidor. Además es un impedimento enorme para las empresas de hosting.

Para tratar de solucionar estas pegas se definieron unas extensiones al protocolo SSL/TSL llamadas Server Name Indication o SNI. Lo que hacen es que incluyen el nombre del dominio como parte de la negociación inicial (o handshake) de SSL/TSL. Esto permite al servidor saber cuál es el dominio al que nos queremos conectar y utilizar así el certificado apropiado. Gracias a estas extensiones los problemas mencionados anteriormente se pueden solventar de un plumazo.

Además permite la utilización de certificados SSL de tipo "wildcard", es decir, que sirven para cualquier subdominio de un dominio dado. Podemos comprar un certificado de tipo *.dominio.com y que sirva para cualquier subdominio de éste: subdom.dominio.com, otro.dominio.com, etc... lo cual puede ser muy útil (por cierto, estos certificados wildcard son mucho más caros que los normales).

Es más, en teoría con SNI podríamos tener un certificado SSL asociado a múltiples dominios diferentes a la vez, aunque en la práctica no se utilizan por la dificultad de gestión (por ejemplo, habría que anular el certificado y crear uno nuevo ante cualquier cambio en la lista de dominios).

Soporte de SNI

Lo bueno es que SNI es ya bastante antiguo y podemos afirmar que la práctica totalidad de los navegadores ofrecen la posibilidad de utilizarlo. En el caso de Internet Explorer, la versión 7.0 o posterior sobre Windows Vista o posterior es capaz de utilizar SNI (en XP no funciona, pero nadie debería usar XP a estas alturas, y menos con IE). El resto de los navegadores no tienen problema.

En el caso de los servidores web también prácticamente todos lo soportan en sus últimas versiones. En el caso concreto de Internet Information Server, el soporte se ofrece a partir de su versión 8.0, es decir, con Windows Server 2012 o posterior.

Uso en Internet Information Server 8.0

En el caso de IIS 8.0 su uso es muy sencillo. Una vez que tenemos instalado el certificado digital para un dominio, si vamos al servidor virtual correspondiente en el IIS Manager y pulsamos sobre la opción "bindings", podemos añadir un nuevo enlace para HTTPS con este diálogo:

SNI-IIS-8-Configuracion

Pulsa para aumentar

Como vemos tenemos una zona de configuración para el nombre de dominio en el que podremos introducir el dominio exacto con el que está relacionado el certificado SSL. Obviamente éste debe coincidir con el dominio para el que hemos solicitado el certificado, o no funcionará correctamente.

Además debemos marcar la opción de requerir el uso de SNI, justo debajo.

Con esto el servidor comenzará a aceptar peticiones SSL/TSL desde los navegadores, sabiendo de antemano el nombre del dominio y por tanto pudiendo albergar varios dominios SSL asociados a la misma IP sin problemas.

En su día, hace ya muchos años, expliqué cómo conseguir algo similar a esto con Internet Information 6.x.

En el próximo post voy a explicar cómo "hackear" IIS 7.x para que nos permita hacer lo mismo, aunque en teoría no soporte SNI ;-)

¡Espero que te sea útil!

José Manuel Alarcón José Manuel Alarcón
Fundador de campusMVP.es, el proyecto de referencia en formación on-line para programadores en lengua española. Autor de varios libros y cientos de artículos. Galardonado como MVP de Microsoft desde 2004. Gallego de Vigo, amante de la ciencia y la tecnología, la música y la lectura. Ayudando a la gente en Internet desde 1996.
Descarga GRATIS mi último libro (no técnico): "Tres Monos, Diez Minutos".
Banner

Comentarios (15) -

Como se puede aplicar en azure web sites?

Responder

Spain José Manuel Alarcón

Ni idea. Tendrás que preguntarle a algún experto en Azure, pero no creo que se pueda hacer algo así...

Responder

Hola ¿Publicaste lo mismo para windows server 2008 r2 o sea con iis 7.x ?? ""hackear" IIS 7.x para que nos permita hacer lo mismo,"

Responder

by Jose M. Alarcon

Hola:

sí, lo tienes aquí: www.jasoft.org/.../...t-Information-Server-7x.aspx

Saludos,

Responder

VIRGINIA FAUSTINO

Hola José,  gracias por tu  ayuda, muy util. Tengo una pregunta, cuando marco la opción  SNI al asociar un certificado, me muestra el siguiente mensaje: "No default SSL site has been created. To support browsers without SNI capabilities, it is recommended to create a default SSL site". Sabes como puedo resolver este problema?  

Lo otro punto es: importo el p7b y luego instalo el .cert, pero al momento de sasosicar al sito (binding) no me muestra el certificado que está instalado, help please!! Gracias.!!!

Responder

by Jose M. Alarcon

Hola:

El mensaje ese te lo saca porque SNI no funciona con navegadores muy antiguos (estilo IE8), por lo que si alguien intenta acceder con alguno de esos navegadores, el servidor no sabrá qué sitio web asignarle, dado que no envía el nombre de dominio junto con la petición HTTPS (ya que SNI es precisamente para eso). Por lo tanto, en esos casos, el servidor le enviará el sitio por defecto o le dará un error en caso de que no tengas uno definido.

Definirlo es muy sencillo: simplemente desmarca la casilla de SNI en uno y solo uno de los dominios que usen SSL en la misma IP y ese se convertirá en el sitio por defecto al que se dirigirá el tráfico SSL que vaya a esa IP y que no tenga especificado un nombre de dominio en la petición.

Respecto a lo segundo, no sé cómo ayudarte. Depende de cómo hayas hecho todo el proceso de gestión el certificado. En realidad si sigues los pasos de IIS (generar un archivo de solicitud, pedir con éste el certificado, descargar el certificado que te han vendido e imortarlo en el sistema) debería salirte sin ningún problema.

Saludos.

Responder

Ricardo Ramirez

Tengo una pregunta, cuantos dominios puedo albergar con 1 solo certificado SSL y esto es posible tenerlo en un vps?

gracias

Responder

Buenas.. gracias por el aporte, queria consultar. Se puede usar dos metodos de autentincacion en iis? te explico rapidamente el escenario. Mis usuarios de mi red lan autentica por AD.. pero ahora quiere que esa web se publique a internet y que los clientes externo a la empresa no pasen por autenticacion de dominio si no como local, dandolo de alta manualmente. Siempre entendiendo que deben entrar al mismo sitio web donde estan los usuario de mi red lan

Responder

by Jose M. Alarcon

Hola:

IIS te permite tener diversos métodos de autenticación activados, por ejemplo contra directorio activo y mediante formularios, etc... pero el hecho de usar uno u otro en cada momento dependerá de tu aplicación.

Saludos.

Responder

Gracias por tu respuesta, la idea  es no exponer el AD a internet.. que autentique de otra mamera los clientes externo. Mediante formulario era los mas cercano pero no entendi bien el concepto.

Saludos.-

Responder

by Jose M. Alarcon

Si no vas a exponer eso a Internet lo puedes hacer con un formulario y mediante código validar contra el directorio activo desde un servidor en la zona desmilitarizada (ese servidor tiene que tener acceso al AD para validarlo). Sino, lo más fácil es que lo albergues en una Web App en Azure y uses Azure AD, que permite crear usuarios externos pero también sincronizar con los del DA de tu oficina, de modo que tienes todo junto en Azure sin problema. Además, a Web App te permite hacer la autenticación de manera automática, sin tener que programar nada.

Yo no lo he hecho nunca con DA, pero sí que lo utilizo con Google Apps, por ejemplo, para autenticar a la gente y permitir solo a los de ciertos dominios. Lo puedes hacer todo solo con configuración, sin tener que programar.

Echa un vistazo a esto: docs.microsoft.com/.../app-service-authentication-overview

Saludos

Responder

Mil gracias por la ayuda! Me sacó de un gran apuro.

Responder

Carlos Parmeggiani

Gracias por la explicacion. muy clara. Sabes hasta cuantos Certificados pueden estar bajo la misma ip? En teroria si mal no te entendi, al pasar el dominio en el SNI, deberian ser tantos como necesitemos, ya que eso diferencia que certificado usar. Estoy usando letencrypt , pero voy en pruebas. Sabes si el standard de letsencrypt usa SNi?
Gracias

Responder

by Jose M. Alarcon

Hola Carlos:

Que yo sepa no hay límite alguno. Yo tengo en un mismo servidor con la misma IP muchos certificados diferentes para diferentes dominios, todos de Let's Encrypt.

Por cierto, si usas mucho Let's Encrypt y te ahorras un dinero, por favor, dónales para que puedan mantenerse de cara al futuro. Será bueno para ti y para todos.

Saludos.

Responder

Carlos Parmeggiani

Hola Jose,
Mira lo acabo de implementar con estos tres sitios y anduvo perfecto.
Gracias por tu comentario y si obvio lo de Let's Encrypt , unos genios

Responder

Agregar comentario