今更ながらLet’s EncryptによるSSL対応

今更ながらLet's EncryptによるSSL対応 | りぐん怪獣じゃないもん!

概要

ここ数年でウェブの安全性についての環境が変わってきており、主要なブラウザや検索エンジンではSSLで無いサイトは警告が出たり順位が落ちるようになってきた。
このブログでは元々そういった認識の前から続けていたので、SSL対応なんぞされておらず面倒でここまで引き伸ばしてきた。
しかし最近ではSSLに対応していないせいか、検索順位がめっきり下がってきたので流石にまずいと思い重い腰を上げてHTTPS化することにした。
今後のために備忘録を書く。

個人ブログだからSSLの認証に高い金払えるわけでもないから、当然他と同様Let’s Encryptで対応する。
WordPress+Let’s Encryptなぞくさるほど例があるので比較的簡単に導入できた。

手順

まずはLet’s Encryptをかんたんに導入するためのクライアントツールであるcertbotを導入する。
EPELリポジトリが登録されていたらyumで入れられるようだ。

sudo yum install certbot python-certbot-apache

インストールが終わったら証明書を取得する。

sudo certbot certonly --webroot -w /path/to/wordpress/ -d blog.example.com
sudo ls /etc/letsencrypt/live/blog.example.com

-wの後にwordpressのパス、-dのあとにドメインを入れれば良い
いくつか質問項目が出てくるのでよしなに答えると完了する。
正常に取得できると/etc/letsencrypt/live/以下にドメイン名のディレクトリが生成され、その下に次のようなファイルができる。

cert.pem  chain.pem  fullchain.pem  privkey.pem  README

これでSS化家の準備が整ったのでHTTPサーバの設定を行う。
本ブログではApacheを使用しているのでその設定を変更する。
blog関連の設定はconf.dの中に一つのファイルとしてまとめているためそのファイルを編集する。

sudo vi /etc/httpd/conf.d/blog.conf #ブログのApache設定ファイル

次の項目を追加してリダイレクト設定

# HTTPでアクセスされたものをHTTPSにリダイレクトする
<VirtualHost *:80>
ServerName blog.ligun.net
ServerAlias blog.ligun.net
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=permanent]
</VirtualHost>

# もともとHTTP(80)で設定してたものを443に変更する
<VirtualHost *:443>
# Certbotで生成されたSSL用のファイルを設定する
SSLEngine on
SSLProtocol all -SSLv2
SSLCertificateFile /etc/letsencrypt/live/blog.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/blog.example.com/privkey.pem
SSLCACertificateFile /etc/letsencrypt/live/blog.example.com/chain.pem

... #以下は元と同じ設定

443番のポートを開放する。

sudo firewall-cmd --zone=public --add-service=https --permanent
sudo firewall-cmd reload

準備ができたのでサーバ再起動する。

sudo systemctl restart httpd.service

ここまで問題なければWordPressにアクセスすればHTTPSにリダイレクトされて表示されるはず
表示に問題なければWordPressの管理画面にログインし、設定→一般をクリックする。
WordPressアドレス、サイトアドレスの入力欄のURLをhttps似変更して保存する。
これで各記事へのリンクやリソースへのアクセスがhttpsになる。

更新手順自動化

Let’s Encryptは有効期限が90日なので定期的に更新する必要がある。
certbotに更新コマンドがあるのでcronで定期的に叩いてあげるようにする。
cron.dにそれ用のファイルを作成する。

sudo su
vi /etc/cron.d/certbot

記述は次の通り
毎週土曜午前4:00にcertbot renewして成功したらhttpd再起動
–post-hookはcertbotのオプションでコマンド実行後に処理を実行することができる。

0 4 * * 6 root /usr/bin/certbot renew --post-hook "/bin/systemctl restart httpd.service"

一応crond再起動

exit # rootユーザログアウト
sudo systemctl restart crond.service

cronが動いているか試したいときは適当に今の時間に近いように設定して時間が過ぎたら/var/log/cronで動いているか見てあげると良い。

以上で設定完了
実際は設定途中でmixed content(混在コンテンツ)やtoo_many_redirectとかのエラーで微妙にハマったところがあったけど、こっちの単純な設定ミスだった。
これでやっと現代的なブログになってきた。

コメントを残す