
CaddyとCloudflareによって、Let’s EncryptのDNS-01チャレンジを自動化し、ワイルドカード証明書を取得・更新します。
ただ、通常のCaddyではDNS-01チャレンジに必要なCloudflareのAPIに対応していないため、Cloudflare用にカスタマイズされたCaddyを使用します。
なお、本記事ではCloudflareを例に説明しますが、他の大手DNSプロバイダ(Route 53など)に対応したカスタム版Caddyも公開されているので、応用できるはずです。
前提として、以下の環境で作業します。
- サーバ: Ubuntu 22.04
- カスタム版Caddy: v2.8.4
Cloudflare APIトークンの発行
ワイルドカード証明書のDNS-01チャレンジを自動化するためには、DNSのAPIが必要になります。今回はCloudflareのDNSを使用するため、Cloudflareのサイト上でトークンを発行します。
Cloudflareにログイン後、ダッシュボードの右上にある「マイプロファイル」をクリックし、左のメニューから「APIトークン」を選択します。ページ遷移後、「トークンを作成する」をクリックし、最下の「カスタム トークンを作成する」をクリックします。

トークン名に任意の名前を入力後、アクセス許可とゾーンリソースを画像のとおり設定し、「概要に進む」をクリックします。
次のページで「トークンを作成する」をクリックするとAPIトークンが表示されるのでコピーします。なお、アクセス許可の設定などは後から変更できますが、トークンは一度しか表示されないので、忘れずにメモします。
カスタム版Caddyのインストール
CloudflareのAPIに対応したカスタム版Caddyをインストールする前に、まずは通常版をインストールします。そのうえで、後述する手順で本体をカスタム版に置き換えます。
$ sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https $ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg $ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list $ sudo apt update $ sudo apt install caddy
通常版のCaddyではDNSプロバイダのAPIに対応していませんが、有名なDNSプロバイダであれば、以下のサイトからAPIに対応したCaddyをダウンロードできます。
今回はCloudflareなので、プルダウンからインストール対象のプラットフォームを選択後、「caddy-dns/cloudflare」を選択します。その状態で、「Download」ボタンを右クリックし、リンク先のURLをコピーします。

そして、以下のcurlコマンドのURLを、コピーしたURLに変更して実行します。もし、既にCaddyがインストールされていて起動していたら、停止してから実行します。
$ sudo systemctl stop caddy $ sudo curl -o /usr/bin/caddy -L "https://caddyserver.com/api/download?os=linux&arch=amd64&p=github.com%2Fcaddy-dns%2Fcloudflare&idempotency=86069108581480" $ sudo systemctl start caddy
これで、Caddy本体がCloudflareカスタム版に置き換わります。なお、プラットフォームで何を選択すればよいか分からない場合は、以下のコマンドで確認します。x86_64ならamd64です。
$ uname -m x86_64
また、カスタム版をインストール後、apt upgradeで通常版が意図せず上書きされないように、パッケージリストを削除したほうがよいです。
$ sudo rm /etc/apt/sources.list.d/caddy-stable.list
Caddyの設定変更
CaddyでCloudflareのAPIを使用する準備が整ったので、設定ファイルを編集します。
$ sudo nano /etc/caddy/Caddyfile
以下は、xxx.yusukesakai.comで公開するNextcloudのリバースプロキシ用の設定例です。
{
auto_https disable_redirects
ocsp_stapling off
email {{MAIL ADDRESS}}
}
*.yusukesakai.com {
tls {
dns cloudflare {{API TOKEN}}
}
@xxx host xxx.yusukesakai.com
handle @xxx {
root * /snap/nextcloud/current
file_server
reverse_proxy localhost:80 {
flush_interval -1
}
encode zstd gzip
redir /.well-known/carddav /remote.php/dav/ 301
redir /.well-known/caldav /remote.php/dav/ 301
}
}
ポイントをいくつか記載します。
emailでLet's Encryptに登録するメールアドレスを設定します。異なるドメインでも、受信できればなんでもよいです*.yusukesakai.comで公開するドメインのサブドメインをワイルドカードで指定します。これと後述するtlsの設定でワイルドカード証明書を自動で取得しますtls内のdns cloudflareに、先ほど発行したCloudflareのAPIトークンを貼り付けます。Caddyのメリットはまさにここで、DNSプロバイダとのAPI連携とDNS-01チャレンジがこの1行で完結します@xxx host xxx.yusukesakai.comと後述のhandle @xxxでサブドメイン毎の設定を行います。xxxは適宜変更してください
以下のコマンドで設定ファイルを検証後、エラーがなければCaddyを再起動します。
$ sudo caddy validate --config /etc/caddy/Caddyfile $ sudo systemctl restart caddy
以上で設定は完了です。お疲れさまでした。
動作確認
API連携が正常に動作していれば、Cloudflareのダッシュボード>DNS>レコードから、「_acme-challenge」という名前のTXTレコードが追加されていることを確認できます。

また、設定後に対象のサイトにアクセスすると、Let's Encryptのワイルドカード証明書が発行されていることを確認できます。

関連リンク
以下の記事で、Let's Encryptの代わりにZeroSSLを使用したワイルドカード証明書の取得方法を記載しました。