Lets’Encryptのサーバ証明書更新をcertbot-dns-route53で行ってみた。
今回はWEB関連のお話です。
このブログサイトのサーバ証明書は無償で利用可能なLetsEncryptを利用しています。
LetsEncryptは無償なのが良いのですが、有効期間が3ヶ月と短期間となっております。
このため、3ヶ月毎に証明書の更新作業が必要になってきます。
「*.1banzaka.com」ドメインはワイルドカード証明書となっています。
(※ブラウザのアドレスバーのURLの左端にある鍵マークの箇所で確認できます。)
このため更新時にはDNS認証での対応が必要になってきます。
これまでは以下のコマンドを実行して更新作業を実施していました。
$ certbot certonly --manual \
--server https://acme-v02.api.letsencrypt.org/directory \
--preferred-challenges dns \
-d *.1banzaka.com \
-m ***@1banzaka.com \
--agree-tos \
--manual-public-ip-logging-ok
更新方法
1)上記コマンドをWEBサーバ(Linux)のターミナル上で実行します。
2)コマンド実行の途中でDNSのテキストレコードに指定した値をセットするよう促されます。
3)そこで、表示された値をコピーし、AWSの管理画面を開き、Route53の該当レコード部分を書き換えます。
4)上記テキストレコードの書き換えが完了して、60秒経過したら、エンターキーを押下します。
(※該当テキストレコードの更新時間の設定を60秒と、最小になるよう設定しています。)
5)エンターキーを押下後、Letsencryptのサーバ側でDNSのテキストレコードを参照、
変更を認識できるとドメインの所有者であることが証明され、SSL更新が無事に実施されます。
6)サーバの設定を再読込みします。
$ sudo systemctl reload openlitespeed
この作業は3ヶ月に1度と頻度は少ないですが、以外と作業は手間です。
しかも有効期間が切れる日の数時間前の告知になるので、
有効期間を正確に覚えていない場合は作業を忘れてしまいがちです。
筆者は何度か、外出先でiPadのTerminus経由で更新を行うことになったり、
または有効期限が切れてしまうこともありました。
そんなわけで今回はこのSSL更新作業をもう少し簡便化できないかな?と思って
今回探してみましたところ、certbot-dns-route53なるプラグインがあることを発見!!
そこで早速試してみました。
certbot-dns-route53のプラグインインストール方法
pythonのpipモジュールを以下コマンドで追加します。
$ python3 -m pip install certbot-dns-route53
インストール後には以下AWS側の設定を行います。
AWS側への事前設定
1)IAMでAPI実行ユーザを作成、アクセスキー、シークレットキーの発行。
2)Route53実行のポリシー作成
3)上記ポリシーを1)で作成したユーザに適用
ポリシーは「LetsEncrypt」という名前で作成、JSON箇所に以下を貼り付けます。
{
"Version": "2012-10-17",
"Id": "certbot-dns-route53 sample policy",
"Statement": [
{
"Effect": "Allow",
"Action": [
"route53:ListHostedZones",
"route53:GetChange"
],
"Resource": [
"*"
]
},
{
"Effect": "Allow",
"Action": [
"route53:ChangeResourceRecordSets"
],
"Resource": [
"arn:aws:route53:::hostedzone/***YOUR_HOSTZONE_ID***"
]
}
]
}
上記で事前準備は完了です。
以降は、以下のコマンドのみで更新可能です。
certbot-dns-route53を使った更新方法
1)以下コマンドをWEBサーバ(Linux)のターミナル上で実行します。
$ certbot certonly \
--dns-route53 \
-d *.1banzaka.com \
-m ***@1banzaka.com \
--post-hook "systemctl reload openlitespeed"
2)上記で作業は終わりです。
あとはブラウザで更新確認を行うだけですね。
(※すぐに確認したい場合はキャッシュクリアしないと反映されないです。)
また、Linux上の以下コマンドでも確認が行えます。
$ openssl s_client -connect localhost:443 -servername osmaniax.1banzaka.com </dev/null 2>/dev/null |awk '/-----BEGIN CERTIFICATE-----/ , /-----END CERTIFICATE-----/ {print $0;}' |openssl x509 -noout -dates
上記コマンド実行結果は以下となります。更新前および更新後の情報が取得できます。
notBefore=Oct 14 02:38:57 2021 GMT
notAfter=Jan 12 02:38:56 2022 GMT
いかがでしょうか?
初回のAWS側の設定だけしておけば、コマンド1発で完了します。
かなり簡便化出来たのではないでしょうか。
さらにはコマンドを3ヶ月に一回実行するようcronに追加すれば完全自動化も可能です。
というわけで今回はここまで!!