
Tengo servidores web que ejecutan múltiples hosts virtuales y me gustaría evitar que los espías sepan a qué host virtual está accediendo un cliente. Ya existe una extensión TLS para resolver este problema: SNI cifrado. Veo que Cloudflare lo admite en sus servidores y que Firefox tiene una configuración para habilitarlo en el cliente. Sin embargo, no puedo encontrar ninguna documentación sobre cómo habilitar esto en mis propios servidores. ¿Cómo hago esto? (No estoy atado a ninguna pila de servidores en particular y aceptaré cualquier configuración/arquitectura funcional que no sea "ponerlo detrás de Cloudflare").
Respuesta1
La indicación de nombre de servidor cifrado (ESNI) sigue siendo un borrador de Internet; no la encontrará en ninguna implementación de servidor importante, ya que está sujeta a cambios. De hecho, la versión borrador implementada por Firefox admiteborrador-ietf-tls-esni-01que es incompatible conmás nuevoversiones borrador.
Publiqué un estado del ecosistema observado en abril de 2019.aquí:
- La última versión eshttps://datatracker.ietf.org/doc/html/draft-ietf-tls-esni-03
- OpenSSL está esperando a que finalice el borrador.https://github.com/openssl/openssl/issues/7482
- Firefox+NSS admite el borrador -01https://bugzilla.mozilla.org/show_bug.cgi?id=1495120 https://github.com/nss-dev/nss/blob/8a8b92f05d2d/lib/ssl/tls13esni.c
- Cloudflare admite el borrador -01
- picotls lo apoyahttps://github.com/h2o/picotls/pull/155
- Go crypto/tls no lo admitirá hasta que ESNI esté ampliamente implementado:https://github.com/golang/go/issues/9671#issuecomment-439561672
Como puede ver, OpenSSL, utilizado por Nginx y Apache, no lo admite. Podrías intentar construirCaddiecon una biblioteca Go crypto/tls parcheada (usandoeste PR de tls-tris), pero es posible que no funcione con el tiempo.
Experimentación
Paraexperimentacióno con fines educativos, puede utilizar esnitool y tris-localserver detls-tris. Suponiendo que tenga instalada una cadena de herramientas Go adecuada en Linux o macOS, algo como esto debería funcionar:
# Get source code and build stuff
git clone https://github.com/cloudflare/tls-tris -b pwu/esni
cd tls-tris
make build-esnitool
(cd _dev/tris-localserver && ../go.sh build -v -i .)
# Generate ESNI key material, valid for 24 hours (one day)
_dev/esnitool/esnitool -validity=24h -esni-keys-file=esni.pub -esni-private-file=esni.key
Creará dos archivos:
- esni.pub: un valor que
/wFsX6klACQA...AAAA=
debe configurar en DNS. Si desea configurar ESNI parawww.example.com
, cree un registro TXT_esni.www.example.com
con ese/wFsX6klACQA<snip>AAAA=
valor. Este formato se ajusta a la especificación draft-ietf-tls-esni-01 compatible con Firefox y Cloudflare. Lo hacenoUtilice el último borrador de especificación. - esni.priv: un archivo de clave privada, específico para la implementación de la prueba.
El servidor de prueba se puede iniciar de la siguiente manera:
_dev/tris-localserver/tris-localserver -esni-keys=esni.pub -esni-private=esni.priv
Entoncesconfigurar Firefox para permitir el uso de ESNI, ábralo about:config
y configúrelo network.security.esni.enabled
en verdadero. También debe habilitar DNS sobre HTTPS; las instrucciones de Firefox se pueden encontrar en esa página. También puede encontrar más detalles sobre cada preferencia aquí:https://bagder.github.io/TRRprefs/
Es posible que estas instrucciones funcionen ahora, pero no funcionarán en el futuro, ya que es probable que Firefox se actualice para admitir versiones preliminares más recientes. El esnitool anterior también codifica el conjunto de cifrado permitido (AES128-GCM) y el algoritmo de intercambio de claves (X25519). Esto refleja los parámetros que utiliza Cloudflare.
Observación
ESNI implica TLS 1.3, por lo que el certificado y sus nombres de host integrados se cifrarán. Con ESNI habilitado y utilizando un transporte DNS seguro como DNS sobre HTTPS (DoH) o DNS sobre TLS (DoT), el nombre del servidor no será visible en el cable; esto se puede verificar en Wireshark usando un filtrar, como frame contains "wireshark"
cuando se visita wireshark.org
.
Sin embargo, si una única IP solo aloja unos pocos dominios, cualquier adversario pasivo puede adivinar que estás visitando uno de esos dominios. Un gran operador como Cloudflare tiene muchos más dominios en los que esto no supone un gran problema.
Dado que ESNI utiliza claves semiestáticas, el compromiso de la clave privada significa que cualquier espía puede descifrar el nombre del servidor cifrado. Es por eso que las claves ESNI se rotan con frecuencia y se requiere automatización. Cloudflare tiene estas claves ESNI bien integradas en DNS y el servicio HTTPS se actualizan periódicamente.
Para concluir, ESNI es prometedor, pero requiere soporte de clientes (navegadores web), servidores DNS a través de un transporte seguro (DoH/DoT) y servidores web. Todavía está en desarrollo y, a menos que siga de cerca su desarrollo, probablemente no sea una buena idea configurarlo para otras cosas además de la experimentación.
Respuesta2
La respuesta anterior muy detallada inspiró a reutilizar.tls-trispara construir un pequeño proxy inverso esni, que en realidad puede terminar TLS 1.3 con ESNI y reenviar tráfico simple al backend de su elección. Esto permite utilizar ESNI fácilmente sin ninguna modificación del servidor web que esté utilizando. El código fuente y las instrucciones detalladas se pueden encontrar aquí:esni-rev-proxy