【えすえぬあい】

SNI とは?

💡 「どのドメインに用がある?」とTLS接続の入り口で名乗る仕組み
📌 このページのポイント
1つのIPアドレスで複数ドメインを運用 クライアント ブラウザ TLS ClientHello SNI: site-a.com ホスト名を平文で送信 Webサーバー IP: 203.0.113.1 証明書A site-a.com 証明書B site-b.com SNIによる証明書選択の流れ ClientHelloに ホスト名を含める サーバーが ホスト名を確認 対応する証明書 を選択・提示 TLS接続 確立
SNIの仕組み
ひよこ ひよこ

SNIってなんで必要なの?

ペンギン先生 ペンギン先生

1つのサーバーに複数のドメインを置きたいとき、どの証明書を使えばいいかがTLSの接続確立時点では分からなかったんだ。HTTPなら `Host` ヘッダーでドメインを教えられるけど、TLSHTTPより前に始まるから当初はホスト名が分からなかったんだよ。

ひよこ ひよこ

SNIがあるとどうなるの?

ペンギン先生 ペンギン先生

クライアントがTLSハンドシェイクの最初に「example.com に接続したい」と教えるんだ。サーバーはその情報をもとに正しい証明書を選んでハンドシェイクを続けられる。これによって1つのIPアドレスで何十・何百ものHTTPSドメインを扱えるよ。

ひよこ ひよこ

クラウドロードバランサーもSNIを使ってるの?

ペンギン先生 ペンギン先生

そうだよ。AWSのALBなどもSNIで複数の証明書を一つのロードバランサーで扱えるんだ。SNIがなければHTTPSドメインごとにIPアドレスが必要になってしまう。

ひよこ ひよこ

SNIのプライバシー問題って何?

ペンギン先生 ペンギン先生

SNIでホスト名を送る部分はTLSの暗号化の「前」に平文で送られるんだ。つまりネットワーク上の第三者(ISPや盗聴者)が「このユーザーはexample.comにアクセスした」と見えてしまう。これを解消するのが「Encrypted Client Hello(ECH)」という新しい仕組みで、ホスト名も含めてTLS接続の初期段階から暗号化する。エンドツーエンド暗号化の観点ではSNIがプライバシーの穴になっていたことをあまり知らない人も多いよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「SNI」って出てきたら「1つのIPアドレスで複数のHTTPSドメインを識別するための仕組みだな」と思えばだいたいOK!
📖 おまけ:英語の意味
「SNI(Server Name Indication)」 = サーバー名の通知
💬 TLS拡張の一つで、RFC 6066で標準化されているよ。「どのサーバー名に接続したいか」をハンドシェイク中に伝えるという名前の通りの機能だね
← 用語集にもどる