2013年1月1日火曜日

SSLでのバーチャルホスト

httpでは1つのマシン(IPアドレス)に複数のサーバー名を割り当てて
たくさんのサイトを運用することができますが、
httpsではそれができない…と認識していましたが、
実はそれ過去のものだったのです。
これはすでに古い話にもかかわらず不覚にもついこの間偶然知りました。

SSL(というかTLS)でのバーチャルホストについては多くの方の懸案事項だったようで、
SSLにSNI(Server Name Indication)を導入することで対応しています。
何のことはないhttpリクエストにおけるHostヘッダみたいなものを
SSLのセッション開始時に伝えるようになっているだけです。
そういうこともあってサーバとクライアントの両方が対応している必要があるのですが、
クライアント(ウェブブラウザ)に関してはいつの間にか対応が進んで、
現時点で私が常用しているブラウザで対応してないのは
Android 2.x のブラウザだけです。さすがはAndroid。

で、サーバの方はというとApacheの2.2.12以降が対応しているようです。
ただしOpenSSLは0.9.8f以降で
"enable-tlsext"設定を追加してビルドする必要があるようです。
Apacheの設定自体はそんなに難しくなく、
httpのバーチャルホストを量産するような感覚で"NameVirtualHost"を設定し、
SSLサイトを定義している部分を複製して
サーバ名とコンテンツの参照ディレクトリと証明書を
それなりに変更すればいいだけです。
ちょっと違うのは、SNI非対応ブラウザからSSLアクセスに来たときに
デフォルト(一番最初)のSSLサイトにつなぐか、
SSL接続自身を拒否するかを選べることで、
"SSLStrictSNIVHostCheck"が"off"だと前者、"on"だと後者の動作になるようです。

で、早速私もServersMan@VPS(debian-32bit)を設定したいところですが…
Apacheのバージョンが2.2.9でした。
とりあえず
# apt-get update
# apt-get upgrade
して途中全部'N'を選択して
# /etc/init.d/apache2 restart
したところ起動時にエラーが出たので
ログファイル"/var/log/apache2/error.log"に出ている情報をもとに
設定ファイル"/etc/apache2/envvars"に
export APACHE_LOG_DIR=/var/log/apache2
export APACHE_RUN_DIR=/var/run/apache2
を追加することで何とか起動させられました。
Apacheのバージョンは2.2.16になりました。
なお、OpenSSLの方はバージョンは0.9.8oなのですが、
どうも0.9.8k以降はデフォルトで"enable-tlsext"付きになっているようで、
特に意識する必要はないようです。
SSLのバーチャルコンソール自体は設定ファイル"/etc/apache2/ports.conf"の
    Listen 443
の直後に
    NameVirtualHost *:443
    SSLStrictSNIVHostCheck off
を追加して、
# cd /etc/apache2/sites-available
# cp default-ssl <別のサイトのホスト名>-ssl
を実行し、"/etc/apache2/sites-available/<別のサイトのホスト名>-ssl"を編集します。
編集するのは最低限httpのバーチャルホストと同様に
ServerNameやDocumentRootとなりますが、
サーバ証明書をサイトのホスト名にあわせて変更するなら
SSLCertificateFileやSSLCertificateKeyFileの編集も必要です。
最後に
# cd /etc/apache2/sites-enabled
# ln -s ../sites-available/<別のサイトのホスト名>-ssl <起動番号>
# /etc/init.d/apache2 restart
を実行すれば、SSLなバーチャルドメインが運用でき、
各サイトごとに適切なサーバ証明書が送れます。
先日SSLのサーバ証明書について書いているのでこちらも参考にしてください。

0 件のコメント:

コメントを投稿