WordPress環境(Nginx+fastCGI+php-fpm)を常時SSL化する

CentOS7+nginx+fastCGI+php-fpm環境のWordPressを、常時SSL化したときの手順を紹介します。ちなみに、常時SSL化とは、Webサイトの一部ではなく全体をHTTPS化することを指しています。

手順

外部から読み込むリソースの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!」と表示されたら証明書の取得完了です。

Memo

取得した証明書は、下記の場所に保存されます。

  • サーバ証明書(公開鍵)
    実体:/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';
}
Memo

以下についても忘れずに設定します。

  • 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

スポンサーリンク