
昨日書いた以下の記事の応用です。今回はLet’s Encryptではなく、ZeroSSLのワイルドカード証明書を取得します。
ちなみに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 KIDとEAB HMAC Keyをメモします。

なお、ZeroSSLではこのACME機能を利用することで、ワイルドカード証明書を無制限かつ無料で発行できるようになります(2024/8/6現在、ブラウザ上からの発行は有償プランのみ)。
Cloudflare APIトークンの発行からカスタム版Caddyのインストール
Caddyの設定変更までに行う内容は以下の記事に記載しています。
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 KIDとEAB 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に対応しているのは、そういう金銭的な背景もあるのかもしれません。