果報

二度寝して待つ

CloudflareのAPIに対応したカスタム版CaddyでLet’s Encryptのワイルドカード証明書を自動で取得する

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をダウンロードできます。

caddyserver.com

今回は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

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を使用したワイルドカード証明書の取得方法を記載しました。

text.yusukesakai.com

参考リンク

caddyserver.com

caddyserver.com