kiriukun.com用の証明書をワイルドカード証明書に切り替えた
名前解決できなくなったサブドメインのせいで、Let's Encryptの証明書の更新が失敗するようになった時のメモ。
前書き
最近、ブログを AWS S3 + CloudFront のサーバーレス構成にリニューアルした。CloudFrontではACMの証明書を使えるので、もともと使っていた note.kiriukun.com
のLet's Encryptの証明書が不要になった。
Let's Encryptの証明書は、もともとブログが乗っていたサーバーで作成・更新していた。そのサーバーにはブログ以外のWebサイトも乗っているため、ブログをサーバーレス化したあとも稼働は続ける必要がある。
ところでその証明書は、単一の証明書に kiriukun.com
の全てのサブドメインを詰め込んだものになっていた。
よく知らずに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
はインストールされていた。
プリインストールされていないバージョンのUbuntuの場合は、 sudo apt install snapd
でインストールできるらしい。
手順4~6. Certbotを再インストール
過去に apt
でCertbotをインストール済みだったため、snapで再インストールする必要があった。
古いcertbotをアンインストール。
snapでcertbotを再インストール。
手順7~8. CertbotのDNSプラグインをインストール
ここでは先程確認したRoute 53用のプラグイン certbot-dns-route53
をインストール。
あと、certbotがプラグインをroot権限で動かすことを信頼する (trust-plugin-with-root=ok
) 必要があるらしい。
手順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
を選択して削除する。
念のため、証明書が消えたことを確認。
その後、ワイルドカード証明書を作成する。前項と同様に certbot-dns-route53
のマニュアルを確認して、Examplesセクションに記載されているコマンドを参考にする。
ここではドメインは *.kiriukun.com
および kiriukun.com
を指定し、サブドメインだけでなくAPEXドメインにも使えるようにする。また、前述の通り既存の証明書を置き換えるだけでApacheの設定変更は不要なため、 -i apache
オプションは指定せず、証明書の作成のみを行う。
以上で証明書の作成は完了。
Note
まだApacheを再起動していないので、この証明書は反映されていない。
手順11. 証明書の自動更新ができることを確認
--dry-run
つきで renew
してみる。
大丈夫そう。
手順12. 稼働確認
対象のサイトをブラウザから閲覧して、証明書情報の作成日が過去のものであることを確認したあと、以下コマンドでApacheを再起動。
ブラウザでサイトをリロードして、証明書の作成日が変化していることを確認した。
以上。
調べている時に読んだページ
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