CLOVER🍀

That was when it all began.

Apacheに、複数ドメインのSSL証明書を導入する

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は意識しましょう、と。

動作確認したApacheバージョンは、2.4.29です。

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

Apache Module mod_ssl

デフォルトは「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>