SNI

(2020/11/24)

通常TLSの証明書はIPアドレスに対して1つでした。理由はHTTPSはTLSコネクションを開始した後(つまり証明書の交換が行われた後に)クライアントから接続先のホスト名が提示されるからです。よってWEBサーバはIPアドレスに応じてどの証明書を応答するか決めるしかありませんでした。

SNIはこの不便さに対して1つのIPアドレスでも正しい証明書を選択して応答できるようにした拡張仕様(RFC3456)です。SSLの通信を開始するときにクライアントはサーバに対してClient Helloを送信します。これまではその中に接続対象のサーバ名を示すヘッダはありませんでしたが、extentionにServer Name Indication(SNI)を追加したのです。これによってサーバはTLSコネクション開始時に対象サーバを知る事ができ、正しい証明書を応答する事ができます。これがSNIです。ヘッダを見れば一目瞭然なので張っておきます。

 

考えてみれば、TLSを複合化しなくても明示プロキシはTLSコネクションでもConnectMethodの中にあるhostsを見てフィルタリングできますが、透過プロキシもSNIを見て制御できるのでしょうね。やったことないのでわかりませんが。