Server Name Indication (SNI) について
Server Name Indication(SNI、サーバ名表示)は、SSL/TLSプロトコルの拡張機能の一つです。クライアントがサーバーとのSSL/TLSハンドシェイク時に、接続したいサーバーの
ホスト名を伝えることで、サーバー側はアクセスされた
ホスト名に応じて適切な証明書を提示できます。特に、HTTP 1.1で利用される名前ベースバーチャルホストを
HTTPS環境で実現するために不可欠な技術です。
SNIの必要性
HTTPS通信では、クライアントはまずサーバーから証明書を受け取り、その正当性を確認します。証明書には
ホスト名が記載されており、クライアントが接続しようとしている
ホスト名と一致する必要があります。しかし、
HTTPSではSSL/TLSハンドシェイクがHTTPリクエストよりも先に行われるため、サーバーはクライアントがどのホストにアクセスしたいのかを事前に知ることができません。この問題に対処するため、従来はホストごとに異なるグローバルIPアドレスを割り当てる必要がありました。これは、IPアドレスの枯渇や運用コストの増大という問題を引き起こしていました。
また、複数の
ホスト名を一つの証明書にまとめる方法として、
X.509 v3証明書の`subjectAltName`拡張を利用する手法もありましたが、運用する全ての
ホスト名を事前に登録する必要があるため、実用的ではありませんでした。
SNIによる解決
SNIは、TLSハンドシェイク時にクライアントが接続先の
ホスト名をサーバーに伝えることで、この問題を解決します。これにより、サーバーはクライアントが要求する
ホスト名に対応する適切な証明書を提示できます。SNIに対応したサーバーとクライアントがあれば、一つのIPアドレスで複数の
HTTPSサイトを運用することが可能です。
SNIは2003年にRFC 3546として標準化され、その後RFC 6066で更新されています。
SNIの暗号化
SNI自体は暗号化されていないため、盗聴のリスクがあります。この問題に対処するため、Encrypted SNI (ESNI)や、より進化したEncrypted Client Hello (ECH)などの暗号化技術が検討されています。
SNIの対応状況
SNIを利用するためには、クライアントとサーバーの両方がSNIをサポートしている必要があります。多くの主要なブラウザやSSLライブラリはSNIをサポートしていますが、一部の古いOSやソフトウェアでは利用できない場合があります。
対応ソフトウェア
ブラウザ: 主要なブラウザはSNIをサポートしています。
Webサーバー: Apache、Nginxなどの主要な
WebサーバーはSNIをサポートしています。
ライブラリ: OpenSSLなどの主要なSSL/TLSライブラリはSNIをサポートしています。
非対応ソフトウェア
一部の古いブラウザ、サーバー、ライブラリではSNIをサポートしていない場合があります。
まとめ
SNIは、HTTPS環境での効率的なサーバー運用に不可欠な技術であり、多くのWebサイトで利用されています。SNIにより、一つのIPアドレスで複数のHTTPSサイトを運用することが可能になり、IPアドレスの枯渇問題を軽減し、運用コストを削減できます。技術の進化に伴い、SNIの暗号化など、よりセキュアな通信を実現するための取り組みも進められています。
脚注
SNIの標準化仕様は RFC 6066 に記述されています。
ブラウザがSNIに対応しているかどうかは、https://decoder.link/sslchecker/ でテストできます。
関連項目
HTTPS
Transport Layer Security
外部リンク
RFC 6066
*
RFC6066の日本語訳