
複数の仮想ホストを実行する Web サーバーがあり、クライアントがどの仮想ホストにアクセスしているかを盗聴者が知ることができないようにしたいと考えています。この問題を解決するための TLS 拡張機能として、暗号化された SNI がすでにあります。Cloudflare はサーバー上でこれをサポートしており、Firefox にはクライアント上でこれを有効にする設定があるようです。ただし、自分のサーバー上でこれを有効にする方法についてのドキュメントは見つかりません。どうすればいいのでしょうか? (特定のサーバー スタックに縛られておらず、「Cloudflare の背後に配置する」以外の機能するセットアップ/アーキテクチャであれば何でも受け入れます。)
答え1
暗号化サーバ名表示(ESNI)はまだインターネットドラフトであり、変更される可能性があるため、主要なサーバ実装では見られません。実際、Firefoxで実装されているドラフトバージョンでは、ドラフト-ietf-tls-esni-01これは互換性がありません新しいドラフト版。
2019年4月に観察された生態系の状況を投稿しましたここ:
- 最新バージョンはhttps://datatracker.ietf.org/doc/html/draft-ietf-tls-esni-03
- OpenSSL はドラフトが完成するのを待っています。参考:
- Firefox+NSS はドラフト -01 をサポートしますhttps://bugzilla.mozilla.org/show_bug.cgi?id=1495120 参考:
- Cloudflareはドラフト-01をサポート
- picotlsはそれをサポートしていますhttps://github.com/h2o/picotls/pull/155
- Go crypto/tls は、ESNI が広く導入されるまではサポートされません。https://github.com/golang/go/issues/9671#issuecomment-439561672
ご覧のとおり、NginxとApacheで使用されているOpenSSLはこれをサポートしていません。ビルドしてみてください。キャディーパッチを当てたGo crypto/tlsライブラリ(tls-tris からのこの PR) ですが、時間が経つと機能しなくなる可能性があります。
実験
のために実験または教育目的であれば、esnitoolとtris-localserverを使用することができます。tls-trisLinux または macOS に適切な Go ツールチェーンがインストールされていると仮定すると、次のようなものが機能するはずです。
# 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
次の 2 つのファイルが作成されます。
- esni.pub -
/wFsX6klACQA...AAAA=
DNSで設定する必要がある値。 のESNIを設定する場合は、その値でwww.example.com
のTXTレコードを作成します。この形式は、FirefoxとCloudflareでサポートされているdraft-ietf-tls-esni-01仕様に準拠しています。_esni.www.example.com
/wFsX6klACQA<snip>AAAA=
ない最新のドラフト仕様を使用します。 - esni.priv - テスト実装に固有の秘密キー ファイル。
テスト サーバーは次のように起動できます。
_dev/tris-localserver/tris-localserver -esni-keys=esni.pub -esni-private=esni.priv
それからESNIの使用を有効にするためにFirefoxを設定するを開きabout:config
、network.security.esni.enabled
true に設定します。DNS-over-HTTPS も有効にする必要があります。Firefox の手順はこのページに記載されています。各設定の詳細については、こちらも参照してください。https://bagder.github.io/TRRprefs/
これらの手順は現時点では機能するかもしれませんが、Firefox が新しいドラフト バージョンをサポートするように更新される可能性が高いため、将来的には機能しなくなります。上記の esnitool は、許可された暗号スイート (AES128-GCM) とキー交換アルゴリズム (X25519) もハードコードします。これは、Cloudflare によって使用されるパラメータを反映しています。
述べる
ESNI は TLS 1.3 を意味するため、証明書とそれに埋め込まれたホスト名は暗号化されます。ESNI が有効で、DNS-over-HTTPS (DoH) や DNS-over-TLS (DoT) などの安全な DNS トランスポートを使用すると、サーバー名は実際にはネットワーク上に表示されません。これは、frame contains "wireshark"
にアクセスするときにフィルターを使用して Wireshark で確認できますwireshark.org
。
ただし、1 つの IP が少数のドメインのみをホストしている場合、受動的な攻撃者は、ユーザーがそれらのドメインのいずれかにアクセスしていることを推測できます。Cloudflare などの大規模なオペレーターは、さらに多くのドメインをホストしているため、これはそれほど問題にはなりません。
ESNI は半静的キーを使用するため、秘密キーが侵害されると、盗聴者が暗号化されたサーバー名を解読できるようになります。そのため、ESNI キーは頻繁にローテーションされ、自動化が必要になります。Cloudflare ではこれが適切に統合されており、DNS と HTTPS サービスの ESNI キーは定期的に更新されます。
結論として、ESNI は有望ですが、クライアント (Web ブラウザー)、安全なトランスポート (DoH/DoT) 経由の DNS サーバー、および Web サーバーからのサポートが必要です。まだ開発中であり、その開発を綿密に追跡していない限り、実験以外の目的で設定するのは得策ではないと思われます。
答え2
前回の非常に詳細な回答が再利用のきっかけとなったtls-tris実際に TLS 1.3 を ESNI で終了し、プレーン トラフィックを任意のバックエンドに転送できる、小さな esni リバース プロキシを構築します。これにより、使用している Web サーバーを変更することなく、ESNI を簡単に使用できるようになります。ソース コードと詳細な手順については、次の場所を参照してください。esni-rev-プロキシ