複数の仮想ホストを実行するWebサーバーがあり、盗聴者がクライアントがアクセスしている仮想ホストを知られないようにしたいのですが。この問題を解決するためのTLS拡張がすでにあります:暗号化されたSNI。 CloudflareはそのサーバーでCloudflareをサポートしており、Firefoxはクライアントでそれを有効にする設定を持っていることがわかります。自分のサーバーでこれを有効にする方法のドキュメントは見つかりません。どうすればよいですか? (私は特定のサーバースタックに縛られておらず、「それをCloudflareの背後に配置する」以外のすべての設定/アーキテクチャを受け入れます。)
暗号化サーバー名表示(ESNI)はまだインターネットドラフトであり、変更される可能性があるため、主要なサーバー実装では見つかりません。実際、Firefoxで実装されたドラフトバージョンは draft-ietf-tls-esni-01 をサポートしています。これは newer ドラフトバージョンと互換性がありません。
2019年4月に観察されたエコシステムのステータスを投稿しました here :
- 最新バージョンは https://tools.ietf.org/html/draft-ietf-tls-esni-
- OpenSSLはドラフトが完了するのを待っています。 https://github.com/openssl/openssl/issues/7482
- Firefox + NSSはドラフト-01をサポート https://bugzilla.mozilla.org/show_bug.cgi?id=149512https://github.com/nss-dev/nss/blob /8a8b92f05d2d/lib/ssl/tls13esni.c
- Cloudflareはドラフト-01をサポートします
- picotlsはそれをサポートしています https://github.com/h2o/picotls/pull/155
- ESNIが広くデプロイされるまで、go crypto/tlsはそれをサポートしません: https://github.com/golang/go/issues/9671#issuecomment-439561672
ご覧のとおり、NginxとApacheで使用されているOpenSSLはサポートしていません。パッチが適用されたGo暗号/ tlsライブラリを使用して Caddy を構築しようとすることもできますが(- this PR from tls-tris を使用)、時間が経つと機能しない場合があります。
実験または教育目的で、esnitoolとtris-localserverを tls-tris から使用できます。 Linuxまたは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つのファイルが作成されます。
/wFsX6klACQA...AAAA=
などの値ESNIをwww.example.com
用に構成する場合は、_esni.www.example.com
のTXTレコードをその/wFsX6klACQA<snip>AAAA=
値で作成します。この形式は、draft-ietfに準拠しています-tls-esni-01仕様は、FirefoxとCloudflareでサポートされています。最新のドラフト仕様は使用されていません。テストサーバーは次のように起動できます。
_dev/tris-localserver/tris-localserver -esni-keys=esni.pub -esni-private=esni.priv
次に FirefoxでESNIの使用を有効にする を設定し、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トランスポートを使用すると、サーバー名は実際にはネットワーク上に表示されません。これは、Wiresharkで確認できます。 frame contains "wireshark"
にアクセスすると、wireshark.org
などのフィルタが適用されます。
ただし、単一のIPが少数のドメインのみをホストしている場合、パッシブな攻撃者はそれらのドメインの1つにアクセスしていると推測できます。 Cloudflareなどの大規模な事業者には、これがそれほど問題とならない多くのドメインがあります。
ESNIは半静的キーを使用するため、秘密キーの侵害は、盗聴者が暗号化されたサーバー名を復号化できることを意味します。そのため、ESNIキーは頻繁にローテーションされ、自動化が必要です。 Cloudflareには、DNSに適切に統合されたESNIキーがあり、HTTPSサービスは定期的に更新されます。
結論として、ESNIは有望ですが、クライアント(Webブラウザー)、安全なトランスポート(DoH/DoT)を介したDNSサーバー、およびWebサーバーからのサポートが必要です。それはまだ開発中であり、その開発を綿密にフォローしているのでない限り、実験以外の目的で設定することはお勧めできません。
以前の非常に詳細な回答は、再利用 tls-tris を作成して小さなesniリバースプロキシを構築することを促しました。これにより、実際にESNIでTLS 1.3を終了し、プレーントラフィックを選択したバックエンドに転送できます。これにより、使用しているWebサーバーを変更することなく、ESNIを簡単に使用できます。ソースコードと詳細な説明はここにあります: esni-rev-proxy