Let’s Encryptがベータ版から正式版になり、WordPress.comがLet’s Encryptを使って全部のドメインをhttpsに対応すると発表されました。

ここはひとつ、このサイトもLet’s Encryptを使ってhttpsにしてやりましょう。KUSANAGIにはまだ「あとからhttpsに変える方法」は提供されていないため、ある程度手作業でやります。

前提条件

このサイトは2016年3月14日にKUSANAGIに乗せ換えています。KUSANAGIのLet’s Encrypt対応とHTTP/2対応は2月8日に行われているため、それ以前にプロビジョニングを行っている場合はバージョンアップ説明を見ながらHTTP/2への対応を行ってください。

KUSANAGI バージョンアップ情報 7.8

手順

KUSANAGIのupdate

せっかくなので、まずKUSANAGIそのものを最新化します。

# yum update

私の場合カーネルアップデートもあったので、このあとサーバを再起動しました。

シェルスクリプトをパクる

途中からLet’s Encryptに変更する手段は提供されていませんが、最初のプロビジョニング時にLet’s Encryptを使う方法は提供されています。
なので、プロビジョニングし直すというのも1つの方法なのですが、DB設定やらもいじるのはちょっと嫌なので、Let’s Encryptの部分だけ引っ張ってきます。

シェルスクリプトの /usr/lib/kusanagi/lib/virt.sh の次の部分が該当行です。

※2016-08-07追記:updateがあり、現在はコード内容がすこしだけ違います。

# cert files
if [ "" != "$MAILADDR" ] && [ -e /usr/local/letsencrypt/letsencrypt-auto ]; then
        # create lets encrypt.
        /usr/local/letsencrypt/letsencrypt-auto certonly --webroot -w /home/kusanagi/$PROFILE/DocumentRoot -d $FQDN -m $MAILADDR --agree-tos
        if [ -e /etc/letsencrypt/live/$FQDN/fullchain.pem ]; then
                sed -i "s/\/etc\/pki\/tls\/certs\/localhost.crt/\/etc\/letsencrypt\/live\/$FQDN\/fullchain.pem/" /etc/nginx/conf.d/${PROFILE}_ssl.conf
                sed -i "s/\/etc\/pki\/tls\/private\/localhost.key/\/etc\/letsencrypt\/live\/$FQDN\/privkey.pem/" /etc/nginx/conf.d/${PROFILE}_ssl.conf
                sed -i "s/\/etc\/pki\/tls\/certs\/localhost.crt/\/etc\/letsencrypt\/live\/$FQDN\/fullchain.pem/" /etc/httpd/conf.d/${PROFILE}_ssl.conf
                sed -i "s/\/etc\/pki\/tls\/private\/localhost.key/\/etc\/letsencrypt\/live\/$FQDN\/privkey.pem/" /etc/httpd/conf.d/${PROFILE}_ssl.conf
                DAY=`date '+%d'`
                if [ 28 -lt $DAY ]; then
                        DAY=`expr $DAY - 10`
                fi
                echo "07 03 $DAY */2 * /usr/bin/kusanagi update cert $PROFILE" >> /var/spool/cron/root
                if [ "$RET" != "" ]; then
                        systemctl restart nginx
                else
                        systemctl restart httpd
                fi
        fi
fi

環境変数が使われているので、これをコピペしたファイルの先頭で環境変数を設定して、実行すればLet’s Encryptの証明書を使ったhttpsページが有効になります。

# vi lets.sh
MAILADDR="mail@example.com"
PROFILE="blog_noldor_info"
FQDN="blog.noldor.info"
RET="nginx"

# cert files
if [ "" != "$MAILADDR" ] && [ -e /usr/local/letsencrypt/letsencrypt-auto ]; then
以下略
# sh lets.sh

Let’s Encryptの証明書有効期限は90日ですが、KUSANAGIでは2か月ごとに自動更新されます。cronの設定はrootユーザに追加されます。

# crontab -l
07 03 20 */2 * /usr/bin/kusanagi update cert blog_noldor_info

WordPressの設定変更

つぎにWordPressのURL設定をhttps://に変更します。

これでhttpsでの表示がととのいます。

httpからhttpsへリダイレクト

このままだとhttpでのアクセスもできてしまうので、せっかくなのでhttpsにリダイレクトしましょう。

# vi /etc/nginx/conf.d/blog_noldor_info_http.conf

access_logとerror_logのしたあたり(11行目あたり)に次の行を追加します。

  return 301 https://$host$request_uri;

nginxを再起動します。

# kusanagi nginx

これでhttpsにリダイレクトされるようになります。

Google Analyticsなどの設定

あとはGoogle AnalyticsやSearch Console(ウェブマスターツール)など、外部ツールを使っていればそれらも変更しましょう。

残る課題はWordPress本文中imgタグのhttp://の記述

残る課題として、WordPress本文中imgタグがhttp://になっているはずです。WordPressで画像を本文中に入れるとフルパスで記述されるので、既存の記事はhttp://のまま残ってしまいます。
これをhttpsに置換するには、置換用プラグインを使うか、DBを直接書き換えるか、1つ1つ記事を書き換えるか、ということになります。記事が少なければ手で書き換えてもよさそうですが、数が多いと大変そうです。

そのまま放っておいてもhttpsへのリダイレクトはされるのですが、いったんhttpでアクセスするので「暗号化されていないページへのアクセスがある」とブラウザが警告してきますので、できれば書き換えたいところですね。