こうこく
作 ▸

kiriukun.com用の証明書をワイルドカード証明書に切り替えた

名前解決できなくなったサブドメインのせいで、Let's Encryptの証明書の更新が失敗するようになった時のメモ。

certbot 2.10.0
もくじ

前書き

最近、ブログを AWS S3 + CloudFront のサーバーレス構成にリニューアルした。CloudFrontではACMの証明書を使えるので、もともと使っていた note.kiriukun.com のLet's Encryptの証明書が不要になった。

Let's Encryptの証明書は、もともとブログが乗っていたサーバーで作成・更新していた。そのサーバーにはブログ以外のWebサイトも乗っているため、ブログをサーバーレス化したあとも稼働は続ける必要がある。

ところでその証明書は、単一の証明書に kiriukun.com の全てのサブドメインを詰め込んだものになっていた。

証明書の確認
sudo certbot certificates
結果 (※一部改変)
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Found the following certs:
  Certificate Name: kiriukun.com
    Domains: kiriukun.com note.kiriukun.com toybox.kiriukun.com wwv.kiriukun.com
    Expiry Date: 2024-04-09 18:02:45+00:00 (VALID: 56 days)
    Certificate Path: /etc/letsencrypt/live/kiriukun.com/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/kiriukun.com/privkey.pem
-------------------------------------------------------------------------------

よく知らずにLet's Encryptの使い方を調べながら逐一サブドメインを追加していったら、気が付いたらこうなってた。

さて、この状態でAWS Route53にて note.kiriukun.com の名前解決先をCloudFrontに変更したあと、この証明書の更新 (certbot renew) が失敗するようになった。エラーメッセージを見た感じでは「ACMEチャレンジ」に失敗したとあった。

後から思えば、名前解決先がLet's EncryptがいるサーバーではなくなったことでHTTP-01チャレンジに失敗するようになったのだと思うが、この時はよくわかっていなかった。

とにかく、名前解決できないせいで証明書が更新できないことだけ理解したので、この証明書から note.kiriukun.com を除去しようと考えた。

しかし調べた感じ、Let's Encryptにはいちど証明書に追加したサブドメインを後から削除する方法は無いらしい。というかそもそも、「SSL証明書にサブドメインを後から追加/削除する」ということ自体ができないようだ。証明書には証明書の内容から作ったデジタル署名がついてるので、それが変わることがダメなのかも。

Note

Let's Encryptでサブドメインを削除する方法を調べると、わりと sudo certbot delete --cert-name sub.example.com でできると出てくるけど、これは「サブドメインのために単独で証明書を作った場合にそれを消す方法」であり、すでにある証明書から特定のサブドメインを削除するものではない。

既存の証明書にサブドメインを追加/削除したければ、それを追加して証明書を作り直す、またはそれを除外して証明書を作り直す必要がある。 今まで certbot-auto の Expand でサブドメインを追加していたのも、実際には「サブドメインを追加して証明書を更新 (=作り直し)」してくれていたようだ。

今後、他のサブドメインも順次サーバーレスに移行していき、最終的にこのサーバーを潰すつもりでいた私は、移行のたびに同じ問題が起きないようこのタイミングでワイルドカード証明書に切り替えることにした。

ワイルドカード証明書の作り方

Certbotの公式サイトに手順が載っているのでその通りにする。

「My HTTP website is running」~で、自分が使っているサーバー (Software) と OS (System) を選択して、下部に表示された手順のタブ「wildcard」から手順を閲覧できる。

Certbot Instructions | Certbot

サーバーはApache、OSはUbuntu 18を選択した。

以下、手順通りに実施していく。

手順1. DNSプロバイダがCertbotでサポートされているか確認

ワイルドカード証明書を作るには DNS-01 チャレンジを行う必要がある。よってCertbotからDNSをいじれる必要があり、それをCertbotのプラグインでできることを「サポートされている」とするらしい。

ここではAWS Route 53を使用しているので、以下のリストの certbot-dns-route53 が該当する。

User Guide — Certbot 2.10.0.dev0 documentation

手順2. 対象サーバーにSSH接続

以後、Webサーバーが乗ってるサーバーに sudo ができるユーザーでSSH接続して操作。

手順3. snapdをインストール

Ubuntu 18.04 なので、元々 snapd はインストールされていた。

snap --version
結果
snap    2.61.1
snapd   2.61.1
series  16
ubuntu  18.04
kernel  4.15.0-1027-aws

プリインストールされていないバージョンのUbuntuの場合は、 sudo apt install snapd でインストールできるらしい。

手順4~6. Certbotを再インストール

過去に apt でCertbotをインストール済みだったため、snapで再インストールする必要があった。

古いcertbotをアンインストール。

sudo apt-get remove certbot

snapでcertbotを再インストール。

sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
certbot --version
結果
certbot 2.9.0

手順7~8. CertbotのDNSプラグインをインストール

ここでは先程確認したRoute 53用のプラグイン certbot-dns-route53 をインストール。

あと、certbotがプラグインをroot権限で動かすことを信頼する (trust-plugin-with-root=ok) 必要があるらしい。

sudo snap set certbot trust-plugin-with-root=ok
sudo snap install certbot-dns-route53

手順9. DNSの認証情報を設定

ここでは certbot-dns-route53 のマニュアルを確認。

Welcome to certbot-dns-route53’s documentation! — certbot-dns-route53 0 documentation

Route 53へのアクション route53:ListHostedZones, route53:GetChange, route53:ChangeResourceRecordSets が許可されたアクセスキーを当該サーバーに設定しておく必要がある。

もともと十分なアクセスキーを設定済みだったため、何もしなかった。

手順10. 証明書を (再) 作成する

今回は既存の証明書を同名でワイルドカード証明書に置き換えたい。よって、まず既存の kiriukun.com 証明書を削除する必要があった。

以下コマンドで、対話型インターフェースから証明書 kiriukun.com を選択して削除する。

sudo certbot delete

念のため、証明書が消えたことを確認。

sudo ls /etc/letsencrypt/live

その後、ワイルドカード証明書を作成する。前項と同様に certbot-dns-route53 のマニュアルを確認して、Examplesセクションに記載されているコマンドを参考にする。

ここではドメインは *.kiriukun.com および kiriukun.com を指定し、サブドメインだけでなくAPEXドメインにも使えるようにする。また、前述の通り既存の証明書を置き換えるだけでApacheの設定変更は不要なため、 -i apache オプションは指定せず、証明書の作成のみを行う。

sudo certbot certonly \
  --cert-name kiriukun.com \
  --dns-route53 \
  -d '*.kiriukun.com' \
  -d 'kiriukun.com'
結果
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for *.kiriukun.com and kiriukun.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/kiriukun.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/kiriukun.com/privkey.pem
This certificate expires on 2024-05-13.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

以上で証明書の作成は完了。

Note

まだApacheを再起動していないので、この証明書は反映されていない。

手順11. 証明書の自動更新ができることを確認

--dry-run つきで renew してみる。

sudo certbot renew --dry-run
結果
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/kiriukun.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Simulating renewal of an existing certificate for *.kiriukun.com and kiriukun.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded:
  /etc/letsencrypt/live/kiriukun.com/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

大丈夫そう。

手順12. 稼働確認

対象のサイトをブラウザから閲覧して、証明書情報の作成日が過去のものであることを確認したあと、以下コマンドでApacheを再起動。

sudo service apache2 restart

ブラウザでサイトをリロードして、証明書の作成日が変化していることを確認した。

以上。

調べている時に読んだページ

Let’s Encryptでワイルドカード証明書を取得する話 | IIJ Engineers Blog

User Guide — Certbot 2.9.0 documentation

How Can I Add Subdomains To My Certificate? - SSL.com

tls - Modifying SSL Certificate once created, Multi domain - Information Security Stack Exchange

この記事に何かあればこちらまで (非公開)