SNIを用いた通信のブロッキング及び、「Encrypted SNI拡張」のブロッキングについてはIETFのTLS WGでも話題となりました((TLS) SK filtering on SNI, blocking ESNI)。
Encrypted SNIはSNIを暗号化する一方で、ClientHelloにencrypted_server_name拡張をつけます。そのため、経路上の観測者はEncrypted SNIが使われていることを検知できます。
それを回避するために、ニセのSNIをつける「Fake Server Name Indication」というdraftが提出されています。
初版のdraftであり、これから議論のあるところだとは思うが、とりあえず面白そうなので読んでみる。
Fake SNI
Fake SNIを利用するサービスは事前に、偽のホスト名を公表します。DNSを利用することを想定していますが、他の方法でも問題ありません。
DNSを用いる場合は、TXTレコードで下記のように本来のドメイン名に関連付ける偽のホスト名を定義しておきます。
_fakesni.example.com. 60S IN TXT "myfakerecord.com IP"
- まずクライアントは通信を行うドメインの偽のホスト名を取得します。
- クライアントは取得した偽のSNIを設定してTLSハンドシェイクを開始します
- サーバは、Fake SNIのSNIを受け取った場合に、本来のホスト名の証明書を返します。なおTLS1.3ではCertificateは暗号化される
- クライアントは本来のホスト名の証明書が取得でき、正しく検証できた場合に通信を継続します。
こうすることで、経路上の観測者にはFake SNI使ってるかどうか区別はつかなくなります。