Let’s Encrypt のワイルドカード証明書を ConoHa API で自動更新する

ConoHa Enterprise Linux 9
このサイトはアフィリエイト広告(Amazonアソシエイト含む)を掲載しています。
スポンサーリンク

この記事は ConoHa VPS 2.0 API 向けの内容になります。

Certbot を使って Let' Encrypt の SSL 証明書を取得するには、外部に公開されたウェブサーバーか DNS サーバーで認証する必要があります。

ConoHa VPS に検証用として RHEL9 の設定を進めているのですが、現状ではウェブサーバーを外部には公開しておらず、管理者の IP アドレスからしかアクセスできない設定になっています。

Certbot の DNS 認証を使えば、非公開のウェブサーバー用の SSL 証明書を取得でき、ワイルドカード証明書も取得できるので一石二鳥ですが、更新のたびに DNS を手動で書き換えるのは手間になります。

探してみたところ、ConoHa API を使って自動で TXT レコードを書き換えてくれるスクリプトがありましたので、これを使った設定方法を記録しておきます。

ConoHa VPS

Let's Encrypt の証明書を取得

Certbot のインストール

EPEL リポジトリから Certbot をインストールします。

dnf install certbot

※EPEL リポジトリが未導入の場合は下記を参考に入れてください。

Red Hat Enterprise Linux 9 の初期設定
前回の記事で ConoHa の VPS に RHEL9 をインストールする手順を説明しましたが、今回はこれに基本的な設定を施していきます。SELinux の無効化当初の予定では SELinux を有効にしたまま運用する気だったのだが、いきな...

letsencrypt-dns-conoha のセットアップ

Database Error

ConoHa API を介して認証用コードを自動的に設定してくれるスクリプトなのですが、オリジナルでは tyo2 リージョンに対応していなかったので、フォークされたものを使用しました。(https://github.com/tsukumijima/letsencrypt-dns-conoha

git コマンドで一式をダウンロードします。

git clone https://github.com/tsukumijima/letsencrypt-dns-conoha.git

Let's Encrypt ディレクトリ内で完結させたいので、/etc/letsencrypt にファイル一式を移動します。

mv letsencrypt-dns-conoha/ /etc/letsencrypt/conoha

スクリプトファイルに実行権限を付与します。

chmod +x /etc/letsencrypt/conoha/*.sh

設定ファイル(.env)をリネームします。

mv /etc/letsencrypt/conoha/.env.example /etc/letsencrypt/conoha/.env

ConoHa コントロールパネルから API のタブに移動し、API のユーザーネームとパスワード、テナント ID を確認します。また、エンドポイントの URL からリージョン(tyo1 か tyo2)もあわせて確認します。

ConoHa コントロールパネルの API 画面

※API ユーザーが設定されていない場合は作成してください。パスワードを設定するだけで、ユーザー名は自動的に割り当てられます。

上記の内容を、letsencrypt-dns-conoha の設定ファイルに記載します。

vi /etc/letsencrypt/conoha/.env

また、スクリプト内で jq コマンドを使用しますので、インストールしておきます。

dnf install jq

以上で、準備は完了しました。

SSL 証明書の取得

実際に SSL 証明書を取得します。

certbot certonly \
(out) --manual \
(out) --agree-tos \
(out) --no-eff-email \
(out) --manual-public-ip-logging-ok \
(out) --preferred-challenges dns-01 \
(out) --server https://acme-v02.api.letsencrypt.org/directory \
(out) -d "example.com" \
(out) -d "*.example.com" \
(out) -m "root@example.com" \
(out) --manual-auth-hook /etc/letsencrypt/conoha/create_conoha_dns_record.sh \
(out) --manual-cleanup-hook /etc/letsencrypt/conoha/delete_conoha_dns_record.sh
(out) 
(out) Successfully received certificate.
(out) Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem
(out) Key is saved at:         /etc/letsencrypt/live/example.com/privkey.pem

このとき指定したオプションは /etc/letsencrypt/renewal/example.com.conf に保存され、更新(certbot renew)時にも自動的に指定されます。

証明書の自動更新

以前は Cron で月に一回程度 certbot renew を実行するのが一般的でした。

#!/bin/sh
certbot renew --deploy-hook "systemctl restart httpd; systemctl restart postfix; systemctl restart dovecot"

最近では certbot をインストールすると一緒に導入される certbot-renew が自動的に更新してくれるため、cron を設定する必要はありません。

systemctl status certbot-renew.service
(out) ○ certbot-renew.service - This service automatically renews any certbot certificates found
(out)      Loaded: loaded (/usr/lib/systemd/system/certbot-renew.service; static)
(out)      Active: inactive (dead) since XXX XXXX-XX-XX XX:XX:XX JST; XXh XXmin ago
(out) TriggeredBy: ● certbot-renew.timer
(out)     Process: 269762 ExecStart=/usr/bin/certbot renew --noninteractive --no-random-sleep-on-renew $PRE_HOOK $POST_HOOK $RENEW_HOOK $DEPLOY_HOOK $CERTBOT_ARGS (code=exited, status=0/SUCCESS)
(out)    Main PID: 269762 (code=exited, status=0/SUCCESS)
(out)         CPU: 366ms

certbot-renew.service は certbot-renew.timer によって呼び出され、定期的に実行されます。

systemctl status certbot-renew.timer
(out) ● certbot-renew.timer - This is the timer to set the schedule for automated renewals
(out)      Loaded: loaded (/usr/lib/systemd/system/certbot-renew.timer; enabled; preset: enabled)
(out)      Active: active (waiting) since XXX XXXX-XX-XX XX:XX:XX JST; X month X days ago
(out)       Until: XXX XXXX-XX-XX XX:XX:XX JST; X month X days ago
(out)     Trigger: XXX XXXX-XX-XX XX:XX:XX JST; Xh left
(out)    Triggers: ● certbot-renew.service
(out) 
(out) Notice: journal has been rotated since unit was started, output may be incomplete.

証明書が更新された際に、自動的にサービスを再起動して反映させるためには /etc/letsencrypt/renewal-hooks/deploy/ の中にスクリプトを設置します。

#!/bin/bash
systemctl restart httpd
#systemctl restart lshttpd.service
systemctl restart postfix
systemctl restart dovecot
#systemctl restart vsftpd

以上で Let's Encrypt のワイルドカード SSL 証明書を自動運用する事ができるようになりました。

ConoHa VPS

コメント

タイトルとURLをコピーしました