2022-06-09 SNI とは?
Transport Layer Security (TLS) の拡張仕様。RFC 6066として定義されている。
挙動
TLS による通信を行う際、クライアントはサーバに電子証明書の要求を行う。
この証明書に記載されたホスト名とリクエストしている FQDN を照らし合わせ、一致しているかをクライアント側で認証する。
TLS の拡張である SNI を利用する場合、TLS のネゴシエーションの初期の段階において、リクエストしているバーチャルホストの名称がクライアントからサーバに通知される。
これは、 ClientHello message に付加される情報という形で実現される。
ClientHello は、 TLS のハンドシェイクプロセスの最初の方にやり取りされるメッセージである。
目的
複数のサイトを持つ一つのサーバが、複数の電子証明書を使い分けられるようになることを目的とする。
経緯
自分にとって馴染みがあるという理由で、 HTTP を例に説明する。
HTTP/1.1 の Name-based Virtual Host では、HTTP リクエストでやり取りされる Host - HTTP | MDN (mozilla.org) ヘッダーの情報を読み取ることで実現している。
ここに記載されているホスト名を元に、表示するサイト (ホスト) を振り分けている。
しかし HTTPS ではこの手段を利用することはできない。TLS のコネクション確立時点でリクエストされているサーバ名を判別し、適切な証明書を送らねばならないからである。しかし、 TLS のレイヤから HTTP のレイヤを読み取ることはできない。TLS (TCP) のレイヤにとって HTTP のレイヤ (アプリケーションレイヤ) は単なるペイロードであるため、解析して情報を取得することができない。
SNI なしでは、Server はすべてのリクエストに対し一つの証明書を送る他なかった。このため、HTTPS でのバーチャルホストの実現などが難しかった。
SNI が実装されたことにより、HTTPS においてもバーチャルホストが簡単に利用できるようになった。