2017年3月20日月曜日

MyDNS と Let's Encrypt を使って,FreeBSD 上の apache24 を https 化してみた(その4)

 FreeBSD 上の apache24 で運用している個人サイトの https 化(通信の暗号化)の話の(その4)である。
目次
 (a) その1:MyDNS を使って web サーバーをたてる
 (b) その2:オレオレ認証を使った https 化
 (c) その3:Let's Encrypt を使ったサーバー認証
 (d) その4:vhost や ssl などの apache24 の設定(今回)
 (e) その5:サイトの内容に関する注意点(最終)

 今回は暗号化に際しての apache の設定について書いておこう。

 その2:オレオレ認証を使った https 化でも apache の設定について書いたが,今回は Let's Encrypt を使う場合の設定の変更点や,1台のマシンに複数のホスト名をつける話(バーチャルホスト),古いサイト名へのアクセス(http:でのアクセス)の強制的な https: への移行,などについて書こうと思う。

(1) 証明書の登録
 まずは Let's Encrypt によるサーバーの証明書(ドメイン認証の証明書)を apache に登録しよう。 記入するのは FreeBSD の場合「/usr/local/etc/apache24/extra/httpd-ssl.conf」である。 その中の「SSLCertificateFile」と「SSLCertificateKeyFile」を書き直せばよい。 Let's Encrypt による証明書は「/usr/local/etc/letsencrypt/live/」に最新版があるので,それらを指定している。
SSLCertificateFile "/usr/local/etc/letsencrypt/live/www.hogehoge.mydns.jp/fullchain.pem"
SSLCertificateKeyFile "/usr/local/etc/letsencrypt/live/www.hogehoge.mydns.jp/privkey.pem"
 これで apache を再起動すればブラウザも安全なサイトと表示してくれるはずである。

(2) バーチャルホスト
 証明書を登録すれば安全なサイトになるが,以前の暗号化前のサイト名でのアクセスへの対処や,1台のマシンに異なるサイト名でアクセスをさせたい場合などがあるため, バーチャルホストを登録しておくのがよい。

 バーチャルホストは,1つの apache に対して複数のサーバー名を持たせるものである。 設定としては,まず「/usr/local/etc/apache24/httpd.conf」で「vhost_alias モジュール」と「httpd-vhosts.conf」を読ませるようにする。 具体的には,「/usr/local/etc/apache24/httpd.conf」の以下の2つの行をコメントアウトする。
LoadModule vhost_alias_module libexec/apache24/mod_vhost_alias.so

# Virtual hosts
Include etc/apache24/extra/httpd-vhosts.conf

(3) /usr/local/etc/apache24/extra/httpd-vhost.conf の設定
 次に,httpd-vhost.conf を設定しよう。 httpd-vhost.conf は「/usr/local/etc/apache24/extra/」の下にある。 その中に以下のようなものを書く。
<VirtualHost *:80>
    ServerName     www.hogehoge.mydns.jp
    ServerAdmin    email@address.com
    DocumentRoot   "/usr/local/www/data"
    CustomLog      "/var/log/httpd-access.log" common
    ErrorLog       "/var/log/httpd-error.log"
</VirtualHost>

<VirtualHost *:80>
    ServerName     www.hogehoge.com
    ServerAdmin    email@address.com
    DocumentRoot   "/usr/local/www/data"
    CustomLog      "/var/log/httpd-com-access.log" common
    ErrorLog       "/var/log/httpd-com-error.log"
</VirtualHost>
 ここでは,いずれも DocumentRoot は「/usr/local/www/data」にあり,連絡先メールアドレスは「email@address.com」である。 上が「www.hogehoge.mydns.jp」,下が「www.hogehoge.com」というバーチャルホストの記載である。 これらはhttp: (80番ポート)サービスへの記載であり,https: (443番ポート) の記載ではない。 https (443番ポート) のバーチャルホストの記載は「httpd-ssl.conf」の中で行う。

(4) /usr/local/etc/apache24/extra/httpd-ssl.conf の設定
 次に /usr/local/etc/apache24/extra/httpd-ssl.conf の記載について見てみよう。 httpd-ssl.conf では,各ホスト名1個につき1個のバーチャルホストを記載する。
 以下に例を示そう。 設定ファイルには例文がコメントアウトしてあるが,以下では色を変えたところがデフォルトとは違っている部分である。
# ------------------------------------------------
# www.hogehoge.mydns.jp
# ------------------------------------------------
<VirtualHost *:443>
DocumentRoot "/usr/local/www/data"
ServerName www.hogehoge.mydns.jp
ServerAdmin email@address.com
ErrorLog "/var/log/httpd-error.log"
TransferLog "/var/log/httpd-access.log"
SSLEngine on
SSLCertificateFile "/usr/local/etc/letsencrypt/live/www.hogehoge.mydns.jp/fullchain.pem"
SSLCertificateKeyFile "/usr/local/etc/letsencrypt/live/www.hogehoge.mydns.jp/privkey.pem"

<FilesMatch "\.(cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/usr/local/www/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-5]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
CustomLog "/var/log/httpd-ssl_request.log" "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>

# ------------------------------------------------
# www.hogehoge.com
# ------------------------------------------------
<VirtualHost *:443>
DocumentRoot "/usr/local/www/data"
ServerName www.hogehoge.com
ServerAdmin email@address.com
ErrorLog "/var/log/httpd-com-error.log"
TransferLog "/var/log/httpd-com-access.log"
SSLEngine on
SSLCertificateFile "/usr/local/etc/letsencrypt/live/www.hogehoge.com/fullchain.pem"
SSLCertificateKeyFile "/usr/local/etc/letsencrypt/live/www.hogehoge.com/privkey.pem"

<FilesMatch "\.(cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/usr/local/www/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-5]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
CustomLog "/var/log/httpd-ssl_request.log" "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>

(5) apache24 による URL の強制書き換え
 すでに暗号化してない web site を公開していて,それを暗号化 (https:) した場合,検索エンジンに残っている記録などのために,以前の http: へのアクセスがある。 そもそも検索エンジンも新しいサイトについて知らないので,検索エンジンに伝えないといけない。 そのためには,アクセス URL を強制的に書き換える必要がある。 .htaccess を使ってもできるみたいだが,ここでは rewrite モジュールを使ったものを書いておこう。

 強制的な書き換え(rewrite)を行うには,まず /usr/local/etc/apache24/httpd.conf の以下の部分をコメントアウトして,mod_rewrite.so を読み込ませないといけない。
LoadModule rewrite_module libexec/apache24/mod_rewrite.so

 実際の処理は <VirtualHost>ディレクティブの中に記載する。 例えば httpd-vhosts.conf の場合は以下のようになる。
<VirtualHost *:80>
    ServerName     www.hogehoge.mydns.jp
    ServerAdmin    email@address.com
    DocumentRoot   "/usr/local/www/data"
    CustomLog      "/var/log/httpd-access.log" common
    ErrorLog       "/var/log/httpd-error.log"

      RewriteEngine On
      RewriteCond %{SERVER_PORT} !^443$
      RewriteRule ^/kero/(.*)?$ https://www.hogehoge.mydns.jp/kero/$1 [R=301]
      RewriteRule ^/puni/(.*)?$ https://www.hogehoge.com/puni/$1 [R=301,L]
</VirtualHost>
rewrite に関係する部分は後半の4行である。

 ここでは,「http://www.hogehoge.mydns.jp/kero/ZZZZZ」にアクセスしてきたものを強制的に「https://www.hogehoge.mydns.jp/kero/ZZZZZ」に置き換えている。 「RewriteCond %{SERVER_PORT} !^443$」は,アクセスされたサーバーのポートが 443番じゃない時に以下の処理をしなさい,というコマンドである。

 その下の「RewriteRule ^/kero/(.*)?$ https://www.hogehoge.mydns.jp/kero/$1 [R=301]」の部分が書き換えの部分である。 ここでは DocumentRoot を除いた部分が /kero/ で始まるアクセスは,「https://www.hogehoge.mydns.jp/kero/$1」に置き換えろ,となっている。 最後の「$1」は入力の「(.*)」の部分である(正規表現を勉強するとわかる)。 コマンドの最後の「R=301」は「永久に置き換わりました」というサーバーサイドの反応であり,検索エンジンなどはこれをみて検索結果を新しいサイトに置き換える(はずである)。

 最後の行は末尾に [R=301,L] とある。この「L」はここで処理が終わり,という区切りみたい(実はわかっていないかも…)。

 以下が httpd-ssl.conf での記載である。 赤く色付けした部分が強制書き換えの部分である。
# ------------------------------------------------
# www.hogehoge.mydns.jp
# ------------------------------------------------
<VirtualHost *:443>
DocumentRoot "/usr/local/www/data"
ServerName www.hogehoge.mydns.jp
ServerAdmin email@address.com
ErrorLog "/var/log/httpd-ssl-error.log"
TransferLog "/var/log/httpd-ssl-access.log"
SSLEngine on
SSLCertificateFile "/usr/local/etc/letsencrypt/live/www.hogehoge.mydns.jp/fullchain.pem"
SSLCertificateKeyFile "/usr/local/etc/letsencrypt/live/www.hogehoge.mydns.jp/privkey.pem"
RewriteEngine On
RewriteRule ^/$ https://www.hogehoge.mydns.jp/kero/index.html [R=301]
RewriteRule ^/kero/$ https://www.hogehoge.mydns.jp/kero/special.html [R=301,L]
<FilesMatch "\.(cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/usr/local/www/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-5]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
CustomLog "/var/log/httpd-ssl_request.log" "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
 ここでは,最初の書き換えコマンドは「https://www.hogehoge.mydns.jp/」宛へのアクセスは,「https://www.hogehoge.mydns.jp/kero/index.html」へ振替えている。 「^/$」は正規表現で,「/」しか含まれていない,ということを示している。
 2個目の書き換えコマンドは httpd-vhosts.conf のものと同じであり,「https://www.hogehoge.mydns.jp/kero/」宛へのアクセスを「https://www.hogehoge.mydns.jp/kero/special.html」に置き換えている。

(6) SSL Labs によるサイトの安全性のチェック
 https://www.ssllabs.com/ssltest/ で,作ったサイトの URL を入力すると,サイトの安全性の評価をしてくれる。私の作ったサイトの場合,2017年3月時点では「総合 A 評価」を頂いた。 みなさんも調べてみてはいかがだろうか?

(その5)サイトの内容に関する注意点に続く

0 件のコメント: