【えすえぬあい】

SNI とは?

最終更新:
💡 TLSの入り口で「接続したい名前」を伝える

Server Name Indicationの略。TLSのClientHelloで接続したいサーバーのホスト名を伝える拡張機能。複数の名前を扱うサーバーが証明書などを選ぶために利用できる。

📌 このページのポイント
SNI:接続したいホスト名を伝える クライアント ブラウザ ClientHello a.example 平文(ECHなし) 同じ接続先 203.0.113.1 ✓ 証明書A a.example 証明書B b.example ホスト名に合う証明書を選択する
通常のClientHelloのSNIを使い、1つの接続先で証明書を選ぶ例。ECHの暗号化は本文で説明。
ひよこ ひよこ
SNIはなぜ役立つの?
ペンギン先生 ペンギン先生
同じIPアドレスで複数のHTTPSサイトを扱うとき、サーバーがどの名前向けの証明書を返すか判断する材料になるよ。クライアントはClientHelloで接続したいホスト名を伝えるんだ。
ひよこ ひよこ
SNIは接続する人が名乗るの?
ペンギン先生 ペンギン先生
伝えるのは利用者の名前ではなく、接続先のサーバーのホスト名だよ。サーバーはその名前で証明書や設定を選べるけれど、SNIだけでクライアントが認証されるわけではないんだ。
ひよこ ひよこ
SNIがないとサイトごとにIPが必要?
ペンギン先生 ペンギン先生
必ずそうなるわけではないよ。たとえばAWS ALBはSNIなしの接続に既定の証明書を使う。1枚の証明書で複数の名前をカバーする構成もあるので、SNIは名前に応じて証明書を選び分ける仕組みとして理解しよう。
ひよこ ひよこ
HTTPSでもホスト名が見えるの?
ペンギン先生 ペンギン先生
通常のClientHelloのSNIは暗号化されず、経路上で観測できるよ。HTTPSの本文を暗号化することと、接続開始時のホスト名を隠すことは別なんだ。SNIに含まれるのはホスト名で、アクセスしたURLのパス全体ではないよ。
ひよこ ひよこ
ECHなら何でも隠せる?
ペンギン先生 ペンギン先生
ECHは本来の接続先を含む内部ClientHelloを暗号化し、外部ClientHelloに入れて送る仕組みだよ。クライアント・サーバーの対応と設定が必要で、通常のSNIが自動的に全部暗号化されるわけではない。DNSの問い合わせや接続先IPなど、別の経路の情報も考える必要があるね。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「SNI」って出てきたら「1つのIPアドレスで複数のHTTPSドメインを識別するための仕組みだな」と思えばだいたいOK!
📖 おまけ:英語の意味
「SNI(Server Name Indication)」 = サーバー名の通知
💬 TLS拡張の一つで、RFC 6066で標準化されているよ。「どのサーバー名に接続したいか」をハンドシェイク中に伝えるという名前の通りの機能だね

参考資料

← 用語集にもどる