ここでは、CentOS 7+Nginx環境に構築したWordPress環境を、常時SSL化したときの手順を紹介します。(常時SSL化とは、Webサイトの一部ではなく全体をHTTPS化することを指しています。)
目次
WordPressを常時SSL化する手順
外部から読み込むリソースのURLをHTTPS化
利用しているWordPressのテーマで、外部サイトのリソースを「http://」で読み込んでいる部分を「https://」 またはプロトコルを省いたURL(//以降)に変更します。
たとえば、以下のようなURLを変更します。
<修正前> http://ajax.googleapis.com//ajax.googleapis.com
<修正後> https://ajax.googleapis.com//ajax.googleapis.com もしくは
//ajax.googleapis.com//ajax.googleapis.com
サーバ証明書関連
証明書取得
サーバ証明書は、コマンドで簡単に取得・更新できる「Let's Encrypt」を利用します。
まずは必要なパッケージをインストールします。
# yum -y install epel-release
# yum -y install --enablerepo=epel certbot
次にcsertbotコマンドで証明書を取得します。
# certbot certonly --webroot -w /var/www/wordpress -d example.com -d www.example.com --agree-tos
指定しているオプションの詳細は、下記の参考URLを参照してみてください。
しばらく待って「IMPORTANT NOTES:」に「Congratulations!」と表示されたら証明書の取得完了です。
取得した証明書は、下記の場所に保存されます。
- サーバ証明書(公開鍵)
実体:/etc/letsencrypt/archive/ドメイン名/certX.pem
シンボリックリンク:/etc/letsencrypt/live/ドメイン名/cert.pem - 中間証明書
実体 : /etc/letsencrypt/archive/ドメイン名/chainX.pem
シンボリックリンク : /etc/letsencrypt/live/ドメイン名/chain.pem - サーバ証明書と中間証明書が結合されたファイル
実体 : /etc/letsencrypt/archive/ドメイン名/fullchainX.pem
シンボリックリンク : /etc/letsencrypt/live/ドメイン名/fullchain.pem - 秘密鍵
実体 : /etc/letsencrypt/archive/ドメイン名/privkeyX.pem
シンボリックリンク : /etc/letsencrypt/live/ドメイン名/privkey.pem
※ Xは取得した回数
証明書の更新設定
systemdのtimerを有効化します。
# systemctl enable --now certbot-renew.timer
Created symlink from /etc/systemd/system/timers.target.wants/certbot-renew.timer to /usr/lib/systemd/system/certbot-renew.timer.
証明書を更新した際は、nginxサービスを再起動するように設定しておきます。
# vi /etc/sysconfig/certbot
POST_HOOK="--post-hook 'systemctl restart nginx'"
設定が完了したら、以下のコマンドでcertbot-renew のNEXT欄に起動予定時刻が入っていることを確認します。
# systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
火 2018-03-27 02:37:27 JST 1h 32min left 月 2018-03-26 01:47:26 JST 23h ago certbot-renew.timer certbot-renew.service
証明書更新処理の結果確認
更新処理の実行結果を確認するときは、次のコマンドを実行します。
# journalctl -u certbot-renew
NginxでHTTPS通信を有効化
以下の設定をserverブロックに追記します。それぞれの設定内容についての説明は、詳しく說明する自信がないので割愛させていただきます。
ちなみに、HTTPSでの動作確認が完了するまで、HTTPでの待受も残しておきます。
# vi /etc/nginx/nginx.conf
server {
listen 80;
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!EXPORT:!DES:!3DES:!MD5:!DSS;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
add_header Strict-Transport-Security 'max-age=31536000';
}
以下についても忘れずに設定します。
- FastCGIパラメータの設定をしている箇所に「fastcgi_param HTTPS on;」を追加
- ファイアウォールでHTTPS通信を許可しておく
WordPressのURL変更
WordPressの管理画⾯の「設定」→「⼀般」で、WordPressアドレスとサイトアドレスを「https://」に変更します。
投稿記事のサイト内リンクURLを変更
投稿記事に挿入されている画像などのサイト内リンクを「http://」から「https://」に修正します。さすがに1つ1つを修正するのは⼤変なので、WordPressプラグイン「Search Regex」を使⽤して一括置換します。
サイトの表示確認
すべての手順を完了したら、ブラウザで自サイトを開きアドレスバーの左が以下のように緑色になっていることを確認します。
ページ内にhttpが残っているとアドレスバーの左が「!マーク」になるので、ページのソースを表示しhttp部分を探して修正します。
以上で作業は完了です。(Nginxの80番ポートの待受は削除するか、リダイレクトさせます)
おまけ
SSLが有効なサーバを解析し安全性を評価してくれる「Qualys SSL Labs - SSL Server Test」で、自サーバーをチェックしてみました。A+評価をいただき、ひとまず安心です。
あとがき
ここでは、常時SSL化に必要な最小限の手順を紹介しました。
環境によっては、SSL化することにより以下のような対応も必要となる場合があります。
- SNSのシェア数は引き継がれないようなので、引き継がれるようにするには別途作業が必要なようです。
- 「Google Search Console」を利用している場合、プロパティの追加が必要です。
- 「Google Analytics」を利用している場合、プロパティとビュー設定の修正が必要です。
参考
https://certbot.eff.org/docs/using.html#getting-certificates-and-choosing-plugins