
本サイトは無料のSSLサーバ証明書であるLet’s Encryptを使っているのですが、証明書の有効期限が切れてしまって復旧させるまでに5時間ほどターミナルとにらめっこするハメになってしまいました。
サイト構成
本サイトは「超高速Wordpress仮想マシン」と謳っているプライム・ストラテジー社のKUSANAGIを利用しています。
AWSでKUSANAGIのAMI(Amazonマシンイメージ)が無料で配布されていたので、これを使わせてもらいました。
OSはCentOS7, Webサーバはnginxとなっています。
Let’s Encrypt
Let’s Encryptは無料で利用可能なSSLサーバ証明書です。
SSLサーバ証明書は、グローバルサインのような電子証明書販売会社から購入するのが一般的だったのですが、初期導入と数年おきの更新に数万円単位で費用がかかるので、個人サイト運営者にとっては遠い存在でした。
とはいえ、昨今セキュリティ意識の高まりとともに、個人サイトであってもhttps化するのが一般的になってきており、無料で使えるのはとても助かりますね。
Google先生もhttpsのサイトを優先的にランク上位に表示するようになっているらしいので、SEO対策としても有効です。
KUSANAGIでは、このLet’s Encryptが使えるようになっていて、初期導入時にメールアドレスを入力するだけで、Webサイトのhttps化が可能なので導入は非常に簡単でした。
Let’s Encryptは証明書の有効期限が90日と比較的短く設定されているため、しょっちゅう更新が必要になるのですが、更新の方法はコマンドを数行打つだけで簡単だし、自動更新の設定にしてしまえばほぼ気にせずにずっと使えます。
KUSANAGIでは、Let’s Encryptで取得した証明書をインストールした段階で、自動更新がONになりますが、どうやらこれがうまく動作していなかったらしくて、期限切れになっていました。
結果的には、KUSANAGIのコマンドではなく、直接Let’s Encryptのcertbotクライアントを使って新規の証明書を再発行したらうまくいきました。
certbotクライアントのインストール
あらかじめsshでサーバにリモートアクセスし、sudoでroot権限を取っておきます。
$ ssh -i oshirabesan.pem centos@www.oshirabesan.com
$ sudo su -
certbotはLet’s Encryptが配布している証明書の発行等を行うソフトウェアです。
こちらを参考にインストールします。CentOS7の場合は以下のコマンドを実行します。
# yum install epel-release
Apacheではないので、python-certbot-apacheはインストールしませんでした。
インストール完了したらインストール先ディレクトリ(usr/local/certbot)に移動して、以下コマンドでテストしてみましょう。
# ./certbot-auto
ここまでで問題なさそうであれば、クライアントのインストールは完了しています。
証明書新規発行
certbotを使って新しく有効な証明書を取得しようとしたところ、以下のようにエラーがでました。
# certbot-auto certonly --standalone -d www.oshirabesan.com ------------------------------- Could not bind TCP port 443 because it is already in use by another process on this system (such as a web server). Please stop the program in question and then try again. -------------------------------
ポート443が他のプロセスで使われているから落とせってことですね。
Webサーバのnginxを停止しましょう。
# systemctl stop nginx
これでもう一度、certbot-auto certonlyを実行すると、証明書の取得が完了しました。
最後にWebサーバを起動しておしまいです。
振り返ってみると単純な手順なのですが、なんでKUSANAGIのコマンドで更新できないのか、など細かい原因を探してさまよっているのにかなりの時間を使ってしまいました…つかれた。
# systemctl start nginx
これで、元の通りサイトが正常に表示されるようになりました。
証明書の自動更新を確認する
さて、今回有効期限切れになってしまった要因の一つとして、設定したと思っていたKUSANAGIの自動更新が走らなかった点が挙げられますが、結局原因は不明です。
とりあえず、KUSANAGIのコマンドで証明書の自動更新を改めて有効にしたところ、以下のようなメッセージが表示されました。
# kusanagi autorenewal on 証明書の自動更新は既に無効です。何もしません。 完了しました。
有効にしたはずなのに無効になってしまいました、とでました。
がしかし、これでよいそうです。日本語訳がおかしいだけとのこと。
ただ、心配なので念のため今回実行した手順をcron(クロン)に設定します。
cronは定期的に実行するコマンドやスクリプトを、あらかじめ設定しておけるものです。
証明書の有効期限が切れる前に、更新処理を入れられれば証明書の有効期限が切れることはありません。
crontab(クロンタブ)と呼ばれるリストにコマンドを記載します。
# crontab -u root -e
-u rootは管理者権限で実行、-eは編集です。
すると、crontabのリストが出てきました。
07 03 * * 0 /usr/bin/kusanagi update cert
冒頭の数字は「分 時 日 月 曜日」後半はコマンドを表します。
現時点でどうやら、毎週日曜日の午前3時7分にKUSANAGIの証明書アップデートコマンドが登録されていますので、やはりKUSANAGIの証明書自動更新設定は有効のようでした。
ただ、念のため以下を追加で登録しておきます。
07 03 * * 0 /usr/bin/kusanagi update cert 00 05 01 * * /usr/local/certbot/certbot-auto renew --force-renewal && /bin/systemctl reload nginx
毎月1日午前5時ちょうどにcertbotの証明書強制更新(–force-renewal)とWebサーバの再起動(reload nginx)を追加しました。
これでなんとか自動更新ができるはず…と期待していますので、また90日後に確認したいと思います。