カテゴリー
2023年 Linux SNI (Server Name Indication) Windows クラウド コンピューター 証明書

Server Name Indication (SNI) とは


にほんブログ村

まず、ウェブサーバーなどで使われているバーチャルホストという技術が、どのようなものなのかを知っておく必要があります。

通常はWebサーバやメールサーバを運用するのにドメインの数以上のサーバコンピュータが必要となる。バーチャルホストを利用すると1つのサーバコンピュータで複数のドメインを運用することができ、サーバコンピュータの数を減らし運用のコストを下げることができる。また、後述する名前ベースバーチャルホストの場合はIPアドレスも節約することができる。 また、ドメインの追加も容易で、小規模Webサイトの運営や安価なレンタルサーバサービスなどでの利用が盛んである。

ウィキペディア

SSL/TLS では「同じサーバーは 1つの SSL サーバ証明書しか使えない」のが基本です。

ただ、このままだと不便な場合もあります。例えばレンタルサーバサービスをしているとしましょう。同じサーバを複数のユーザが利用し、更にユーザーごとに異なるドメインを利用するという使い方ができなければ、レンタルサーバーのサービスは成り立ちません。

このために出てきたのが、バーチャルホストです。

バーチャルホストの種類

今時のウェブサーバーでは、1台で複数の ウェブサービスを提供することが当たり前になっています。この技術をバーチャルホストと呼びます。

バーチャルホストには 2種類があります。

  • IP ベース
  • 名前ベース

IP アドレスが複数必要のない名前ベースのバーチャルホストの方が主流ですが、実際は、両方を混在させて使うケースもあります。

名前ベースのバーチャルホストの設定例

IP アドレスは同じで、複数のウェブサイト(ドメイン)を提供するのが特徴です。

# Ensure that Apache listens on port 80
Listen 80

# Listen for virtual host requests on all IP addresses
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot /www/kkint1
ServerName www.kkinternational.com

# Other directives here

</VirtualHost>

<VirtualHost *:80>
DocumentRoot /www/kkint2
ServerName www.kkinternational.work

# Other directives here</VirtualHost>

IP ベースのバーチャルホストの設定例

ウェブサイト(ドメイン)毎に、異なる IP アドレスを使うのが特徴です。

Listen 80

<VirtualHost 172.30.30.100>
DocumentRoot /www/kkint1
ServerName www.kkinternational.com

</VirtualHost>

<VirtualHost 172.30.30.200>
DocumentRoot /www/kkint2
ServerName www.kkinternational.work

</VirtualHost>

なぜ SNI が必要なのか

このバーチャルホスト(特に名前ベースの方)が使われ始めたのが理由です。

名前ベースのバーチャルホストには、

  1. 同じ IP アドレスで、複数のウェブサービス(ドメイン)を提供する
  2. それらのウェブサービスは HTTPS を使っていて、サーバー証明書で暗号化されている(現在は HTTPS がほぼ必須)

という特徴があります。

上記 1の特徴から、バーチャルホストを使うウェブサーバーは、「家」よりも「アパートの建物」に似ていると言えます。アパートは、複数の部屋に分かれています。これらの部屋が、ウェブサービスでありドメインです。

次に上記 2の特徴です。この「HTTPS でサーバー証明書を使っている」というところがポイントです。基本的な SSL/TLS の仕様では、サーバー証明書は、同じ IP アドレスにつき 1ドメインしか運用できません。

上記1と2の特徴を考えると、複数のドメイン名をホストするため、IP アドレスだけでは、ユーザーが到達しようとしているドメインを示すのに十分ではありません。

なぜなら、間違った SSL 証明書を表示する可能性があり、HTTPS 接続ができなかったり、または終了されたりしてしまうというケースが発生する訳です。

じゃあ SNI があると?

Server Name Indication(SNI)は、この問題を解決するために作られました。

SNI は、HTTPS で使用される TLS プロトコルの拡張機能として提供されています。

TLS/SSL ハンドシェークに含まれていて、クライアント PC が、到達しようとしている ウェブサイトの正しい SSL 証明書を確認することができるようにします。

Server Name Indication(SNI、サーバー ネーム インディケーション、サーバ名表示)は、SSL/TLSの拡張仕様の一つである。SSLハンドシェイク時にクライアントがアクセスしたいホスト名を伝えることで、サーバ側がグローバルIPごとではなくホスト名によって異なる証明書を使い分けることを可能にする。

ウィキペディア

SNI を利用すると、クライアント PC は SSL/TLS ハンドシェイクの際に「これから通信したいサーバのドメイン名」をサーバに通知します。ウェブサーバーは「どのドメインに対応するサーバ証明書を利用すべきか」を、判断することができるようになります。

これにより、接続したいウェブサービスに必要なサーバー証明書が入手できるという訳です。

SNI をサポートしてないウェブブラウザー

SNI はクライアント側(ブラウザー)で、この機能をサポートしていないといけない訳ですが、古いブラウザーですと SNI をサポートしていません。

  • Windows XP 以前の全ブラウザ
  • IE 6 以前
  • いわゆる「ガラケー」のブラウザ

まあ、こんな古い環境でインターネットのブラウジングをしている人もいないと思いますが。

SNI をサポートしているブラウザーの一覧はこちら

SNI をサポートしているウェブサーバー

  • Apache 2.2.12 以降 + mod_ssl もしくは mod_gnutls
  • Apache Traffic Server(英語版) 3.2.0 以降
  • Cherokee(英語版) (コンパイル時 TLS サポートを有効にした場合)
  • lighttpd 1.4.24 以降(それ以前の1.4.xはパッチ)
  • Nginx と OpenSSL
  • F5 ネットワークス Local Traffic Manager 11.1 およびそれ以降
  • Hiawtha(英語版) 8.6 またはそれ以降
  • IBM HTTP Server 9.0 およびそれ以降
  • LiteSpeed 4.1 およびそれ以降
  • Pound 2.6 以降
  • Apache Tomcat (Java 7 およびそれ以降)
  • Microsoft IIS 8
  • PageKite tunneling reverse proxy
  • Citrix NetScaler 9.3 以降
  • Radware Alteon ADC (AlteonOS 28.1 以降)

関連するブログ:

最近の人気ブログ TOP 10:

最近の記事:

カテゴリー
2021年 AWS Azure クラウド コンピューター トラブルシューティング 技術一般 証明書

パケットキャプチャーからサーバー証明書を抜き出す方法

Webサーバー向けのテストをしていると、代理証明書が必要となるケースが多いです。特に、インターネット上にあるサーバーに対しての通信テストとなると、それらのサーバー署名書をまず手に入れ、その内容を元に、代理証明書を作成する必要があります。

インターネット上にあるサーバーの証明書ですが、実は簡単に内容を取得することができます。パケットキャプチャ(TCP ダンプ)を取得するのです。

パケットキャプチャには、通信の全てが含まれています。当然、サーバー証明書も含まれます。このやり取りの証明書の部分を指定して、証明書だけを抜き出せば良いのです。

サーバ証明書の抜き出し方

まず、証明書を取得したいサーバーにアクセスをし、その通信をWiresharkを使ってパケットキャプチャします。

Server Hello が飛んできた後に、Certificateのやり取りが見えます。この中に証明書が入っています。上の画面キャプチャーの青色で反転させているパケットです。このパケットの中を見ていきます。

  1. Secure Sockets Layer
  2. TLSV1.2 Record Layer: Handshake Protocol : Certificate
  3. Handshake Protocol: Certificate
  4. Certificates (バイト数)

の順にクリックして、詳細を表示させます。

その中に、Certificate (id-atCommonName=ドメイン名)のパケットが見えます。

id-at-ConnomName=w.usabilla.com を取り出してみます。

そのパケットを選択し、右クリックメニューを表示させます。

メニューから、Export Selected Packet Bytes… をクリックします。

このパケットを、証明書として保存します。名前をつけて保存のウィンドウが表示されますので、ファイル名のところで名前を指定します。

この時のポイントは、拡張子を「.crt」にして保存することです。こうすることで、Windows 上からは証明書として認識されますので、ダブルクリックで中が見られるようになります。

証明書の内容を見てみる

名前をつけて保存した証明書ファイルを開いて、中をみてみましょう。

w.usabilla.com.crt の証明書を、駄ぬんるクリックして開いてみます。

発行社はAmazonなんですね。

「詳細」タブをクリックして、証明書の詳細も見てみましょう。

証明書の記載項目の一覧が表示されますので、「サブジェクト」をクリックしてみます。

CN: Common Name が表示されましたね。

次に、「サブジェクト代替名」をクリックしてみます。

SAN: Subject Alternative Name が表示されましたね。

証明書の中身が分かりましたので、これで代理証明書を作成することが可能です。自分でCA局のサーバーを建てて、そこでサインして発行するのも良いのですが、オンラインで簡単に証明書を発行できるサイトがあります。

これも使ってみてください。

関連する記事:

最近の記事: