PR

 韓国で2019年2月中旬、政府が指定した有害なWebサイトへの接続が全面的にブロックされた。有害なサイトにはアダルトサイトなどが含まれている。そのブロックに利用されているのがSNIという技術だ。

 Webサイトへのアクセスを暗号化する技術としては、TLSという技術が広く使われており、Webサイトの常時TLS化も進んでいる。SNIは、TLSの拡張機能である。ホスティングサービス(レンタルサーバーサービス)などでTLSを適用すると不都合が生じるのを解決するために生まれた。

ドメインの証明書を使える

 HTTP/1.1では、同じIPアドレスを複数のドメインで共有できる「バーチャルホスト」という機能が導入された。Webブラウザーなどが送るHTTPリクエストの中に、アクセスしたいドメイン(正確にはホスト)の名前を含ませることで、同じIPアドレスで違うWebサーバーにアクセスできるようにする仕組みだ。

 1つのIPアドレスで様々なWebサイトにアクセスできるようになるので、IPアドレスの消費を抑えることができる。ホスティングサービスなどで広く使われている。

 ところが、バーチャルホストを利用しているWebサーバーにTLSを適用しようとすると、問題が発生する。本来はドメインごとのサーバー証明書を使うべきなのに、共通のサーバー証明書しか使えなくなってしまう(図1)。

図1●SNIを利用しない場合
図1●SNIを利用しない場合
TLSではサーバーがパソコンにサーバー証明書を返す必要があるが、暗号通信の前は、どのドメインにアクセスするかがまだ分からない。このため共通のサーバー証明書しか使えない。
[画像のクリックで拡大表示]

 ユーザーがWebブラウザーにURLを打ち込むと、WebブラウザーはDNSサーバーにアクセスして、URLに含まれるドメイン名に対応するIPアドレスを取得する。このIPアドレスを使ってWebサーバーにアクセスする。

 WebサーバーがTLSを使っていると、暗号通信を確立するためにパソコンにサーバー証明書を返す必要がある。ところが、HTTPリクエストが送られるのはTLSによる暗号通信が始まった後だ。バーチャルホストを利用している場合、そのタイミングで初めてユーザーがアクセスしたいドメインが分かる。

 つまり、サーバー証明書を返す時点では、ユーザーがどのドメインにアクセスしたいのかが分からない。このため、複数のドメインで利用できる共通のサーバー証明書を返すしかない。

 この問題を解決するために生まれたのがSNIだ。いわばバーチャルホストをTLSに対応させるための機能である(図2)。

図2●SNIを利用する場合
図2●SNIを利用する場合
SNIではやりとりの最初にユーザーがアクセスしたいドメインを平文でWebサーバーに伝える。これにより、そのドメインのサーバー証明書を使って暗号通信できる。
[画像のクリックで拡大表示]

 SNIでは、暗号通信を確立するためのTLSでのやりとりの最初に、ユーザーがアクセスしたいドメインをWebサーバーに伝える。これにより、そのドメインのサーバー証明書を使って暗号通信を確立できる。ほとんどのWebサーバーソフトウエアやWebブラウザーが対応しているため、現在ではホスティングサービスなどを中心に広く使われている。

▼SNI
Server Name Indicationの略。
▼TLS
Transport Layer Securityの略。