Let’s Encrypt証明書で常時SSLにしているこのサイトですが、QUALYS SSL LABS (https://www.ssllabs.com/ssltest/)のSSL Server Test 結果をA-(Aマイナス)からA+(Aプラス)にすることが出来ました。
Debian JessieのApache2のデフォルト設定のままでAマイナスなので、最初からなかなか良い成績です。さらにA-をAにするのは簡単でした。さらに常時SSLサイトなら、A+にもできました。Debian Jessieの安定版である、apache(2.4.10-10+deb8u8)、openssl(1.0.1t-1+deb8u6)での内容となります。
このページの目次
A-をAに(Forward Secrecyサポート)
テスト結果がA-の場合、「The server does not support Forward Secrecy with the reference browsers. 」というアドバイスが出ているはずです。More Info>>を開いても、Forward Secrecyとは何かという説明が英語で詳細に出ていますが、じゃあどうすれば良いのかはさっぱりわかりませんでした。ネットで調べると設定ファイルを一行変えるだけで対応できるようです。
SSL.confを編集
Debian JessieのApache2の場合、設定ファイル/etc/apache2/mods-available/ssl.conf を編集します。70行目の#SSLHonorCipherOrder onの先頭の#を外して有効にします。
# SSL server cipher order preference: # Use server priorities for cipher algorithm choice. # Clients may prefer lower grade encryption. You should enable this # option if you want to enforce stronger encryption, and can afford # the CPU cost, and did not override SSLCipherSuite in a way that puts # insecure ciphers first. # Default: Off SSLHonorCipherOrder on
これで、クライアントのブラウザーが弱い方の暗号化を選びたがる傾向があるのを、サーバー側で強い方の暗号化が選ばれるようにする設定が有効になるようです。上記のコメントにそう書いてあります。
apache2リロード
apache2をリロードして設定が反映されました。これて再テストするとAマイナスからAの結果に変更となりました。
service apache2 reload
AをA+に(HSTSサポート)
Aになって喜んでいたら、常時SSLサイトならばAプラスにもできるようだったので設定しました。HSTS(HTTP Strict Transport Security)の常時SSL通信対応にする設定をします。http://~でアクセスしてもhttps://~でサイトが表示される設定です。
いままでこのサイトでも.htaccessに301リダイレクトの設定をしており、http://~のアクセスもリダイレクトでhttps://~に強制的に表示する設定をしているのにと思いましたが、301リダイレクトではリダイレクトされるまで暗号化されていない通信が発生するのに対し、HSTSが有効だとブラウザーに事前にSSL通信でアクセスに来るように伝えることができるので、よりセキュアな通信が可能ということのようです。(参考サイト:Mozilla MDN)
Sites-Availableの設定ファイル
Debian JessieのApacheの場合は、/etc/apache2/sites-available/default-ssl.conf ファイルを編集します。deault-ssl.confファイルはdebianデフォルトの設定ファイルですが、環境によりファイル名は違います。
追加する一行は、Header set Strict-Transport-Security “max-age=31536000; includeSubDomains” です。必ず常時SSLサイトになっているホスト名のバーチャルホストにだけ設定する必要があります。
下の例のように、SSL証明書バスの下に追記しました。
<VirtualHost:443> ServerAdmin hoge@localhost ServerName def-4.com DocumentRoot /var/www/ SSLEngine on SSLCertificateFile /etc/letsencrypt/live/def-4.com/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/def-4.com/privkey.pem SSLCACertificateFile /etc/letsencrypt/live/def-4.com/chain.pem Header set Strict-Transport-Security "max-age=31536000; includeSubDomains" </VirtualHost>
Headersモジュールが必要ですが、おそらくすでに有効になっているはずです。念のため有効にしてみます。(すでに有効なら、”already enabled” と出るだけです。)
a2enmod headers
apache2リロード
apache2をリロードして設定が反映されます。これて再テストするとAからA+の結果に変更となりました。
service apache2 reload
最後に
このHSTS設定は、公開ディレクトリーの.htaccessに設定しても良いみたいです。それでも、.htaccessには301リダイレクトの記述があるままにしておいても、今回のapacheに設定する方法の方が優先されます。サーバーの設定が変更できないときは、.htaccessに設定するのが良いでしょう。
追記
NginxでHSTS設定をしてA+評価にした記事はこちら
OpenLiteSpeedでHSTS設定をしてA+評価にした記事はこちら