SNIとは?TLS Server Name Indicationの仕組み

SNI、Server Name Indicationは、TLS暗号化プロトコルに追加され、クライアントデバイスがTLSハンドシェイクの最初のステップで到達しようとしているドメイン名を指定できるようにし、一般的な名前の不一致エラーを防止します。

Share facebook icon linkedin icon twitter icon email icon

SNI

学習目的

この記事を読み終えると、以下のことができます。

  • 仮想ホスト名とは何かを説明する
  • サーバーが間違ったSSL証明書を提供する理由を理解する
  • SNIがこの問題を解決する方法を学ぶ

SNI(Server Name Indication)とは?

SNIは、小包を家ではなくアパートに郵送するようなものです。誰かの家に何かを郵送する場合、住所だけで荷物を適切な人に届けることができます。しかし、小包をアパートの建物に届けるときは、住所に加えて部屋番号が必要です。そうしないと、荷物が適切な人に届かないか、まったく配達されない可能性があります。

多くのWebサーバーは、家よりもアパートの建物に似ています。複数のドメイン名をホストするため、IPアドレスだけでは、ユーザーが到達しようとしているドメインを示すのに十分ではありません。これにより、サーバーが間違った SSL証明書を表示する可能性があります。これにより、HTTPS接続ができなかったり、または終了されたりします。小包と同様で、適切な人がサインをしないと配達はされません。

複数のWebサイトが1つのサーバーでホストされ、単一のIPアドレスを共有し、各Webサイトに独自のSSL証明書がある場合、クライアントデバイスがいずれかのWebサイトに安全に接続しようとしたときに表示するSSL証明書がサーバーにわからない場合があります。これは、クライアントデバイスがHTTPを介して接続先のWebサイトを示す前にSSL / TLSハンドシェイクが発生するためです。

Server Name Indication(SNI)は、この問題を解決するために設計されました。SNIは、HTTPSで使用されるTLSプロトコル(以前はSSLプロトコルと呼ばれていました)の拡張機能です。これは TLS / SSLハンドシェークに含まれていて、クライアントデバイスが、到達しようとしているWebサイトの正しいSSL証明書を確認することができるようにします。拡張機能により、ハンドシェイク後にHTTP接続がオープンするときではなく、TLSハンドシェイク中に、Webサイトのホスト名、またはドメイン名を特定することが可能です。

もっと単純に言うと、SNIによって、ユーザーデバイスが https://www.example.comと安全な接続を開通することが可能になります。これは、このWebサイトが、https://www.something.com、https://www.another-website.com、https://www.example.io.と同じ場所(同じIPアドレス)でホストされているとしても同様です。

SNIは、「共通名不一致エラー」として知られるものを防止します。これは、クライアント(ユーザー)デバイスがWebサイトの正しいIPアドレス到達したとき、SSL証明書の名前がWebサイトの名前と一致しない場合です。多くの場合、このエラーの結果、「接続がプライベートではありません」というエラーメッセージがユーザーのブラウザに表示されます。

SNIは、2003年にTLS / SSLの拡張機能として追加されました。元々はプロトコルの一部ではありませんでした。ほぼすべてのブラウザ、オペレーティングシステム、およびWebサーバーでサポートされていますが、一部の非常に古いブラウザとオペレーティングシステムで、現在も使用されているものではサポートされていません。

サーバー名とは?

SNIはServer Name Indicationの略ですが、SNIが実際に「示す」のは、Webサイトのホスト名またはドメイン名であり、実際にドメインをホストしているWebサーバーの名前とは異なる場合があります。実際、複数のドメインが1つのサーバーでホストされることは一般的です。この場合、それらは仮想ホスト名と呼ばれます。

サーバー名は単にコンピューターの名前です。Webサーバーの場合、この名前は通常、サーバーが1つのドメインのみをホストし、サーバー名がドメイン名と同等でない限り、エンドユーザーには表示されません。

TLS SNI拡張機能で何ができるのか?

多くの場合、Webサーバーは複数のホスト名またはドメイン名(人間が読めるWebサイトの名前)を担当します。WebサイトがHTTPSを使用している場合、各ホスト名には独自のSSL証明書があります。

問題は、1つのサーバー上のこれらすべてのホスト名が同じIPアドレスにあることです。これは、TCP接続が開かれるとすぐに、クライアントはHTTPリクエストで到達しようとしているWebサイトを示すため、HTTPでは問題ではありません。

一方で、HTTPSでは、HTTP会話を開始する前にTLSハンドシェイクが最初に行われます(HTTPSもHTTPを使用しますが、HTTPメッセージを暗号化します)。SNIがなければ、クライアントはどのホスト名と通信しているかをサーバーに示す方法がありません。その結果、サーバーは間違ったホスト名のSSL証明書を生成する場合があります。 SSL証明書の名前がクライアントが到達しようとしている名前と一致しない場合、クライアントブラウザはエラーを返し、通常は接続を終了します。

SNIは、TLSハンドシェイクプロセスにドメイン名を追加します。これにより、TLSプロセスは正しいドメイン名に到達し、正しいSSL証明書を受信し、TLSハンドシェイクの残りの部分を通常どおり続行できます。

具体的には、SNIはClient Helloメッセージ、またはTLSハンドシェイクの最初のステップにホスト名を含めます。

ホスト名とは?仮想ホスト名とは?

ホスト名は、ネットワークに接続するデバイスの名前です。インターネットのコンテキストでは、ドメイン名またはWebサイトの名前は一種のホスト名です。どちらも、ドメイン名に関連付けられたIPアドレスとは別のものです。

仮想ホスト名は、独自のIPアドレスを持たないホスト名であり、他のホスト名とともにサーバーでホストされます。仮想現実がデジタル的にのみ存在して物理的な世界では存在しないのと同様に、専用の物理サーバーを持たないという点で「仮想」です。

ユーザーのブラウザがSNIをサポートしていない場合はどうなるのか?

これはまれなケースですが、ユーザーは特定のWebサイトにアクセスできず、ユーザーのブラウザに次のようなエラーメッセージが表示されます。「接続がプライベートではありません。」

大部分のブラウザーとオペレーティングシステムはSNIをサポートしています。 Internet Explorerの非常に古いバージョン、BlackBerryオペレーティングシステムの古いバージョン、およびその他の古いソフトウェアバージョンのみがSNIをサポートしていません。

TLS/SSLプロトコル、SSL証明書、およびHTTPSの仕組みについて詳しくは、 SSL証明書とは? をご覧ください。