La Indicación de nombre de servidor ( SNI ) es una extensión del protocolo de redes informáticas Transport Layer Security (TLS) mediante el cual un cliente indica a qué nombre de host está intentando conectarse al inicio del proceso de negociación. [1] Esto permite que un servidor presente varios certificados en la misma dirección IP y número de puerto TCP y, por lo tanto, permite varios sitios web seguros ( HTTPS ) (o cualquier otro serviciosobre TLS) para ser atendidos por la misma dirección IP sin requerir que todos esos sitios usen el mismo certificado. Es el equivalente conceptual al alojamiento virtual basado en nombres HTTP / 1.1 , pero para HTTPS. Esto también permite que un proxy reenvíe el tráfico del cliente al servidor correcto durante el protocolo de enlace TLS / SSL. El nombre de host deseado no está encriptado en la extensión SNI original, por lo que un fisgón puede ver qué sitio se está solicitando.
Antecedentes del problema
Al realizar una conexión TLS, el cliente solicita un certificado digital del servidor web. Una vez que el servidor envía el certificado, el cliente lo examina y compara el nombre al que intentaba conectarse con el nombre o nombres incluidos en el certificado. Si se produce una coincidencia, la conexión procede con normalidad. Si no se encuentra una coincidencia, se puede advertir al usuario de la discrepancia y la conexión puede abortar ya que la discrepancia puede indicar un intento de ataque de intermediario . Sin embargo, algunas aplicaciones permiten al usuario omitir la advertencia para continuar con la conexión, asumiendo el usuario la responsabilidad de confiar en el certificado y, por extensión, en la conexión.
Sin embargo, puede ser difícil, o incluso imposible, debido a la falta de una lista completa de todos los nombres por adelantado, obtener un solo certificado que cubra todos los nombres de los que será responsable un servidor. Es probable que un servidor responsable de varios nombres de host deba presentar un certificado diferente para cada nombre (o un pequeño grupo de nombres). Es posible usar subjectAltName para contener múltiples dominios controlados por una persona [2] en un solo certificado. Dichos "certificados de comunicaciones unificadas" deben volver a emitirse cada vez que cambia la lista de dominios.
El alojamiento virtual basado en nombres permite alojar varios nombres de host DNS en un solo servidor (normalmente un servidor web) en la misma dirección IP. Para lograr esto, el servidor utiliza un nombre de host presentado por el cliente como parte del protocolo (para HTTP, el nombre se presenta en el encabezado del host ). Sin embargo, cuando se usa HTTPS, el protocolo de enlace TLS ocurre antes de que el servidor vea los encabezados HTTP. Por lo tanto, no fue posible que el servidor usara la información en el encabezado del host HTTP para decidir qué certificado presentar y, como tal, solo los nombres cubiertos por el mismo certificado podrían ser servidos desde la misma dirección IP.
En la práctica, esto significaba que un servidor HTTPS solo podía servir a un dominio (o un pequeño grupo de dominios) por dirección IP para una navegación segura y eficiente. La asignación de una dirección IP separada para cada sitio aumenta el costo del alojamiento, ya que las solicitudes de direcciones IP deben justificarse ante el registro regional de Internet y las direcciones IPv4 ahora están agotadas . Para IPv6, aumenta la sobrecarga administrativa al tener varias direcciones IP en una sola máquina, aunque el espacio de direcciones no esté agotado. El resultado fue que muchos sitios web se vieron efectivamente restringidos al uso de comunicaciones seguras.
Principios tecnicos
SNI aborda este problema haciendo que el cliente envíe el nombre del dominio virtual como parte del mensaje ClientHello de la negociación TLS . [3] Esto permite al servidor seleccionar el dominio virtual correcto con anticipación y presentar al navegador el certificado que contiene el nombre correcto. Por lo tanto, con clientes y servidores que implementan SNI, un servidor con una sola dirección IP puede servir a un grupo de nombres de dominio para los cuales no es práctico obtener un certificado común.
SNI se añadió a la IETF 's RFC de Internet en junio de 2003 a través de RFC 3546, extensiones Transport Layer Security (TLS) . La última versión del estándar es RFC 6066.
Implicaciones de seguridad
La carga útil de indicación de nombre de servidor no está cifrada, por lo que el nombre de host del servidor al que el cliente intenta conectarse es visible para un fisgón pasivo. Esta debilidad del protocolo fue aprovechada por software de seguridad para el filtrado y monitoreo de redes [4] [5] [6] y los gobiernos para implementar la censura. [7] Actualmente, hay varias tecnologías que intentan cifrar la indicación del nombre del servidor.
Frente de dominio
El frente de dominio es una técnica para reemplazar el nombre de host deseado en SNI con otro alojado en el mismo servidor o, más frecuentemente, en una red de servidores conocida como Content Delivery Network. Cuando un cliente usa la interfaz de dominio, reemplaza el dominio del servidor en SNI (sin encriptar), pero lo deja en el encabezado del host HTTP (que está encriptado por TLS) para que el servidor pueda entregar el contenido correcto. El frente de dominio viola el estándar que define al SNI en sí mismo, por lo que su compatibilidad es limitada (muchos servicios verifican que el host SNI coincida con el host de encabezado HTTP y rechazan las conexiones con SNI frente al dominio como no válidas). Si bien en el pasado se usó la interfaz de dominio para evitar la censura del gobierno, [8] su popularidad disminuyó porque los principales proveedores de nube (Google, AWS de Amazon y CloudFront) lo prohíben explícitamente en sus TOS y tienen restricciones técnicas en su contra. [9]
Hola cliente cifrado
Client Hello cifrado ( ECH ) es una extensión del protocolo TLS 1.3 que permite el cifrado de todo el mensaje Client Hello, que se envía durante la etapa inicial de la negociación de TLS 1.3. ECH cifra la carga útil con una clave pública que la parte que confía (un navegador web) necesita conocer de antemano, lo que significa que ECH es más eficaz con CDN grandes conocidos por los proveedores de navegadores de antemano.
La versión inicial de 2018 de esta extensión se llamó Encrypted SNI ( ESNI ) [10] y sus implementaciones se implementaron de manera "experimental" para abordar este riesgo de escuchas de dominio. [11] [12] [13] A diferencia de ECH, el SNI cifrado sólo cifró el SNI en lugar de todo el Client Hello. [14] El soporte opt-in para esta versión se incorporó a Firefox en octubre de 2018 [15] y requería habilitar DNS sobre HTTPS. [dieciséis]
En marzo de 2020, ESNI se reformuló en la extensión ECH, después de que el análisis demostrara que cifrar solo el SNI es insuficiente. Por ejemplo, las especificaciones permiten que la extensión de clave precompartida contenga cualquier dato para facilitar la reanudación de la sesión, incluso la transmisión de una copia en texto sin cifrar de exactamente el mismo nombre de servidor cifrado por ESNI. Además, cifrar las extensiones una por una requeriría una variante cifrada de cada extensión, cada una con posibles implicaciones de privacidad, e incluso eso expone el conjunto de extensiones anunciadas. Por último, la implementación de ESNI en el mundo real ha expuesto las limitaciones de interoperabilidad. [17] El nombre abreviado era ECHO en marzo de 2020 [14] y cambió a ECH en mayo de 2020. [18]
Tanto ESNI como ECH son compatibles solo con TLS 1.3 porque se basan en KeyShareEntry, que se definió por primera vez en TLS 1.3. [19] Además, para utilizar ECH, el cliente no debe proponer versiones de TLS inferiores a 1.3. [20]
En agosto de 2020, el Gran Cortafuegos de China comenzó a bloquear el tráfico ESNI, sin dejar de permitir el tráfico ECH. [21]
En octubre de 2020, el ISP ruso Rostelecom y su operador móvil Tele2 comenzaron a bloquear el tráfico ESNI. [22]
Implementación
En 2004, el proyecto EdelKey creó un parche para agregar TLS / SNI a OpenSSL . [23] En 2006, este parche se trasladó a la rama de desarrollo de OpenSSL, y en 2007 se trasladó a OpenSSL 0.9.8 (lanzado por primera vez en 0.9.8f [24] ).
Para que un programa de aplicación implemente SNI, la biblioteca TLS que utiliza debe implementarlo y la aplicación debe pasar el nombre de host a la biblioteca TLS. Para complicar aún más las cosas, la biblioteca TLS puede estar incluida en el programa de aplicación o ser un componente del sistema operativo subyacente. Debido a esto, algunos navegadores implementan SNI cuando se ejecutan en cualquier sistema operativo, mientras que otros lo implementan solo cuando se ejecutan en ciertos sistemas operativos. [ cita requerida ]
Apoyo
Software | Tipo | Soportado | Notas | Soportado desde |
---|---|---|---|---|
Alpine (cliente de correo electrónico) | Cliente de correo electrónico IMAP | sí | Desde la versión 2.22 [26] | 2019-02-18 |
explorador de Internet | navegador web | sí | Desde la versión 7 en Vista (no compatible con XP) | 2006 |
Borde | navegador web | sí | Todas las versiones | |
Mozilla Firefox | navegador web | sí | Desde la versión 2.0 | 2006 |
rizo | Biblioteca y herramienta de línea de comandos | sí | Desde la versión 7.18.1 | 2008 |
Safari | navegador web | sí | No es compatible con Windows XP | |
Google Chrome | navegador web | sí | 2010 | |
BlackBerry 10 | navegador web | sí | Compatible con todas las versiones BB10 | 2013 |
BlackBerry OS | ||||
Barracuda WAF | Proxy inverso | sí | Compatible desde la versión 7.8 [27] | 2013 |
Barracuda ADC | Equilibrador de carga | sí | Soporte de frontend desde la versión 4.0 y soporte de backend desde v5.2 [28] | Frontend 2013 / Backend 2015 |
Windows Mobile | navegador web | Algún tiempo después de 6.5 | ||
Navegador predeterminado de Android | navegador web | sí | Honeycomb (3.x) para tabletas y Ice Cream Sandwich (4.x) para teléfonos | 2011 |
Firefox para Android | navegador web | sí | Soportado para navegar. La sincronización y otros servicios admiten SNI solo desde la versión 86. [29] | |
wget | Herramienta de línea de comandos | sí | Desde la versión 1.14 | 2012 |
Navegador Nokia para Symbian | navegador web | No | ||
Opera Mobile para Symbian | navegador web | No | No compatible con Series60 | |
Dillo | navegador web | sí | Desde la versión 3.1 | 2016 |
Servidor HTTP de IBM | Servidor web | sí | Desde la versión 9.0.0 [30] [31] | |
Apache Tomcat | Servidor web | sí | No admitido antes de 8.5 (backport desde 9) | |
Servidor HTTP Apache | Servidor web | sí | Desde la versión 2.2.12 | 2009 |
Microsoft IIS | Servidor web | sí | Desde la versión 8 | 2012 |
nginx | Servidor web | sí | Desde la versión 0.5.23 | 2007 |
Embarcadero | Servidor web | sí | Desde la versión 9.3.0 | 2015 |
Dominó HCL | Servidor web | sí | Desde la versión 11.0.1 | 2020 |
Qt | Biblioteca | sí | Desde la versión 4.8 | 2011 |
Lado del servidor Mozilla NSS | Biblioteca | No | [32] | |
Cuarta dimensión | Biblioteca | No | No compatible con 15.2 o anterior | |
Java | Biblioteca | sí | Desde la versión 1.7 | 2011 |
ColdFusion / Lucee | Biblioteca | sí | ColdFusion desde la versión 10 actualización 18, 11 actualización 7, Lucee desde la versión 4.5.1.019, versión 5.0.0.50 | 2015 |
Erlang | Biblioteca | sí | Desde la versión r17 | 2013 |
Ir | Biblioteca | sí | Desde la versión 1.4 | 2011 |
Perl | Biblioteca | sí | Desde la Net::SSLeay versión 1.50 y la IO::Socket::SSL versión 1.56 | 2012 |
PHP | Biblioteca | sí | Desde la versión 5.3 | 2014 |
Pitón | Biblioteca | sí | Apoyado en 2.x de 2.7.9 y 3.x de 3,2 (en ssl , urllib[2] y httplib módulos) | 2011 para Python 3.xy 2014 para Python 2.x |
Rubí | Biblioteca | sí | Desde la versión 2.0 (en net/http ) | 2011 |
Hiawatha | Servidor web | sí | Desde la versión 8.6 | 2012 |
lighttpd | Servidor web | sí | Desde la versión 1.4.24 | 2009 |
HAProxy | Equilibrador de carga | sí | Desde la versión 1.5-dev12 [33] | 2012 |
OpenBSD httpd | Servidor web | sí | Desde la versión 6.1 de OpenBSD [34] | 2017-04-11 |
Referencias
- ^ Blake-Wilson, Simon; Nystrom, Magnus; Hopwood, David; Mikkelsen, Jan; Wright, Tim (junio de 2003). "Indicación del nombre del servidor" . Extensiones de seguridad de la capa de transporte (TLS) . IETF . pag. 8. seg. 3.1. doi : 10.17487 / RFC3546 . ISSN 2070-1721 . RFC 3546 .
- ^ "¿Qué es un certificado SSL de dominio múltiple (UCC)?" . GoDaddy .
- ^ "Indicación del nombre del servidor TLS" . Diario de Paul .
- ^ "Filtro web: función de extensión SNI y bloqueo HTTPS" . www3.trustwave.com . Consultado el 20 de febrero de 2019 .
- ^ "Sophos UTM: comprensión del filtrado web de Sophos" . Comunidad de Sophos . Consultado el 20 de febrero de 2019 .
- ^ Chrisment, Isabelle; Goichot, Antoine; Cholez, Thibault; Shbair, Wazen M. (11 de mayo de 2015). "Omitiendo eficazmente el filtrado HTTPS basado en SNI" . 2015 Simposio Internacional IFIP / IEEE sobre Gestión Integrada de Redes (IM) . págs. 990–995. doi : 10.1109 / INM.2015.7140423 . ISBN 978-1-4799-8241-7. S2CID 14963313 .
- ^ "Corea del Sur está censurando Internet husmeando en el tráfico SNI" . BleepingComputer . Consultado el 18 de febrero de 2019 .
- ^ "La aplicación de chat encriptada Signal elude la censura del gobierno" . Engadget . Consultado el 4 de enero de 2017 .
- ^ "Amazon amenaza con suspender la cuenta de AWS de Signal por eludir la censura" . Señal . Consultado el 2 de mayo de 2018 .
- ^ https://tools.ietf.org/html/draft-ietf-tls-esni
- ^ "ESNI: una actualización de protección de la privacidad a HTTPS" . Blog de EFF DeepLinks .
- ^ Claburn, Thomas (17 de julio de 2018). "Que no cunda el pánico por el frente de dominio, una solución de SNI está siendo pirateada" . El registro . Consultado el 10 de octubre de 2018 .
- ^ "Cifrelo o piérdalo: cómo funciona el SNI cifrado" . El blog de Cloudflare . 24 de septiembre de 2018 . Consultado el 13 de mayo de 2019 .
- ^ a b "ESNI -> ECHO · tlswg / draft-ietf-tls-esni" .
- ^ Eric, Rescorla. "SNI cifrado llega a Firefox todas las noches" . Blog de seguridad de Mozilla . Consultado el 15 de junio de 2020 .
- ^ Daniel, Stenberg. "archivo de lista de correo de curl-library" . curl.haxx.se . Consultado el 15 de junio de 2020 .
- ^ Jacobs, Kevin. "Hola cliente cifrado: el futuro de ESNI en Firefox" . Blog de seguridad de Mozilla . Consultado el 9 de enero de 2021 .
- ^ "s / ECHO / ECH · tlswg / draft-ietf-tls-esni" .
- ^ "Hacer compatible ESNI TLS 1.2 · Número 38 · tlswg / draft-ietf-tls-esni" . GitHub . Consultado el 9 de agosto de 2020 .
- ^ Rescorla, Eric. "Hola cliente cifrado TLS" . tlswg.org . Consultado el 24 de febrero de 2021 .
El cliente ... DEBE ofrecer negociar TLS 1.3 o superior.
- ^ Cimpanu, Catalin. "China ahora está bloqueando todo el tráfico HTTPS cifrado que utiliza TLS 1.3 y ESNI" . ZDNet . Consultado el 9 de agosto de 2020 .
- ^ "Почему Ростелеком блокирует ESNI трафик?" . qna.habr.com (en ruso). 11 de octubre de 2020 . Consultado el 30 de octubre de 2020 .
- ^ "Proyecto EdelKey" . www.edelweb.fr . Consultado el 20 de febrero de 2019 .
- ^ "CAMBIOS DE OpenSSL" . Archivado desde el original el 20 de abril de 2016.
- ^ "CAcert VHostTaskForce" . CAcert Wiki . Archivado desde el original el 22 de agosto de 2009 . Consultado el 27 de octubre de 2008 .
- ^ https://repo.or.cz/alpine.git/commit/08fcd1b86979b422eb586e56459d6fe15333e500
- ^ "Notas de la versión versión 7.8" . Campus @ Barracuda . Septiembre de 2013 . Consultado el 5 de enero de 2021 .
- ^ "Notas de la versión 5.2" . Campus @ Barracuda . Septiembre de 2015 . Consultado el 5 de enero de 2021 .
- ^ "Error 765064 - HttpClient en uso por Sync y otros servicios no es compatible con SNI" . Bugzilla @ Mozilla . 29 de octubre de 2017 . Consultado el 9 de noviembre de 2017 .
- ^ "Preguntas y respuestas de IBM HTTP Server SSL" . IBM . Consultado el 8 de marzo de 2011 .
- ^ "¿IHS 8 con tecnología Apache 2.2.x?" . IBM . 17 de octubre de 2013. Archivado desde el original el 26 de diciembre de 2015 . Consultado el 9 de noviembre de 2017 .
- ^ "Error 360421 - Implementar indicación de nombre de servidor TLS para servidores" . Bugzilla @ Mozilla . 11 de noviembre de 2006 . Consultado el 30 de octubre de 2012 .
- ^ "Registro de cambios de HAProxy 1.5" . Consultado el 28 de diciembre de 2020 .
- ^ "Novedades de OpenBSD 6.1" . Consultado el 13 de junio de 2021 .
enlaces externos
- RFC 6066 (obsoleto RFC 4366, que dejó obsoleto RFC 3546)