Certbot を使って Let' Encrypt の SSL 証明書を取得するには、外部に公開された Web サーバーか DNS サーバーで認証する必要があります。
ConoHa VPS に検証用として RHEL9 の設定を進めているのですが、現状では Web サーバーを外部には公開しておらず、管理者の IP アドレスからしかアクセスできない設定になっています。
Certbot の DNS 認証を使えば、非公開の Web サーバー用の SSL 証明書を取得でき、ワイルドカード証明書も取得できるので一石二鳥ですが、更新のたびに DNS を手動で書き換えるのは手間になります。
探してみたところ、ConoHa API を使って自動で TXT レコードを書き換えてくれるスクリプトがありましたので、これを使った設定方法を記録しておきます。
Let's Encrypt の証明書を取得
Certbot のインストール
EPEL リポジトリから Certbot をインストールします。
1 | # dnf install certbot |
※EPEL リポジトリが未導入の場合は下記を参考に入れてください。
letsencrypt-dns-conoha のセットアップ
ConoHa API を介して認証用コードを自動的に設定してくれるスクリプトなのですが、オリジナルでは tyo2 リージョンに対応していなかったので、フォークされたものを使用しました。(https://github.com/tsukumijima/letsencrypt-dns-conoha)
git コマンドで一式をダウンロードします。
1 | # git clone https://github.com/tsukumijima/letsencrypt-dns-conoha.git |
Let's Encrypt ディレクトリ内で完結させたいので、/etc/letsencrypt にファイル一式を移動します。
1 | # mv letsencrypt-dns-conoha/ /etc/letsencrypt/conoha |
スクリプトファイルに実行権限を付与します。
1 | # chmod +x /etc/letsencrypt/conoha/*.sh |
設定ファイル(.env)をリネームします。
1 | # mv /etc/letsencrypt/conoha/.env.example /etc/letsencrypt/conoha/.env |
ConoHa コントロールパネルから API のタブに移動し、API のユーザーネームとパスワード、テナント ID を確認します。また、エンドポイントの URL からリージョン(tyo1 か tyo2)もあわせて確認します。
※API ユーザーが設定されていない場合は作成してください。パスワードを設定するだけで、ユーザー名は自動的に割り当てられます。
上記の内容を、letsencrypt-dns-conoha の設定ファイルに記載します。
1 | # vi /etc/letsencrypt/conoha/.env |
また、スクリプト内で jq コマンドを使用しますので、インストールしておきます。
1 | # dnf install jq |
以上で、準備は完了しました。
SSL 証明書の取得
実際に SSL 証明書を取得します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # certbot certonly \ --manual \ --agree-tos \ --no-eff-email \ --manual-public-ip-logging-ok \ --preferred-challenges dns-01 \ --server https://acme-v02.api.letsencrypt.org/directory \ -d "example.com" \ -d "*.example.com" \ -m "root@example.com" \ --manual-auth-hook /etc/letsencrypt/conoha/create_conoha_dns_record.sh \ --manual-cleanup-hook /etc/letsencrypt/conoha/delete_conoha_dns_record.sh Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem Key is saved at: /etc/letsencrypt/live/example.com/privkey.pem |
このとき指定したオプションは /etc/letsencrypt/renewal/example.com.conf に保存され、更新(certbot renew)時にも自動的に指定されます。
証明書の自動更新
以前は Cron で月に一回程度 certbot renew を実行するのが一般的でした。
1 2 | #!/bin/sh certbot renew --deploy-hook "systemctl restart httpd; systemctl restart postfix; systemctl restart dovecot" |
最近では certbot をインストールすると一緒に導入される certbot-renew が自動的に更新してくれるため、cron を設定する必要はありません。
1 2 3 4 5 6 7 8 | # systemctl status certbot-renew.service ○ certbot-renew.service - This service automatically renews any certbot certificates found Loaded: loaded (/usr/lib/systemd/system/certbot-renew.service; static) Active: inactive (dead) since XXX XXXX-XX-XX XX:XX:XX JST; XXh XXmin ago TriggeredBy: ● certbot-renew.timer 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) Main PID: 269762 (code=exited, status=0/SUCCESS) CPU: 366ms |
certbot-renew.service は certbot-renew.timer によって呼び出され、定期的に実行されます。
1 2 3 4 5 6 7 8 9 | # systemctl status certbot-renew.timer ● certbot-renew.timer - This is the timer to set the schedule for automated renewals Loaded: loaded (/usr/lib/systemd/system/certbot-renew.timer; enabled; preset: enabled) Active: active (waiting) since XXX XXXX-XX-XX XX:XX:XX JST; X month X days ago Until: XXX XXXX-XX-XX XX:XX:XX JST; X month X days ago Trigger: XXX XXXX-XX-XX XX:XX:XX JST; Xh left Triggers: ● certbot-renew.service Notice: journal has been rotated since unit was started, output may be incomplete. |
証明書が更新された際に、自動的にサービスを再起動して反映させるためには /etc/letsencrypt/renewal-hooks/deploy/ の中にスクリプトを設置します。
1 2 3 4 5 6 | #!/bin/bash systemctl restart httpd #systemctl restart lshttpd.service systemctl restart postfix systemctl restart dovecot #systemctl restart vsftpd |
以上で Let's Encrypt のワイルドカード SSL 証明書を自動運用する事ができるようになりました。
コメント