ご注意下さい
この記事は3年以上前に書かれた記事ですので、内容が古い可能性があります。
SSLサーバー証明書の導入をしてWordPressもReally Simple SSLプラグインの導入でSSL対応されましたが、今回は常時SSL化するに当たって追加で実施しておくべき項目をご紹介します。
【FujiSSL】格安SSL証明書でWebサーバをSSL化する方法(apache + mod_ssl)
常時SSL化の為の追加設定
- HSTS(HTTP Strict Transport Security)設定
- Secure Cookie設定
まず、HSTSですが、こちらはHTTPで接続した際に、強制的にHTTPSへリダイレクトし、以降のそのドメインへの接続はすべてHTTPSとする機能がHSTS (HTTP Strict Transport Security) となります。
Secure Cookieの設定について、こちらはCookieを送信する場合にはHTTPS通信に限る、という設定です。HTTPSの時に作った Cookie がHTTP通信の時に平文で送信されることになる為、盗聴されることに繋がってしまいます。
では設定方法をそれぞれ見ていきましょう。
HSTS設定
こちらはApacheのVirtualhost毎に設定をします。ポートベースのVirtualhostを利用している場合にはどのポートに対しても設定されてしまうようでコモンネームに対して効いてしまうようです。
設定は/etc/httpd/conf.d/ssl.confに対して行います。
Virtualhostごとに以下の記述をすればOKです。
Header set Strict-Transport-Security "max-age=31536000" SSLEngine on SSLProtocol all -SSLv2 SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA SSLCertificateFile /etc/ssl/certs/kamata-net.jp.crt SSLCertificateKeyFile /etc/ssl/certs/kamata-net.jp.key SSLCertificateChainFile /etc/ssl/certs/kamata-net.jp.ca ~
オプションとしては、includeSubDomains、preloadもありますが、こちらはドメイン全てのWebサーバーがSSLで運用されている必要がありますので私の場合は設定できません(私の場合はblog.kamata-net.comドメインのみSSL運用)。
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
ちなみに、31536000は31536000秒で1年(365日)の指定となります。当サイトにHTTPでアクセスしても次回のアクセスからはHTTPSでの通信を1年間強制します。プリロードHSTSという仕組みを使ってブラウザ側にドメインリストを持たせれば初回からのHTTPS通信が可能ですが、ドメイン全てのWebサーバーがSSL運用されている必要があるため、私の場合は適用ができないことになります。
また自己署名証明書(オレオレ証明書)を利用しているとHSTSは使えないようです。
さて、Apacheの再起動前にChromeを起動してアドレスバーに「chrome://net-internals/#hsts」と入力して下の方のQuery Domainで「blog.kamata-net.com」と入力してみましょう。
Not Foundと表示されHSTS関連の情報は何もでませんでしたね。続いてApacheの再起動後Chromeでご自身のサイトにアクセス後、再度検索を掛けてみてください。
これでHSTSの設定が反映されたことが確認できました。
Secure Cookie設定
こちらはphp.iniでサーバー全体に設定を効かせるやり方と.htaccessで個別に効かせるやり方があるようです。
私は特定ドメインのみの設定としたいため、後者のやり方で実施します。
WordPressのドキュメントルート直下の.htaccessに以下の一行を追加するだけです。
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress php_flag session.cookie_secure On
と思ったら500/Internal Server Errorとなってしまいました。よく考えればPHPはモジュール版ではなくCGI版でした。ということでphp.iniを修正します。
; Whether to use cookies. ; http://php.net/session.use-cookies session.use_cookies = 1 ; http://php.net/session.cookie-secure ;session.cookie_secure = session.cookie_secure = 1
さらによく考えれば個人情報を送信するようなフォームもなく、ユーザ名とパスワードを要求するようなサイトでもありませんでした。。。
下記のようなスクリプトを一時作成してWebサーバに配置して叩いたところ、
<?php phpinfo(); ?>
設定してWebサーバを念のためリブート後は有効になっていました。