Server Name Indication ( SNI ) es una extensión del protocolo de red informática Transport Layer Security (TLS) mediante el cual un cliente indica a qué nombre de host está intentando conectarse al inicio del proceso de enlace. [1] La extensión permite que un servidor presente uno de los múltiples certificados posibles en la misma dirección IP y número de puerto TCP y, por lo tanto, permite que varios sitios web seguros ( HTTPS ) (o cualquier otro servicio sobre TLS) sean atendidos por la misma dirección IP sin requerir que todos esos sitios usen el mismo certificado. Es el equivalente conceptual del 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 enlace TLS/SSL. El nombre de host deseado no está cifrado en la extensión SNI original, por lo que un espía puede ver qué sitio se está solicitando. La extensión SNI se especificó en 2003 en RFC 3546
Antecedentes del problema
Antes de SNI, al realizar una conexión TLS, el cliente no tenía forma de especificar a qué sitio intentaba conectarse. Por lo tanto, si un servidor aloja varios sitios en un solo receptor, el servidor no tiene forma de saber qué certificado usar en el protocolo TLS. En más detalle, al realizar una conexión TLS, el cliente solicita un certificado digital al 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 los nombres incluidos en el certificado. Si se produce una coincidencia, la conexión continúa de manera normal. Si no se encuentra una coincidencia, se puede advertir al usuario sobre la discrepancia y la conexión puede interrumpirse, ya que la falta de coincidencia puede indicar un intento de ataque de intermediario. Sin embargo, algunas aplicaciones permiten al usuario omitir la advertencia para continuar con la conexión, y el usuario asume la responsabilidad de confiar en el certificado y, por extensión, en la conexión.
Sin embargo, puede resultar difícil (o incluso imposible debido a la falta de una lista completa de todos los nombres por adelantado) obtener un único certificado que cubra todos los nombres de los que será responsable un servidor. Es probable que un servidor que sea responsable de varios nombres de host deba presentar un certificado diferente para cada nombre (o pequeño grupo de nombres). Es posible utilizar subjectAltName para incluir varios dominios controlados por una persona [2] en un único certificado. Estos "certificados de comunicaciones unificadas" deben volver a emitirse cada vez que cambia la lista de dominios.
El alojamiento virtual basado en nombres permite que varios nombres de host DNS sean alojados por un único servidor (normalmente un servidor web) en la misma dirección IP. Para lograrlo, 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 utiliza HTTPS, el protocolo de enlace TLS se produce antes de que el servidor vea ningún encabezado HTTP. Por lo tanto, no era posible que el servidor utilizara la información del encabezado del host HTTP para decidir qué certificado presentar y, como tal, solo los nombres cubiertos por el mismo certificado podían servirse desde la misma dirección IP.
En la práctica, esto significaba que un servidor HTTPS solo podía dar servicio a un dominio (o a un pequeño grupo de dominios) por dirección IP para una navegación segura y eficiente. Asignar una dirección IP independiente 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 ya están agotadas. En el caso de IPv6, aumenta la sobrecarga administrativa al tener varias IP en una sola máquina, aunque el espacio de direcciones no esté agotado. El resultado fue que muchos sitios web se vieron efectivamente limitados para utilizar comunicaciones seguras.
Principios técnicos
SNI soluciona 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 que el servidor seleccione el dominio virtual correcto de forma anticipada y presente al navegador el certificado que contiene el nombre correcto. Por lo tanto, con clientes y servidores que implementan SNI, un servidor con una única dirección IP puede servir a un grupo de nombres de dominio para los que no es práctico obtener un certificado común.
La norma SNI se añadió a las RFC de Internet de la IETF en junio de 2003 a través de la RFC 3546, Extensiones de seguridad de la capa de transporte (TLS) . La última versión de la norma es la RFC 6066.
Implicaciones de seguridad
La carga útil de la indicación del nombre del servidor no está cifrada, por lo que el nombre de host del servidor al que el cliente intenta conectarse es visible para un espía pasivo. Esta debilidad del protocolo fue explotada por el software de seguridad para el filtrado y monitoreo de redes [4] [5] [6] y por los gobiernos para implementar la censura. [7]
Actualmente, existen múltiples tecnologías que intentan ocultar la indicación del nombre del servidor:
Dominio al frente
El dominio fronting es una técnica que consiste en reemplazar el nombre de host deseado en SNI por otro alojado en el mismo servidor o, más frecuentemente, en una red de servidores conocida como red de entrega de contenido . Cuando un cliente utiliza el dominio fronting, reemplaza el dominio del servidor en SNI (sin cifrar), pero lo deja en el encabezado del host HTTP (que está cifrado por TLS) para que el servidor pueda servir el contenido correcto. El dominio fronting viola el estándar que define a SNI en sí, por lo que su compatibilidad es limitada (muchos servicios comprueban que el host de SNI coincida con el host del encabezado HTTP y rechazan las conexiones con SNI con dominio fronting por considerarlas inválidas). Si bien el dominio fronting se utilizó en el pasado para evitar la censura gubernamental, [8] su popularidad disminuyó porque los principales proveedores de la 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 encriptado
Encrypted Client Hello ( 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 TLS 1.3. [10] ECH cifra la carga útil con una clave pública que la parte confiada (un navegador web) necesita conocer de antemano, lo que significa que ECH es más eficaz con CDN grandes que los proveedores de navegadores conocen de antemano.
La versión inicial de 2018 de esta extensión se llamó Encrypted SNI (ESNI) [11] y sus implementaciones se implementaron de manera "experimental" para abordar este riesgo de escuchas ilegales de dominio. [12] [13] [14] Firefox 85 eliminó la compatibilidad con ESNI. [15] A diferencia de ECH, Encrypted SNI encriptó solo el SNI en lugar de todo el Client Hello. [16] La compatibilidad con opt-in para esta versión se incorporó a Firefox en octubre de 2018 [17] y requirió habilitar DNS sobre HTTPS (DoH). [18]
En marzo de 2020, ESNI se modificó para convertirla en la extensión ECH, después de que un análisis demostrara que cifrar solo la SNI no es suficiente. 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 formato 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 en el mundo real de ESNI ha expuesto limitaciones de interoperabilidad. [19] El nombre corto era ECHO en marzo de 2020 [16] y cambió a ECH en mayo de 2020. [20]
Tanto ESNI como ECH son compatibles únicamente con TLS 1.3 porque se basan en KeyShareEntry, que se definió por primera vez en TLS 1.3. [21] [22] Además, para utilizar ECH, el cliente no debe proponer versiones de TLS inferiores a 1.3. [23]
Otro borrador de Internet incorpora un parámetro para transmitir las claves públicas ECH a través de los tipos de registros DNS HTTPS y SVCB , acortando el proceso de protocolo de enlace. [24] [25]
En agosto de 2020, el Gran Cortafuegos de China comenzó a bloquear el tráfico ESNI, aunque todavía permite el tráfico ECH. [26]
En octubre de 2020, el proveedor de servicios de Internet ruso Rostelecom y su operador móvil Tele2 comenzaron a bloquear el tráfico ESNI. [27] En septiembre del mismo año, el Ministerio de Censura ruso Roscomnadzor planeó prohibir una serie de protocolos de cifrado, entre los que se encontraban TLS 1.3 y ESNI, que obstaculizaban la censura del acceso a los sitios web. [28] [29] [30]
En julio de 2023, en la reunión IETF117 , los miembros que trabajan en ECH informaron que Chrome y Firefox estaban realizando una prueba de muestra del 1% y que el equipo espera que el borrador final se envíe a la evaluación del IESG en enero de 2024. [31] [32]
En septiembre de 2023, Cloudflare comenzó a admitir ECH para dominios alojados. [33]
En octubre de 2023, Mozilla habilitó ECH de forma predeterminada en Firefox v118, siempre que DNS sobre HTTPS (DoH) también esté habilitado [34] [35] para mantener las solicitudes DNS para registros de recursos HTTPS protegidas de escuchas en la red informática. [36] En septiembre de 2023, la versión 117 de Chromium (usada en Google Chrome , Microsoft Edge , Samsung Internet y Opera ) lo habilitó de forma predeterminada, requiriendo también que las claves se implementen en registros de recursos HTTPS en DNS. [37] [38]
Implementación
En 2004, el proyecto EdelKey creó un parche para añadir TLS/SNI a OpenSSL . [39] En 2006, este parche se trasladó a la rama de desarrollo de OpenSSL y, en 2007, se trasladó a OpenSSL 0.9.8 (publicado por primera vez en 0.9.8f [40] ). Los primeros navegadores web con soporte para SNI aparecieron en 2006 (Mozilla Firefox 2.0, Internet Explorer 7), y los servidores web más tarde (Apache HTTP Server en 2009, Microsoft IIS en 2012).
Para que un programa de aplicación implemente SNI, la biblioteca TLS que utiliza debe implementarla 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
Referencias
- ^ Blake-Wilson, Simon; Nystrom, Magnus; Hopwood, David; Mikkelsen, Jan; Wright, Tim (junio de 2003). "Server Name ssl_ocsp_responderIndication". Extensiones de seguridad de la capa de transporte (TLS). IETF . pág. 8. sec. 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 . Consultado el 3 de julio de 2024 .
- ^ "Filtro web: función de extensión SNI y bloqueo HTTPS". www3.trustwave.com . Consultado el 3 de julio de 2024 .
- ^ "Sophos UTM: Descripció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). "Evitar de manera eficiente el filtrado HTTPS basado en SNI". Simposio internacional IFIP/IEEE de 2015 sobre gestión integrada de redes (IM) . págs. 990–995. doi :10.1109/INM.2015.7140423. ISBN . 978-1-4799-8241-7. Número de identificación del sujeto 14963313.
- ^ "Corea del Sur está censurando Internet espiando el tráfico de SNI". BleepingComputer . Consultado el 18 de febrero de 2019 .
- ^ "La aplicación de chat encriptada Signal evita la censura del gobierno". Engadget . Consultado el 3 de julio de 2024 .
- ^ "Amazon amenaza con suspender la cuenta de AWS de Signal por eludir la censura". Signal . Consultado el 2 de mayo de 2018 .
- ^ Rescorla, Eric; Oku, Kazuho; Sullivan, Nick; Wood, Christopher A. (9 de octubre de 2023). Cliente con cifrado TLS (informe). Grupo de trabajo de ingeniería de Internet.
- ^ Rescorla, Eric; Oku, Kazuho; Sullivan, Nick; Wood, Christopher A. (6 de abril de 2023). "Draft-ietf-TLS-esni-14".
- ^ "ESNI: una actualización para proteger la privacidad de HTTPS". Blog de enlaces profundos de la EFF . 24 de septiembre de 2018.
- ^ Claburn, Thomas (17 de julio de 2018). "No se asusten por el dominio fronting, se está hackeando una solución SNI". The Register . Consultado el 10 de octubre de 2018 .
- ^ Ghedini, Alessandro (24 de septiembre de 2018). "Encrypt it or lose it: how encrypted SNI works" (Cifrarlo o perderlo: cómo funciona el SNI cifrado). The Cloudflare Blog (El blog de Cloudflare) . Consultado el 13 de mayo de 2019 .
- ^ "1667743 - Limpiar código esni no utilizado". bugzilla.mozilla.org . Consultado el 7 de abril de 2022 .
- ^ ab "ESNI -> ECHO · tlswg/draft-ietf-tls-esni". GitHub .
- ^ Eric, Rescorla (18 de octubre de 2018). "Encrypted SNI Comes to Firefox Nightly". Blog de seguridad de Mozilla . Consultado el 15 de junio de 2020 .
- ^ Daniel, Stenberg. "Curl: Re: Soporte de SNI encriptado (archivo de lista de correo curl-library)". curl.se . Consultado el 15 de junio de 2020 .
- ^ Jacobs, Kevin (7 de enero de 2021). «Encrypted Client Hello: 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". GitHub .
- ^ Ghedini, Alessandro (24 de septiembre de 2018). "Encrypt it or lose it: how encrypted SNI works" (Cifrarlo o perderlo: cómo funciona el SNI cifrado). El blog de Cloudflare . Consultado el 13 de mayo de 2019.
Esta es una extensión de la versión 1.3 y posteriores de TLS y no funciona con versiones anteriores del protocolo.
- ^ "Hacer que ESNI sea compatible con TLS 1.2 · Número 38 · tlswg/draft-ietf-tls-esni". GitHub . Consultado el 9 de agosto de 2020 .
- ^ Rescorla, Eric. "TLS Encrypted Client Hello". tlswg.org . Consultado el 24 de febrero de 2021 .
El cliente... DEBE ofrecer negociar TLS 1.3 o superior.
- ^ Schwartz, Benjamin M.; Bishop, Mike; Nygren, Erik (11 de marzo de 2023). "Enlace de servicios y especificación de parámetros a través del DNS (DNS SVCB y HTTPS RR)". Grupo de trabajo de ingeniería de Internet . Consultado el 25 de julio de 2023 .
- ^ Schwartz, Benjamin M.; Bishop, Mike; Nygren, Erik (26 de septiembre de 2023). "Bootstrapping TLS Encrypted ClientHello with DNS Service Bindings". Grupo de trabajo de ingeniería de Internet . Consultado el 1 de octubre de 2023 .
- ^ 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 .
- ^ "El Ministerio de Desarrollo Digital de Rusia quiere prohibir las últimas tecnologías de cifrado en RuNet". Meduza . Consultado el 18 de junio de 2021 .
- ^ Cimpanu, Catalin. «Rusia quiere prohibir el uso de protocolos seguros como TLS 1.3, DoH, DoT, ESNI». ZDNet . Consultado el 18 de junio de 2021 .
- ^ Sherman, Justin (25 de septiembre de 2020). "Rusia está probando algo nuevo para aislar su Internet del resto del mundo". Revista Slate . Consultado el 18 de junio de 2021 .
- ^ Grupo de trabajo sobre TLS (26 de julio de 2023). «Minutos IETF117: tls: miércoles 20:00». IETF Datatracker . Archivado desde el original el 2 de agosto de 2023. Consultado el 2 de agosto de 2023 .
- ^ TLS Working Group (26 de julio de 2023). IETF117-TLS-20230726-2000. YouTube (vídeo). San Francisco: Internet Engineering Task Force . Consultado el 2 de agosto de 2023 .
- ^ Achiel van der Mandele; Alessandro Ghedini; Christopher Wood; Rushil Mehra. "Cliente encriptado Hola: la última pieza del rompecabezas hacia la privacidad". El blog de Cloudflare . Consultado el 1 de octubre de 2023 .
- ^ "Entender Encrypted Client Hello (ECH) | Ayuda de Firefox". support.mozilla.org . Consultado el 4 de octubre de 2023 .
- ^ "Saludamos (encriptados) a una Internet más privada. | El blog de Mozilla". blog.mozilla.org . Consultado el 4 de octubre de 2023 .
- ^ "Encrypted Client Hello (ECH) - Preguntas frecuentes | Ayuda de Firefox". support.mozilla.org . Consultado el 25 de noviembre de 2023 .
- ^ "Cómo deshabilitar ClientHello cifrado con TLS en Google Chrome mediante PowerShell". Chaser Systems Ltd. 9 de octubre de 2023.
- ^ "Función: Cliente Hello cifrado TLS (ECH)". Estado de la plataforma Chrome . Google . 12 de diciembre de 2023 . Consultado el 21 de febrero de 2024 .
- ^ "Proyecto EdelKey". edelweb.fr . Consultado el 20 de febrero de 2019 .
- ^ "CAMBIOS EN OpenSSL". Archivado desde el original el 20 de abril de 2016.
- ^ "Alojamiento público de Git: alpine.git/Commit".
- ^ "Cómo mejorar la privacidad en Microsoft Edge al habilitar Encrypted Client Hello". Neowin . 25 de julio de 2023. Archivado desde el original el 5 de diciembre de 2022 . Consultado el 25 de julio de 2023 .
- ^ ab "Desarrollo de ECH para OpenSSL (DEfO)". defo.ie . Tolerant Networks Limited. 24 de agosto de 2022. Archivado desde el original el 1 de septiembre de 2022.
- ^ "Entender Encrypted Client Hello (ECH) | Ayuda de Firefox". support.mozilla.org . Consultado el 4 de octubre de 2023 .
- ^ "curl/docs/ECH.md at cbe7fad20d969626a5c4eb0501a273dfe812bcd3 · curl/curl". GitHub . Consultado el 26 de julio de 2023 .
- ^ "curl/docs/ROADMAP.md at 50490c0679fcd0e50bb3a8fbf2d9244845652cf0 · curl/curl". GitHub . Consultado el 26 de julio de 2023 .
- ^ "Función: Cliente encriptado TLS Hello (ECH)". Estado de la plataforma Chrome . Archivado desde el original el 28 de mayo de 2023 . Consultado el 25 de julio de 2023 .
Safari: Sin señal
- ^ "Notas de la 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 admite SNI". Bugzilla@Mozilla . 29 de octubre de 2017 . Consultado el 9 de noviembre de 2017 .
- ^ "Preguntas y respuestas sobre SSL de IBM HTTP Server". IBM . Consultado el 8 de marzo de 2011 .
- ^ "¿IHS 8 funciona con 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 .
- ^ "#2275 (Compatibilidad con cliente cifrado Hello) – nginx". trac.nginx.org . Consultado el 6 de julio de 2023 .
- ^ "Mejoras de rendimiento". help.hcltechsw.com . Consultado el 6 de febrero de 2024 .
- ^ "ECH por kazuho · Solicitud de incorporación de cambios n.° 3164 · h2o/h2o". GitHub . Consultado el 6 de julio de 2023 .
- ^ "Directivas base - Configurar". H2O - el servidor HTTP/2 optimizado . Archivado desde el original el 29 de mayo de 2023. Consultado el 18 de julio de 2023 .
- ^ "Actualización del borrador-ietf-tls-esni-13". Repositorio de código BoringSSL . Consultado el 6 de julio de 2023 .
- ^ "Aviso de lanzamiento de Dell BSAFE Micro Edition Suite 5.0" . Consultado el 18 de octubre de 2022 .
- ^ "Compatibilidad con ECH (#595) · Problemas · gnutls / GnuTLS · GitLab". GitLab . 27 de octubre de 2018 . Consultado el 26 de julio de 2023 .
- ^ "Soporte ESNI · Issue #546 · libressl/portable". GitHub . Consultado el 26 de julio de 2023 .
- ^ "116168 - Soporte de extensión de indicación de nombre de servidor TLS en NSS". bugzilla.mozilla.org . Consultado el 6 de julio de 2023 .
- ^ "D101050 Error 1681585: se añade compatibilidad con ECH al autoservicio". phabricator.services.mozilla.com . Consultado el 6 de julio de 2023 .
- ^ "Error 360421: Implementación de la indicación del nombre del servidor TLS para servidores". Bugzilla@Mozilla . 11 de noviembre de 2006 . Consultado el 30 de octubre de 2012 .
- ^ "Compatibilidad con el cliente cifrado Hello (antes conocido como ESNI) · Problema n.° 7482 · openssl/openssl". GitHub . Consultado el 6 de julio de 2023 .
- ^ "[ech] reescritura de ESNI en el borrador 15 de ECH por kazuho · Solicitud de incorporación de cambios n.° 437 · h2o/picotls". GitHub . Consultado el 6 de julio de 2023 .
- ^ McCarney, Daniel (31 de mayo de 2024). "Compatibilidad con Encrypted Client Hello (ECH) del lado del servidor". GitHub . Consultado el 22 de agosto de 2024 .
- ^ "Falta la selección de certificado para servidores · Problema n.° 310 · apple/swift-nio-ssl". GitHub . Consultado el 26 de julio de 2023 .
- ^ "Agrega compatibilidad con TLS v1.3 Encrypted Client Hello (ECH) draft-ietf-tls… · wolfSSL/wolfssl@6b6ad38". GitHub . Consultado el 25 de julio de 2023 .
- ^ "crypto/tls: implement draft-ietf-tls-esni-13 · cloudflare/go@4c13101". GitHub . Consultado el 25 de julio de 2023 .
- ^ "src/tls.c · master · Hugo Leisink / Hiawatha web server · GitLab". GitLab . 5 de abril de 2023 . Consultado el 26 de julio de 2023 .
- ^ "Registro de cambios de HAProxy 1.5" . Consultado el 28 de diciembre de 2020 .
- ^ "Compatibilidad con ECH (Encrypted client hello) · Problema n.° 1924 · haproxy/haproxy". GitHub . Consultado el 26 de julio de 2023 .
- ^ "Novedades de OpenBSD 6.1" . Consultado el 13 de junio de 2021 .
- ^ "src/lib/libtls/tls.c at master · openbsd/src". GitHub . Consultado el 26 de julio de 2023 .
Enlaces externos
- RFC 6066 (deja obsoleto el RFC 4366, que dejó obsoleto el RFC 3546)
- Wiki de Mozilla - Cliente de saludo cifrado (ECH)