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の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でアクセスするので「暗号化されていないページへのアクセスがある」とブラウザが警告してきますので、できれば書き換えたいところですね。
最近のコメント