たろログ2

実験的運用により、記事品質が乱高下することがあります。予めご了承ください。

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 においてもバーチャルホストが簡単に利用できるようになった。