果報

二度寝して待つ

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

昨日書いた以下の記事の応用です。今回はLet’s Encryptではなく、ZeroSSLのワイルドカード証明書を取得します。

text.yusukesakai.com

ちなみにZeroSSLとは、Let’s Encryptと同じく無料でSSL証明書を取得できるサービスで、ブラウザ上で証明書の発行や削除といった管理を行えることが特徴です。

また、冒頭の記事と同様、本記事ではCloudflareを例に説明しますが、他の大手DNSプロバイダ(Route 53など)に対応したカスタム版Caddyも公開されているので、応用できるはずです。

前提として、以下の環境で作業します。

  • サーバ: Ubuntu 22.04
  • カスタム版Caddy: v2.8.4

ZeroSSLのAPI利用準備

ZeroSSLのダッシュボードにログイン後、左メニューの「Developer」をクリックし、API Keyをメモします。また、「EAB Credentials for ACME Clients」の「Generate」ボタンをクリックし、表示されたEAB KIDEAB HMAC Keyをメモします。

なお、ZeroSSLではこのACME機能を利用することで、ワイルドカード証明書を無制限かつ無料で発行できるようになります(2024/8/6現在、ブラウザ上からの発行は有償プランのみ)。

Cloudflare APIトークンの発行からカスタム版Caddyのインストール

Caddyの設定変更までに行う内容は以下の記事に記載しています。

text.yusukesakai.com

Caddyの設定変更

CaddyでZeroSSLとCloudflareのAPIを使用する準備が整ったので、設定ファイルを編集します。

$ sudo nano /etc/caddy/Caddyfile

以下は、xxx.yusukesakai.comで公開するNextcloudのリバースプロキシ用の設定例です。

{
         auto_https disable_redirects
         ocsp_stapling off
         email {{MAIL ADDRESS}}
}

*.yusukesakai.com {
        tls {
                issuer zerossl {{API Key}}
                issuer acme https://acme.zerossl.com/v2/DV90 {
                        eab {{EAB KID}} {{EAB HMAC Key}}
                        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でZeroSSLで登録したメールアドレスを設定します。登録していないメールアドレスの場合、証明書は発行されますが、ZeroSSLのダッシュボードで管理できません
  • *.yusukesakai.comで公開するドメインのサブドメインをワイルドカードで指定します。これと後述するtlsの設定でワイルドカード証明書を自動で取得します
  • tls内のissuer zerosslに、ZeroSSLのAPI Keyを貼り付けます
  • issuer acme内のeabに、ZeroSSLのEAB KIDEAB HMAC Keyを貼り付けます(間にスペースを入れます)
  • issuer acme内のdns cloudflareに、CloudflareのAPIトークンを貼り付けます
  • @xxx host xxx.yusukesakai.comと後述のhandle @xxxでサブドメイン毎の設定を行います。xxxは適宜変更してください

以下のコマンドで設定ファイルを検証後、エラーがなければCaddyを再起動します。

$ sudo caddy validate --config /etc/caddy/Caddyfile
$ sudo systemctl restart caddy

以上で設定は完了です。お疲れさまでした。

動作確認

API連携が正常に動作していれば、ZeroSSLのダッシュボード>Certificatesから、証明書の発行状況を確認できます(2つ存在しますが深い意味はありません)。

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

余談

どうやらZeroSSLはCaddyの大口スポンサーのようです。カスタム版ではなく標準の設定でAPIに対応しているのは、そういう金銭的な背景もあるのかもしれません。

参考リンク

caddy.community