Apache 2.2.12以降、SNI(Server Name Indication)に対応しているらしく、ひとつのWebサーバーで複数ドメインの
SSL証明書を使い分けることが可能になっているようです。
注目の集まるSNI(Server Name Indication)導入の必要性とは
SNIでサーバ上に複数のSSLサイトを設定する | shinobe.org
全然意識していませんでした。
ということで、Apacheで複数のドメインでHTTPSなサイトを扱うには、以下の方法があるようです。
- SNIを使う
- SAN拡張を使用した複数のホスト名に対応した証明書を使う
これを適用してみます。なお、このエントリで使用しているSSL証明書は、すべて自己署名証明書です。
いずれの場合も、VirtualHostとServerNameの組み合わせ(NamedVirtualHost)で実現することになります。ServerNameは意識しましょう、と。
SNIを使う
SNIを使う場合、各ServerNameに対応する証明書を作成し、それぞれのVirtualHostに設定すればよいです。
<VirtualHost *:443> ServerName hoge.com SSLEngine on SSLCertificateFile /etc/apache2/sites-available/hoge_com.crt SSLCertificateKeyFile /etc/apache2/sites-available/hoge_com.key </VirtualHost> <VirtualHost *:443> ServerName test.com SSLEngine on SSLCertificateFile /etc/apache2/sites-available/test_com.crt SSLCertificateKeyFile /etc/apache2/sites-available/test_com.key </VirtualHost>
SNIに対応していないブラウザを拒否するには、「SSLStrictSNIVHostCheck」を「on」に設定します。
SSLStrictSNIVHostCheck on
デフォルトは「off」で、「on」にした場合はSNIに対応していないブラウザに対してエラーを返すようになります。以下の、「TLS/SNIをサポートするブラウザ」を参照。
Server Name Indication - Wikipedia
なお、サーバーがSNIに対応しているかどうかを調べるには、OpenSSLのs_clientサブコマンドと「-servername」オプションを
使用します。
※接続先のポートは、「443」であっても明示的に指定しましょう
$ openssl s_client -connect [IPアドレス or ホスト名]:[ポート] -servername [サーバー名]
SAN拡張を使用した、SSL証明書を使う場合
SAN拡張を使用したSSL証明書を使う場合は、それぞれのVirtualHostに同じSSL証明書を指定して上げればOKです。
<VirtualHost *:443> ServerName hoge.com SSLEngine on SSLCertificateFile /etc/apache2/sites-available/server.crt SSLCertificateKeyFile /etc/apache2/sites-available/server.key </VirtualHost> <VirtualHost *:443> ServerName test.com SSLEngine on SSLCertificateFile /etc/apache2/sites-available/server.crt SSLCertificateKeyFile /etc/apache2/sites-available/server.key </VirtualHost>