【WordPress】SSL(https)には無料のLet’s Encryptがオススメ!必要な設定一覧と手順

VPSのサーバを使ってWordPressで運用している当サイトも先日SSL化しました。SSL化するために対応した必要な作業一覧と手順を残しておきます。

当サイトの環境

前提として、当サイトの構築環境は以下の通りです。

  • サーバはConohaのVPSを利用中
  • OSはubuntu16.04
  • Webサーバはnginx

必要な作業

大まかに必要な作業は以下の通りです。

  • WordPressの設定、定義ファイル修正
  • SSLサーバ証明書の導入
  • nginxの設定変更
  • 記事内URLの変更(http→https)
  • Google Analyticsの設定変更
  • Search Consoleのプロパティ追加
  • SSL自動更新設定の追加

これから作業した内容に入りますが、作業前にバックアップを取得しておくことを強くオススメします。

WordPressの設定変更、定義ファイル修正

※いきなりWordPress側の設定変更と違和感のある手順になっていますが、SSLサーバ証明書導入時にnginxを落とす必要があり、手順通りにやればできるようにするためとわかりやすさを考慮した時にこのような記事構成になっていることを予めご了承ください。

URLをhttpsに変更


WordPress管理画面の設定→一般設定から”WordPress アドレス (URL)”と”サイトアドレス (URL)”をhttp→httpsに変更しておきます。

wp-config.phpの修正

wp-config.phpに以下の内容を追記します。

$_SERVER[‘HTTPS’] = ‘on’;
$_ENV[‘HTTPS’] = ‘on’;

これを設定しておかないと、SSL化したときにリダイレクトループになってしまいます。(これがわからず少しハマりました・・・。)

SSLサーバ証明書の導入

SSL化するにあたってSSLサーバ証明書が必要になります。SSLサーバ証明書といえば有料のものが多いですが、無料で利用できる「Let’s encrypt」を選択します。

Let’s encryptをインストール

$ sudo apt-get install letsencrypt

もしもパッケージが見つからずインストール出来ない場合は、以下のupdateを行ってから再度実行してください。

$ sudo apt-get update

SSLサーバ証明書の発行

letsencryptが80番ポートを使用するので、nginxを停止します。

$ sudo service nginx stop

SSLサーバ証明書を発行します。

$ sudo letsencrypt certonly --standalone -d otaku-blog.net
※-d オプションには自分のサイトドメインを入力します。

メールアドレスの入力を求められるので、サイトで使ってるメールアドレスを入力して完了させるとSSLサーバ証明書が発行されます。

DH鍵交換に必要なファイル生成

 $ cd /etc/nginx
 $ sudo mkdir ssl
 $ cd ssl
 $ sudo openssl dhparam 2048 -out dhparam.pem

後述するnginxの設定に必要なファイルを生成します。

nginxの設定変更

nginxをSSL用に設定変更します。

nginx設定ファイル例
server {
listen 80;
server_name otaku-blog.net;
return 301 https://$host$request_uri;
}

server {
listen 443;
server_name otaku-blog.net;

ssl on;
ssl_certificate /etc/letsencrypt/live/otaku-blog.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/otaku-blog.net/privkey.pem;

ssl_dhparam /etc/nginx/ssl/dhparam.pem;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers “EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4”;

…省略…
}

httpにアクセスされた時は、httpsにリダイレクトする設定をしています。

pemファイルのパスが違う場合は、/etc/letsencrypt配下のそれっぽいファイルを指定してください。

ポート443(SSL)を許可しておく

ファイアーウォールでポート番号を制限している場合は、SSL専用のポート番号443を使えるように設定してください。

また、さくらVPSでは以下の設定が必要だったので必要に応じて設定してください。

$ sudo vim /etc/iptables/iptables.rules

以下の内容を追記
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT

$ sudo iptables-restore < /etc/iptables/iptables.rules

nginx起動

nginxのファイル確認

$ sudo nginx -t

問題なければ停止していたnginx起動します。

$ sudo service nginx start

サイト表示確認

サイトを開き表示されることを確認します。

記事内のURL変更(http→https)

投稿した記事内の内部リンクや画像リンクはhttpのままになってしまっています。
それを修正する必要があります。

Search Regexで一括置換

「Search Regex」のプラグインを使えば記事内の文字を一括で置換することができます。

WordPress管理画面の「プラグイン」→「新規追加」→「Search Regex」で検索→インストール、有効化します。
WordPress管理画面の「ツール」→「Search Regex」を開きます。


"Search pattern"にhttpのURL、"Replace pattern"にhttpsのURLを入力します。
"Search"ボタンを押すと、置換対象の一覧が表示されるので問題無さそうなら、"Replace&Save"ボタンで置換を行います。

注意
※置換でミスしてしまうと、最悪記事を復元しないといけなくなるので事前にバックアップしておくことを推奨しました。

Search Regexで置換できない場合

別サイトの作業をした際に、「Search Regex」のプラグインでは対象件数が多すぎて置換できないという事象が発生したので、直接SQLを触って修正しました。

対象記事を事前に確認

select post_title,post_type from wp_posts where id between 1 and 1000 and post_type="post";

IDが1~1000の投稿記事をhttpsに変更

update wp_posts set post_content = replace(post_content, "http://otaku-blog.net", "https://otaku-blog.net") where id between 1 and 1000 and post_type="post";
※固定ページを対象にしたい場合は、post_typeを"page"にしてください。

今までの経験則上、UPDATEする件数は絞って更新するのがベターだと思ってるのでこのように作業しました。where句のIDの条件は外して、post_typeの条件だけでも良いかもしれません。(post_typeも件数を減らすために絞っているだけで無くても問題ないのかも。)

その他のhttpsに修正

headerタグ内のJS埋め込みなどhttp部分がある場合は、httpsに修正してください。

Google Analyticsの設定変更

アナリティクスもhttpsの設定変更をする必要があります。

「管理」→「プロパティ」→「プロパティ設定」を開きます。
「デフォルトのURL」の部分を「http」→「https」に修正します。

次に

「管理」→「ビュー」→「ビュー設定」を開きます。
「ウェブサイトのURL」の部分を「http」→「https」に修正します。

Search Consoleのプロパティ追加

https化してURLが変わってるので、新たにhttps版で追加する必要があります。(URLの修正はできないみたい。)
プロパティ追加から、https版のURLを追加して所有権確認をして完了です。

SSL自動更新設定の追加

Let's encryptのSSLサーバ証明書は有効期限が3ヶ月です。3ヶ月毎に手動で更新するか、自動更新設定をする必要があるので、cronで自動更新する手順の紹介です。

まずは、cron設定ファイルを開き、参考例のような設定をして保存します。

$ sudo vim /etc/crontab
cron設定参考例
0 4 1 * * root service nginx stop;letsencrypt renew --force-renew; service nginx start;

毎月1日のAM4時にSSLサーバ証明書を更新する設定になっています。

前述の通り、SSLサーバ証明書を更新するためには80番ポートを使用するため、一度nginxを落としてSSLサーバ証明書を更新してからnginxを起動する内容になっています。

cronに設定する前に一度手動で正常に動作できるか確認しておいてください。

更新に失敗する場合の簡単な対処法

原因不明ですが、renewコマンドでSSLサーバ証明書を更新できない時がありました。その際の簡単な対処法を載せておきます。

sudo mv /etc/letsencrypt /etc/letsencrypt.old
sudo apt-get install letsencrypt
sudo service nginx stop
sudo letsencrypt certonly --standalone -d otaku-blog.net
sudo service nginx start

やっていることは簡単でletsencryptを新しく入れ直してSSLサーバ証明書を取得しているというシンプルな手順です。更新ができず調べてもわからない場合などこの手順もお試して頂ければと思います。

SSLサーバ証明書の有効期限をチェックする方法

SSLサーバ証明書の有効期限は簡単にチェックすることができます。

# SSLサーバ証明書の有効期限チェックツールを導入
$ sudo apt-get update
$ sudo apt-get install ssl-cert-check
※入力を求められますがデフォルトでOKです。

# SSLサーバ証明書の有効期限チェック
$ sudo ssl-cert-check -c /etc/letsencrypt/live/otaku-blog.net/cert.pem

Host                                            Status       Expires      Days
----------------------------------------------- ------------ ------------ ----
FILE:/etc/letsencrypt/live/otaku-blog.net/cert.pem Valid        Aug 17 2018  88        

こんな感じで簡単にチェックできます。

最後に

SSL化する手順の記事はたくさんありますが、1つの記事だけ見てその通りやったらできたというのがなかったので同じ環境の人に参考になればと思い残しておきました。
1人でも参考になる人がいればとても嬉しく思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です