
Ich habe Webserver, auf denen mehrere virtuelle Hosts laufen, und ich möchte verhindern, dass Lauscher herausfinden, auf welchen virtuellen Host ein Client zugreift. Es gibt bereits eine TLS-Erweiterung zur Lösung dieses Problems: verschlüsseltes SNI. Ich sehe, dass Cloudflare dies auf seinen Servern unterstützt und dass Firefox eine Einstellung hat, um es auf dem Client zu aktivieren. Ich kann jedoch keine Dokumentation dazu finden, wie ich dies auf meinen eigenen Servern aktivieren kann. Wie mache ich das? (Ich bin nicht an einen bestimmten Server-Stack gebunden und akzeptiere jedes funktionierende Setup/jede funktionierende Architektur außer „hinter Cloudflare stellen“.)
Antwort1
Encrypted Server Name Indication (ESNI) ist noch ein Internet-Entwurf, Sie werden ihn in keiner größeren Server-Implementierung finden, da er Änderungen unterliegt. Tatsächlich unterstützt die von Firefox implementierte EntwurfsversionEntwurf-IETF-TLS-ESNI-01was unvereinbar ist mitneuereEntwurfsversionen.
Ich habe einen Status des Ökosystems veröffentlicht, wie er im April 2019 beobachtet wurdeHier:
- Die neueste Version isthttps://datatracker.ietf.org/doc/html/draft-ietf-tls-esni-03
- OpenSSL wartet auf die Fertigstellung des Entwurfs.https://github.com/openssl/openssl/issues/7482
- Firefox+NSS unterstützt Entwurf -01https://bugzilla.mozilla.org/show_bug.cgi?id=1495120 https://github.com/nss-dev/nss/blob/8a8b92f05d2d/lib/ssl/tls13esni.c
- Cloudflare unterstützt Entwurf -01
- picotls unterstützt eshttps://github.com/h2o/picotls/pull/155
- Go crypto/tls wird es nicht unterstützen, bis ESNI weit verbreitet ist:https://github.com/golang/go/issues/9671#issuecomment-439561672
Wie Sie sehen, unterstützt OpenSSL, das von Nginx und Apache verwendet wird, dies nicht. Sie könnten versuchen,Caddiemit einer gepatchten Go crypto/tls-Bibliothek (unter Verwendungdieser PR von tls-tris), aber möglicherweise funktioniert es mit der Zeit nicht.
Experimentieren
FürExperimentierenoder für Bildungszwecke können Sie esnitool und tris-localserver von verwendentls-trisVorausgesetzt, Sie haben eine entsprechende Go-Toolchain unter Linux oder macOS installiert, sollte etwa Folgendes funktionieren:
# 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
Es werden zwei Dateien erstellt:
- esni.pub – ein Wert wie ,
/wFsX6klACQA...AAAA=
den Sie in DNS konfigurieren müssen. Wenn Sie ESNI für konfigurieren möchtenwww.example.com
, erstellen Sie einen TXT-Eintrag für_esni.www.example.com
mit diesem/wFsX6klACQA<snip>AAAA=
Wert. Dieses Format entspricht der Spezifikation draft-ietf-tls-esni-01, wie sie von Firefox und Cloudflare unterstützt wird. EsnichtVerwenden Sie den neuesten Spezifikationsentwurf. - esni.priv – eine private Schlüsseldatei, spezifisch für die Testimplementierung.
Der Testserver kann wie folgt gestartet werden:
_dev/tris-localserver/tris-localserver -esni-keys=esni.pub -esni-private=esni.priv
DannKonfigurieren Sie Firefox, um die Verwendung von ESNI zu ermöglichen, öffnen about:config
und network.security.esni.enabled
auf true setzen. Sie müssen auch DNS-over-HTTPS aktivieren. Anweisungen für Firefox finden Sie auf dieser Seite. Weitere Einzelheiten zu den einzelnen Einstellungen finden Sie auch hier:https://bagder.github.io/TRRprefs/
Diese Anweisungen funktionieren möglicherweise jetzt, werden aber in Zukunft nicht mehr funktionieren, da Firefox wahrscheinlich aktualisiert wird, um neuere Entwurfsversionen zu unterstützen. Das obige Esnitool codiert auch die zulässige Verschlüsselungssuite (AES128-GCM) und den Schlüsselaustauschalgorithmus (X25519) fest. Dies spiegelt die von Cloudflare verwendeten Parameter wider.
Anmerkung
ESNI impliziert TLS 1.3, sodass das Zertifikat und die darin eingebetteten Hostnamen verschlüsselt werden. Wenn ESNI aktiviert ist und ein sicherer DNS-Transport wie DNS-over-HTTPS (DoH) oder DNS-over-TLS (DoT) verwendet wird, ist der Servername tatsächlich nicht auf der Leitung sichtbar. Dies kann in Wireshark mit einem Filter wie „ frame contains "wireshark"
beim Besuch“ überprüft werden wireshark.org
.
Wenn jedoch eine einzelne IP nur wenige Domänen hostet, kann jeder passive Angreifer erraten, dass Sie eine dieser Domänen besuchen. Ein großer Betreiber wie Cloudflare hat viel mehr Domänen, bei denen dies kein großes Problem darstellt.
Da ESNI halbstatische Schlüssel verwendet, bedeutet die Kompromittierung des privaten Schlüssels, dass jeder Lauscher den verschlüsselten Servernamen entschlüsseln kann. Deshalb werden ESNI-Schlüssel häufig rotiert, und Automatisierung ist erforderlich. Cloudflare hat dies gut integriert, ESNI-Schlüssel im DNS und der HTTPS-Dienst werden regelmäßig aktualisiert.
Zusammenfassend lässt sich sagen, dass ESNI vielversprechend ist, aber Unterstützung von Clients (Webbrowsern), DNS-Servern über einen sicheren Transport (DoH/DoT) und Webservern erfordert. Es befindet sich noch in der Entwicklung und wenn Sie die Entwicklung nicht genau verfolgen, ist es wahrscheinlich keine gute Idee, es für andere Zwecke als Experimente einzurichten.
Antwort2
Die vorherige sehr ausführliche Antwort inspirierte zur Wiederverwendungtls-trisum einen winzigen esni-Reverse-Proxy zu erstellen, der TLS 1.3 tatsächlich mit ESNI beenden und den normalen Datenverkehr an das Backend Ihrer Wahl weiterleiten kann. Dies ermöglicht die einfache Verwendung von ESNI ohne jegliche Änderung des von Ihnen verwendeten Webservers. Den Quellcode und eine ausführliche Anleitung finden Sie hier:esni-rev-proxy