Server Name Indication

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の日本語訳

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。