見出し画像

Let's Encryptのサーバー証明書を自動更新してみた

IT戦略部 宇佐美です。
今回は少し趣向を変えてインフラエンジニアのような要素のお話したいと思います。

Webサーバーを運用されたことがある方はどなたでも通る道、証明書についてです。
証明書の更新までに
・CSRの準備
・ValueSSLなどの購入先での申請
・発行後、Webサーバーでの更新作業
など更新までに様々なステップを踏まなければなりません。

しかし、最近はLet's Encryptと呼ばれるフリーでオープンな認証局の証明書が使わることが多くなりました。
Let's Encryptは、90日間有効な証明書であり期限は短いですが、無料かつ1コマンド実行するだけで更新が可能なものになります。
ですが、期限が短いため定期的にコマンド実行することすら面倒くさい。。。
という方は、以下で紹介する内容を実施いただければと思います

※新規作成については「Let’s Encryptの使い方」のような文言で検索いただければと思います。

さっそくですが、自動更新までの道のりは2点あります。
・自動更新のスクリプトを作成しサーバーに配置し
・自動実行するようcronなどで定期実行設定
といった仕組みになります。

環境

・Amazon Linux release 2
・Apache/2.4.39
※nginxの場合Let's Encryptの更新コマンドが違うため、nginxように書き換えてください。

スクリプトの作成

対象のサーバーに以下のスクリプトを作成し、適宜配置してください。
[]にかかれているものは環境に応じて変更してください
ファイル名:sslupdate.sh

#!/bin/sh

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

## SSL証明書格納ディレクトリ
DIR=[証明書がおかれているディレクトリ]

## Logファイル
LOG=[更新ログを出力するディレクトリパス/ファイル名]
LOGERROR=[更新エラーログを出力するディレクトリパス/ファイル名]

## スクリプト起動日
DAY=`date +%s`

## 最終更新日
LASTUPDATE=`stat -c "%Y" ${DIR}/[証明書ファイル名]`

## スクリプト起動日と最終更新日の経過日数を計算
ELPSEDDAY=`expr \( ${DAY} - "${LASTUPDATE}" \) \/ 86400`

## エラーメール関連
MAILADD=[エラーメールを送信する宛先のメールアドレス]	## 送信先メール
TITLE=[エラーメールのタイトル]

## 経過日数が60日以上の場合、SSL更新を実施
if [ ${ELPSEDDAY} -ge 60 ]; then
	/usr/bin/certbot-auto renew --debug --post-hook "systemctl reload httpd" 1>${LOG} 2>${LOGERROR}
	## ログに成功記録がない場合、メールで通知する。
	ERRORCHECK=`grep -c "[証明書ファイル名] (success)" $LOG`
	if [ $ERRORCHECK -eq 0 ]; then
        	echo "SSL証明書の更新に失敗しました。確認お願いします。" >> ${LOGERROR}
		cat ${LOGERROR} | mail -s "${TITLE}" $MAILADD
		exit 1
	fi
	## 不要ファイル削除
	find [ログの絶対パス] -empty -type f -delete
fi

補足

/usr/bin/certbot-auto renew --debug --post-hook "systemctl reload httpd"

この部分が、Apache環境での証明書更新コマンドになりますので、nginxの場合はnginx用に変更してください


作成したコマンドのパーミッションを変更

chmod 755 sslupdate.sh

自動実行設定

cronに以下の設定を追加する。


0 10 * * 1 [作成したファイルのディレクトリ絶対パス]/sslupdate.sh > /dev/null 2>&1

毎週月曜日の10時にスクリプトが実行するようにしていますが、環境に応じて変更してください。
毎週の実行にしている理由は、スクリプト自体で証明書が60日以上経過したものでないと更新が実行されないようにしていますが、1ヶ月おきに実行にした場合、もしエラーが発生した場合メールを見落としてしまう可能性があるためです。

今後やりたいこと

cronで自動実行をしていますが、60日以上経過した場合自動実行。
というような動きができればより完璧なものになると思っています。
実装でき次第また掲載できればと思います。

注意点

動作環境は上記の環境のものになります。
ご利用いただいているサーバーによってはコマンドパスが違う場合がありますので、環境に合わせてスクリプトの変更をお願いします。
※2023/4/12時点の仕様に基づきます

最後に

私たち部門では、部門の工数削減のため、以下のような取り組みを積極的に行っています。これまでのご経験を活かせるような業務やタスクが多数あります!

  • 利用できるシステム・アプリの導入

  • 利用してみたいシステム・アプリの検証等

GO株式会社では、共に働く仲間を募集中です。
興味がある方は、お気軽にご連絡ください!