---
title: "Caddy + DNS-Persist: DNS への権限不要（キーレス）で安全に SSL 証明書を自動化する方法 | grasys blog"
url: "https://blog.grasys.io/post/mr-binelias/caddy-dns-persist/"
description: "どうも、Rayanです。 WebサーバーからDNSゾーンへのアクセス権限がいらない、「dns-persist」という新しいACMEチャレンジタイプが発表されました。 今回は、この技術と「Caddy」という自動SSL証明書ツールを使って、DNSへの権限（キーレス）を要求せずに安全にSSL証明書を自動化する方法を紹介しま…"
---

# Caddy + DNS-Persist: DNS への権限不要（キーレス）で安全に SSL 証明書を自動化する方法

-   ![](/_astro/noicon.CTHOhNiB_1HMs6A.webp)[mr.binelias](/authors/mr-binelias/)
-   公開日：2026年7月1日
-   カテゴリー：[Tech](/categories/tech/)
-   タグ：[#caddy](/tags/caddy/)[#dns-challenge](/tags/dns-challenge/)[#dns-persist](/tags/dns-persist/)[#Google Cloud](/tags/google-cloud/)[#Let's Encrypt](/tags/let-s-encrypt/)

![Caddy + DNS-Persist: DNS への権限不要（キーレス）で安全に SSL 証明書を自動化する方法](/_astro/hero.0qugnEDu_Z1st2yr.webp)

どうも、Rayanです。

WebサーバーからDNSゾーンへのアクセス権限がいらない、「dns-persist」という新しいACMEチャレンジタイプが発表されました。

今回は、この技術と「Caddy」という自動SSL証明書ツールを使って、DNSへの権限（キーレス）を要求せずに安全にSSL証明書を自動化する方法を紹介します。

メモ：  
dns-persist-01は現在テスト段階（Let’s Encryptの本番ロールアウトは2026年Q3予定）のため、今回のデモは現行のDNSチャレンジで行います。本番ロールアウト後に設定を差し替えるための事前準備として、まずは双方のフローを比較してみましょう。

## 従来のDNSチャレンジのフロー

従来の方式では、CaddyにDNSの変更権限（書き込みや削除）を付与し、毎回レコードを動的に書き換える必要がありました。

![従来のDNSチャレンジの処理フロー](/_astro/01-b19da3d76bc97a8856324d8283c63283-1024x833-d7ec1170.BJAnW6pd_9s5ta.webp)

## DNS-Persist チャレンジのフロー

DNS-Persistでは、事前に手動で固定のレコードを登録しておくため、CaddyサーバーはDNSに変更の権限を持つ必要がありません。

![DNS-Persistチャレンジの処理フロー](/_astro/02-DNS-persist-1024x833-5a2ba3a0.CiTbinDo_1YTNX.webp)

## 前提条件

-   Google Cloud DNSで管理されている既存のドメイン
    
    -   CaddyサーバーのパブリックIPアドレスを指す DNS Aレコード が設定されていること
-   証明書管理の対象が、稼働中のGCEインスタンスであること
    
-   Caddyサーバーへの Cloud DNSのIAM権限 が付与済みであること
    

## 手順

今年（2026年Q3）のロールアウト後にすぐdns-persistへ移行できるよう、まずは現行のDNSチャレンジを使ったCaddyの構築手順をステップ・バイ・ステップで紹介します。

### Step 1:インストール方法

以下は、Rocky Linux 9.7OS向けです。

Plain textcontent\_copy

```
dnf install -y dnf-plugins-core
dnf copr enable -y @caddy/caddy
dnf install -y caddy
```

Google Cloud DNS（DNS-01）はデフォルトでは含まれていないため、モジュールを組み込んだカスタムバイナリでCaddyを再ビルドします。

まずはビルドツールである xcaddy をインストールします。

Plain textcontent\_copy

```
# install go
dnf install -y go

# install xcaddy
go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest

# Rebuild caddy with google cloud dns and caddy events module
~/go/bin/xcaddy build --with github.com/caddy-dns/googleclouddns --with github.com/mholt/caddy-events-exec --output /usr/bin/caddy --output /usr/bin/caddy
```

### Step 2: Caddyfileの設定を更新する

インストールされたか確認する。

Plain textcontent\_copy

```
> caddy version
v2.11.4 h1:XKxkMTgNSizEvKG6QHue6cAsFOteU2qA61w2tKkCWi0=
```

他のOSへのインストールについては、 [こちらをご参照ください](https://caddyserver.com/docs/install#fedora-redhat-centos)。

デフォルトのCaddy設定ファイルをバックアップする。

Plain textcontent\_copy

```
mv /etc/caddy/Caddyfile /etc/caddy/Caddyfile.bk
```

以下のコードを新しいCaddyfileにコピーする。

Plain textcontent\_copy

```
echo "[domain name] {
        header {
                X-Forwarded-Proto https
        }

         # Set this path to your site's directory.
        root * /usr/share/caddy

        # Enable the static file server.
        file_server

        tls {
                # only lets encrypt and not ZeroSSL to handle renewal
                ca https://acme-v02.api.letsencrypt.org/directory

                #dns challenge settings
                dns googleclouddns {
                        gcp_project [project-name]
                }
        }
}" > /etc/caddy/Caddyfile
```

メモ： ご自身の環境に合わせて \[domain name\] と \[project-name\] を書き換えてください。 dns-persist 実装後は、 `dns googleclouddns`→ `dns-persist googleclouddns`になるかと思います。

Caddyを起動する。

Plain textcontent\_copy

```
systemctl start caddy
```

ACMEチャレンジタイプを確認する。

Plain textcontent\_copy

```
> journalctl --no-pager -u caddy | grep 'challenge_type'

Jun 25 00:33:52 "challenge_type":"dns-01"
```

メモ： dns-persist 実装後は, `dns-01`は `dns-persist-01`になります。

SSL証明書が正常に発行されたか確認する。  
ターミナルでの確認方法：

Plain textcontent\_copy

```
> journalctl --no-pager -u caddy | grep 'certificate obtained successfully'

Jun 25 00:34:01 {"level":"info", ... 
"msg": "certificate obtained successfully", "identifier": "<domain-name>", "issuer": "acme-v02.api.letsencrypt.org-directory"}

> cd /var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/<domain name>
> openssl x509 -in <domain name>.crt -dates -noout

notBefore=Jun 23 09:06:01 2026 GMT
notAfter=Sep 21 09:06:00 2026 GMT
```

ブラウザでの確認方法：

![Caddyfileの設定を更新する画面](/_astro/03-caddy-server-ssl-1024x795-2abbb742.DCWk7XoH_Z1oSMuX.webp)

### Step 3: DNSチャレンジの代わりにDNS-persistを使用する場合（追加ステップ）

1.  ACMEのアカウントIDをコピーする。

Plain textcontent\_copy

```
> journalctl --no-pager -u caddy | grep 'account_id'
{..."account_id":"https://acme-v02.api.letsencrypt.org/acme/acct/1234567890"...}   
```

2.  Cloud DNSにTXTレコードを作成して配置する。

Plain textcontent\_copy

```
Name/Host: _validation-persist.<domain>
TYPE: TXT
TTL: 5分
Value: "letsencrypt.org;" "accounturi=https://acme-v02.api.letsencrypt.org/acme/acct/1234567890"
```

caddyを再起動する。

Plain textcontent\_copy

```
systemctl restart caddy
```

ACMEチャレンジタイプを確認する。

Plain textcontent\_copy

```
> journalctl --no-pager -u caddy | grep 'challenge_type'

Jun 25 00:33:52 "challenge_type":"dns-persist-01"
```

## Slackへの通知方法

Caddyは証明書の更新と管理を自動で行ってくれますが、正常に更新されたかどうか、通知を受け取りたい場合はどうすればよいでしょうか？

そこで、Caddyの生みの親であるmholt氏が作成した caddy-events-exec プラグインを使用します。

今回はこれをSlackと連携させます。全体の流れは以下の通りです：  
Caddyfile → send\_to\_slack.sh（Bashスクリプト） → Slackチャンネル

こちらがサンプルのBashスクリプトです。

Plain textcontent\_copy

```
#!/bin/bash

SLACK_WEBHOOK_URL="https://hooks.slack.com/services/.../.../..."

curl -X POST -H 'Content-type: application/json' --data '{"text":"🔒 *Caddy Alert:* SSL Certificate has been successfully renewed!"}' "$SLACK_WEBHOOK_URL"
```

以下のコードをCaddyfileに追加する。

Plain textcontent\_copy

```
{
        events {
                on cert_obtained exec /usr/local/bin/send_to_slack.sh
        }
}
```

SSL証明書の発行後、Slackチャンネルにも通知されます。

![Slackへの通知方法の画面](/_astro/04-caddy-server-ssl-slack-1024x120-50f88244.Dd7ogx0t_Z1HN5JK.webp)

## まとめ

今回はセキュリティベストプラクティスとなる、新しいACMEチャレンジ dns-persist を使ったCaddyの将来的なセットアップをご紹介しました。

現在 dns-persist-01 はテスト段階です。Let’s Encryptの本番ロールアウトは 2026年Q2からQ3 に予定されており、その後Caddyへも早期に統合される見込みです。

楽しみです＾＾

## 参考

[https://letsencrypt.org/2026/02/18/dns-persist-01](https://letsencrypt.org/2026/02/18/dns-persist-01)

[https://github.com/caddyserver/caddy/issues/7495](https://github.com/caddyserver/caddy/issues/7495)

## この記事を書いた人

[![](/_astro/noicon.CTHOhNiB_Z24aAgM.webp)](/authors/mr-binelias/)

### [mr.binelias](/authors/mr-binelias/)

mr.bineliasのプロフィールと執筆記事をご覧いただけます。

[プロフィールと記事一覧](/authors/mr-binelias/)