TLS 1.3 encara envia el nom del servidor en clar
TLS 1.3 xifra l’handshake però no l’SNI. Llegiu el ClientHello, comproveu una acceptació ECH real i registreu què pot veure encara un observador.
Actualitzar un listener a TLS 1.3 canvia què pot llegir un observador, però no tant com suggereix el número de versió. El ClientHello encara viatja abans que es negociï cap xifratge, i en una connexió ordinària el nom de servidor sol·licitat hi és en text clar. Encrypted Client Hello és el mecanisme que l’amaga, i és un desplegament a part amb els seus propis requisits previs. Executeu aquests quatre passos abans d’escriure una política que pressuposi qualsevol dels dos comportaments.
Què exposa realment l’handshake
TLS 1.3 xifra el certificat del servidor i la major part de l’handshake que segueix el ServerHello. Tot el que el client envia primer queda fora d’aquesta protecció, perquè les claus encara no existeixen. La indicació del nom de servidor forma part d’aquest primer vol, i per això un observador passiu encara la pot llegir sense trencar res.
L’especificació ECH, RFC 9849, canvia això xifrant un ClientHello intern per a un servidor que coopera. L’handshake exterior roman i porta un nom públic que la xarxa pot veure, així que el desplegament encara necessita una identitat exterior que tingui sentit per als intermediaris. Aquest nom exterior és la part que la gent passa per alt quan espera que la connexió esdevingui anònima. És un nom de cobertura, no un nom ocult, i s’ha de resoldre i autenticar com qualsevol altre.
Res d’això no amaga el camí de lliurament. Les adreces d’origen i destinació, els ports, les mides dels paquets i els temps continuen sent observables, i sovint diuen més sobre qui parla que el nom. La resolució de noms i les relacions a nivell d’aplicació són encara una altra capa, cadascuna amb la seva pròpia visibilitat.
Llegir un ClientHello en lloc de suposar
La versió del ServerHello no us diu què ha enviat el client. Mireu el primer vol directament, des d’una posició que representi l’observador que us importa.
openssl s_client -connect app.plant.example:443 -servername app.plant.example -tls1_3 </dev/null> 2>/dev/null | head -20 sudo tcpdump -ni eth0 -c 40 'tcp port 443' -w /tmp/tls.pcap tshark -r /tmp/tls.pcap -Y 'tls.handshake.extensions_server_name' -T fields -e tls.handshake.extensions_server_name
La primera ordre fa un handshake i mostra els paràmetres negociats, inclosa la versió del protocol i el nom que heu sol·licitat. La segona captura els primers paquets d’una connexió real, i la tercera extreu el camp SNI d’aquesta captura. Si el camp és ple, l’observador que heu emulat el pot llegir.
Captureu per separat al costat del client i al camí quan els dos no coincideixin, perquè una captura local pot mostrar un nom que un middlebox reescriu o descarta després. Captureu també des d’un amfitrió que no acabi el TLS ell mateix, ja que un proxy que acaba veu text clar per disseny i no demostra res sobre què veu la xarxa.
Tractar una extensió ECH com una afirmació, no com una prova
Veure una extensió ECH en un ClientHello no vol dir que la connexió fes servir ECH. Els clients envien GREASE ECH quan no tenen una configuració utilitzable, justament perquè els seus handshakes semblin uniformes. L’extensió hi és, el hello intern és un parany, i el nom real continua sent llegible.
dig +short HTTPS app.plant.example openssl s_client -connect app.plant.example:443 -tls1_3 -status </dev/null> 2>/dev/null | grep -i -E 'ech|status_request'
La primera ordre mostra si l’origen publica un registre de recurs HTTPS amb un paràmetre de configuració ECH, que és com els clients aprenen la clau. La segona busca informació d’estat de l’handshake, tot i que el missatge d’èxit d’un client és la prova més sòlida. L’acceptació és el que importa: un servidor que no té la clau corresponent no pot desxifrar el hello intern, i la connexió recula.
Comproveu també el client, ja que el suport dels navegadors i la configuració varien segons la versió i la plataforma. Una política basada en «els navegadors moderns fan servir ECH» és una conjectura sobre un parc, no un fet sobre el vostre parc. Inventarieu les versions que realment es connecten i després proveu-ne una de cada. La mateixa pàgina que funciona des d’un navegador d’escriptori actual pot no amagar res a un client més antic a la mateixa xarxa.
Escriure l’abast de l’observador a la política
Indiqueu on és l’observador i què és visible en aquest punt abans de decidir en què es pot recolzar un control. La connexió d’un navegador a un lloc web, un transport VPN exterior i un proxy que acaba TLS exposen cadascun un conjunt diferent de fets, i una regla escrita per a una posició poques vegades es trasllada netament a una altra.
Si un control depèn de llegir l’SNI, proveu com es comporten els clients desplegats quan ECH està disponible i quan no. Després registreu la conseqüència de compatibilitat, perquè un filtre que deixa de coincidir en silenci és pitjor que un que mai no s’ha desplegat.
Finalment, manteniu la incertesa al registre. Substituir una vella afirmació universal per una de més nova deixa el mateix buit sota un altre nom de protocol, i el proper revisor hi creurà amb la mateixa fermesa.