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