「Server Name Indication」の版間の差分

提供: セキュリティ
移動: 案内検索
(ページの作成:「Server Name Indication (SNI, サーバネーム インディケーション)とは、SSL/TLSの拡張仕様です。SSLのハンドシェイクを行うとき...」)
 
(SNIの実装)
 
(同じ利用者による、間の2版が非表示)
行1: 行1:
[[Server Name Indication]] (SNI, サーバネーム インディケーション)とは、[[SSL]]/[[TLS]]の拡張仕様です。SSLのハンドシェイクを行うときに、クライアントは、アクセスするホスト名を通知し、サーバ側はホスト名によって、[[証明書]]を使い分けします。
+
[[Server Name Indication]] (SNI, サーバネーム インディケーション)とは、[[SSL]]/[[TLS]]の拡張仕様です。SSLのハンドシェイクを行うときに、クライアントは、アクセスするホスト名を通知し、サーバ側はホスト名によって、[[SSLサーバ証明書|証明書]]を使い分けします。
  
 
'''読み方'''
 
'''読み方'''
行6: 行6:
  
 
== 概要 ==
 
== 概要 ==
[[Server Name Indication]]では、複数の証明書を使い分けることができます。
+
[[Server Name Indication]](SNI)では、複数の[[SSLサーバ証明書|証明書]]を使い分けることができます。
  
 +
SNIでは、あとから[[SSLサーバ証明書|証明書]]を追加することで、異なるドメイン名の[[HTTPS]]のウェブサイトを追加できます。
 
== マルチドメインのウェブサーバ ==
 
== マルチドメインのウェブサーバ ==
HTTP では、名前ベースのバーチャルホストが利用可能です。
+
これは、SNIの話ではありません。
 +
 
 +
[[HTTP]] では、名前ベースのバーチャルホストが利用可能です。
 +
 
 +
しかしながら、[[HTTPS]]の場合は、名前ベースのバーチャルホストを利用できません。[[TLS]]プロトコルのハンドシェイクは、アプリケーション層(HTTP)の通信の前に完了されます。TLSプロトコルの段階では、接続先のホスト名を知ることはできませんでした。HTTPヘッダのホストフィールドを見るまで、どのホスト名に対してアクセスしているかわかりません。
 +
 
 +
この問題を解決するために、[[HTTPS]]の[[ウェブサーバ]]は、ホスト名ごとに異なるグローバルIPアドレスを利用していました。[[IPアドレス]]ごとに[[SSLサーバ証明書|証明書]]を設定します。それがIPベースのバーチャルホストになります。
 
== 複数ドメインをサポートするSSL証明書 ==
 
== 複数ドメインをサポートするSSL証明書 ==
 
複数のホスト名(ドメイン)をサポートする方法として
 
複数のホスト名(ドメイン)をサポートする方法として
* ワイルドカード証明書
+
* ワイルドカード[[SSLサーバ証明書|証明書]]
 
* SANs(Subject Alternative Names)
 
* SANs(Subject Alternative Names)
 
があります。
 
があります。
しかしながら、上記の方法は、証明書を発行するときに、未来に使うことになるドメインを予期して、入れておくことは事実上不可能です。
+
しかしながら、上記の方法は、[[SSLサーバ証明書|証明書]]を発行するときに、未来に使うことになるドメインを予期して、入れておくことは事実上不可能です。
 +
== SNIを導入するとどうなるのか? ==
 +
[[Server Name Indication]](SNI)は、[[TLS]]のハンドシェイクを改良することにより、[[HTTPS]]の[[ウェブサーバ]]でも複数の[[SSLサーバ証明書|証明書]]が利用可能になります。
 +
 
 +
# クライアントは、[[TLS]]ハンドシェイクの段階で、接続するドメイン名(ホスト名)を通知します。
 +
#: ドメイン名の通知は、[[平文]]の通信になります。
 +
# サーバは、対応するドメイン名(ホスト名)の[[SSLサーバ証明書|証明書]]を選択します。
 +
 
 +
つまり、1つの[[IPアドレス]]で複数のドメインの[[HTTPS]]のサーバが提供できます。
 +
== SNIの実装 ==
 +
SNI は、[[TLS]]の接続時の ClientHello の拡張で「接続したいドメイン」をサーバに伝えます。ClientHelloのSNIの情報をもとに、サーバは ServerHelloで適切な証明書をクライアントに渡すことができます。ただし、SNIの情報は暗号化されていません。そこで Encrypted SNI 拡張が考えられました。
 +
 
 +
== 対応状況 ==
 +
2015年の時点では、たいていのソフトウェアは対応していると考えられます。かなり古いソフトウェアは、SNIに対応していません。
 +
== まとめ ==
 +
* [[SSLサーバ証明書|証明書]]を追加することで、異なるドメイン名の[[HTTPS]]のウェブサイトを後から追加できます。
 +
* グローバルIPアドレスが1つだけで、複数の[[HTTPS]]のウェブサイトを運営できます。
 
== 関連項目 ==
 
== 関連項目 ==
 
* [[TLS]]
 
* [[TLS]]
 +
* [[SSLサーバ証明書|証明書]]
 
<!-- vim: filetype=mediawiki
 
<!-- vim: filetype=mediawiki
 
-->
 
-->

2018年11月1日 (木) 20:03時点における最新版

Server Name Indication (SNI, サーバネーム インディケーション)とは、SSL/TLSの拡張仕様です。SSLのハンドシェイクを行うときに、クライアントは、アクセスするホスト名を通知し、サーバ側はホスト名によって、証明書を使い分けします。

読み方

Server Name Indication
さーばねーむ いんでぃけーしょん

概要

Server Name Indication(SNI)では、複数の証明書を使い分けることができます。

SNIでは、あとから証明書を追加することで、異なるドメイン名のHTTPSのウェブサイトを追加できます。

マルチドメインのウェブサーバ

これは、SNIの話ではありません。

HTTP では、名前ベースのバーチャルホストが利用可能です。

しかしながら、HTTPSの場合は、名前ベースのバーチャルホストを利用できません。TLSプロトコルのハンドシェイクは、アプリケーション層(HTTP)の通信の前に完了されます。TLSプロトコルの段階では、接続先のホスト名を知ることはできませんでした。HTTPヘッダのホストフィールドを見るまで、どのホスト名に対してアクセスしているかわかりません。

この問題を解決するために、HTTPSウェブサーバは、ホスト名ごとに異なるグローバルIPアドレスを利用していました。IPアドレスごとに証明書を設定します。それがIPベースのバーチャルホストになります。

複数ドメインをサポートするSSL証明書

複数のホスト名(ドメイン)をサポートする方法として

  • ワイルドカード証明書
  • SANs(Subject Alternative Names)

があります。 しかしながら、上記の方法は、証明書を発行するときに、未来に使うことになるドメインを予期して、入れておくことは事実上不可能です。

SNIを導入するとどうなるのか?

Server Name Indication(SNI)は、TLSのハンドシェイクを改良することにより、HTTPSウェブサーバでも複数の証明書が利用可能になります。

  1. クライアントは、TLSハンドシェイクの段階で、接続するドメイン名(ホスト名)を通知します。
    ドメイン名の通知は、平文の通信になります。
  2. サーバは、対応するドメイン名(ホスト名)の証明書を選択します。

つまり、1つのIPアドレスで複数のドメインのHTTPSのサーバが提供できます。

SNIの実装

SNI は、TLSの接続時の ClientHello の拡張で「接続したいドメイン」をサーバに伝えます。ClientHelloのSNIの情報をもとに、サーバは ServerHelloで適切な証明書をクライアントに渡すことができます。ただし、SNIの情報は暗号化されていません。そこで Encrypted SNI 拡張が考えられました。

対応状況

2015年の時点では、たいていのソフトウェアは対応していると考えられます。かなり古いソフトウェアは、SNIに対応していません。

まとめ

  • 証明書を追加することで、異なるドメイン名のHTTPSのウェブサイトを後から追加できます。
  • グローバルIPアドレスが1つだけで、複数のHTTPSのウェブサイトを運営できます。

関連項目