SNIで常時SSLのバーチャルドメインサイトを構築します。
前提は、すでにIPアドレスベースのSSLサイトの設定はできていて、それにSNIでSSLのバーチャルドメインサイトを追加する形です。
実はSNIと言ってもそんなにとりたてて何か特別な作業が必要という訳ではありません。普通にバーチャルホスト80番ポートを443番ポートに変更して証明書だけIPベースと同じように各ドメイン名のを指定してやればそれでOKです。特にひねりはありません。むしろ、昔のIPベースのSSLサイトの時代に「IPアドレス一個にSSLサイトは一個のみ」というのを知らなくて設定ファイルを書いてやってみてうまく動かなくてやっとダメだと分かった時の設定でSNIはうまくいくように作られてます。
Apacheの設定ファイル
Apacheの設定ファイルは /usr/local/etc/apache24/httpd.conf で、その中で
: Include etc/apache24/extra/httpd-ssl.conf : Include etc/apache24/Includes/*.conf :
という風に、SSL設定ファイルが./extraフォルダ下にあり、バーチャルドメイン設定ファイルが./Includesフォルダ下に指定してあります。
Includesフォルダには任意の名前(私はFQDNをファイル名に使っています)の.conf ファイルがあればそれを全部 include して読み込む仕組みです。
各.confファイルはこんな感じでhttpとhttpsの設定を一緒にして管理しやすいようにしています。
# cat /usr/local/etc/apache24/Includes/www.example.com.conf
# VirtualHost example.com:
<VirtualHost *:80>
ServerName www.example.com
ServerAlias example.com
DocumentRoot /home/HOGEHOGE/public_html/www.example.com
<Directory "/home/HOGEHOGE/public_html/www.example.com">
Options Indexes FollowSymLinks ExecCGI Includes
AllowOverride all
Require all granted
</Directory>
CustomLog /var/log/httpd/www.example.com-access.log combined
ErrorLog /var/log/httpd/www.example.com-error.log
</VirtualHost>
<VirtualHost *:443>
ServerName www.example.com
ServerAlias example.com
DocumentRoot /home/HOGEHOGE/public_html/www.example.com
<Directory "/home/HOGEHOGE/public_html/www.example.com">
Options Indexes FollowSymLinks ExecCGI Includes
AllowOverride all
Require all granted
</Directory>
CustomLog /var/log/httpd/ssl-www.example.com-access.log combined
ErrorLog /var/log/httpd/ssl-www.example.com-error.log
# SSL
SSLEngine on
SSLCertificateFile "/usr/local/etc/letsencrypt/live/www.example.com/fullchain.pem"
SSLCertificateKeyFile "/usr/local/etc/letsencrypt/live/www.example.com/privkey.pem"
</VirtualHost>
こんな感じでhttpは80番ポート、httpsは443番ポートでそれぞれ同じドキュメントルートで設定してあり、違うのはSSL証明書の記述部分のみ。SSL証明書の部分は先のエントリーのLet’s EncryptのSSL証明書を使う場合の内容になっています。これを私はドメイン名とドキュメントルートだけ変更すれば良いテンプレートとして使っています。
この内容の.confファイルをそれぞれのバーチャルドメイン毎に作ってapacheを再起動してやれば追加完了です。また、不要になったバーチャルドメインは設定ファイル名の.confを.conf.NOとかにリネームしてApacheを再起動すれば除外することができます。
httpからhttpsへリダイレクト
最初からhttpsサイトだけであれば不要ですが、常時SSL化ということでhttpサイトへのアクセスをとりあえず全部httpsサイトへ誘導する設定です。
バーチャルドメインのドキュメントルートに.htaccessファイルを以下の内容で設定します。
# cat /home/HOGEHOGE/public_html/www.example.com/.htaccess
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
4行目は、
RewriteCond %{HTTPS} off
としている例が多いみたいですが、どちらも動作は同じ(はず)です。私はパラノイア的な設定が気に入ったので !=on [NC] の方を使っています。