DNS-01チャレンジでACME証明書取得を自動化する方法(Cloudflare API利用)

DNS-01チャレンジでACME証明書取得

ACMEプロトコル(Let’s Encrypt等)でワイルドカード証明書を取得したり、Webサーバーの80/443ポートを開放せずに証明書を発行したりするには、DNS-01チャレンジが必須となる。

DNS-01チャレンジでは、指定されたランダムな文字列(TXTレコード)をDNSサーバーに一時的に書き込む必要がある。これを手動で行うのは運用の負担が大きいため、DNS管理をCloudflareへ移管し、API経由で自動化構成を構築する手順と、導入時のデメリット・注意点を解説する。

全体の流れ

  1. ドメインのネームサーバー(NS)をCloudflareに変更する
  2. CloudflareでDNS編集権限を持つAPIトークンを発行する
  3. ACMEクライアント(acme.sh や Certbot)にAPIトークンを設定し、自動取得を実行する

1. CloudflareへのNS移管

まずは対象ドメインのDNS管理をCloudflareに集約する。

1-1. Cloudflareにドメインを追加

Cloudflareのダッシュボードにログインし、対象のドメインを追加する。フリープラン(Free Plan)を選択して問題ない。

1-2. レジストラ側でネームサーバーの変更

Cloudflareから提示される2つのネームサーバー(例: ns1.cloudflare.com など)をコピーし、お名前.comやXserverなどのドメイン取得元(レジストラ)の設定画面でネームサーバー変更を行う。

反映完了後、Cloudflareの管理画面上でドメインが「アクティブ」になれば移管完了だ。

2. APIトークンの発行

ACMEクライアントがCloudflare上のDNSレコードを安全に書き換えるための専用APIトークンを作成する。

2-1. トークン作成画面へ移動

Cloudflareの右上のプロファイルアイコンから [マイ プロフィール][API トークン][トークンを作成] を選択する。

2-2. テンプレートの選択またはカスタム設定

「ゾーン DNS を編集」のテンプレートを使用するか、以下の権限でカスタムトークンを作成する。

  • アクセス許可: ゾーンDNS編集
  • ゾーンリソース: 特定ゾーンに含める対象のドメイン

注意: グローバルAPIキー(Global API Key)は全権限を持ってしまうため使用を避け、必ず範囲を絞ったAPIトークンを発行・使用するのがセキュリティ上のベストプラクティスである。

生成されたトークン(文字列)は再表示されないため、安全な場所に保管しておく。

3. ACMEクライアントでの自動化設定

ここでは軽量かつ設定が容易な acme.sh と、標準的な Certbot の2パターンの設定例を示す。

パターンA: acme.sh を使う場合(推奨)

acme.sh はAPI連携の対応が非常にスムーズで、外部プラグインの追加インストールが不要だ。

3-1. 環境変数のセット

APIトークン(CF_Token)に加え、Cloudflareダッシュボードの対象ドメイン「概要」ページ右側に表示されているゾーンIDCF_Zone_ID)またはアカウントIDCF_Account_ID)を取得して環境変数にセットする。

Bash

export CF_Token="発行したAPIトークン"
export CF_Zone_ID="対象ドメインのゾーンID"
# またはアカウント全体のIDを指定する場合: export CF_Account_ID="アカウントID"

3-2. 証明書の発行コマンド実行

以下のコマンドで、DNS-01チャレンジによる証明書取得を実行する。

Bash

acme.sh --issue --dns dns_cf -d example.com -d '*.example.com'

コマンド実行時、acme.sh は自動的にCloudflareのAPIを叩いて _acme-challenge.example.com にTXTレコードを書き込み、検証完了後にレコードを削除してくれる。一度成功すると環境変数は設定ファイルに記録され、 cron 等による自動更新もすべて自動で行われる。

パターンB: Certbot を使う場合

Certbotを使用する場合は、Cloudflare用のDNSプラグインを追加導入する必要がある。

3-1. プラグインのインストール

OSの環境に合わせてプラグインを導入する(例: Ubuntu / Debian系)。

Bash

sudo apt update
sudo apt install python3-certbot-dns-cloudflare

3-2. 認証情報の作成

設定ファイル /etc/letsencrypt/cloudflare.ini を作成し、権限を制限する。

Ini, TOML

# /etc/letsencrypt/cloudflare.ini
dns_cloudflare_api_token = 発行したAPIトークン

パーミッションを厳格化しておく。

Bash

sudo chmod 600 /etc/letsencrypt/cloudflare.ini

3-3. 証明書発行の実行

以下のコマンドで証明書を取得する。

Bash

sudo certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
  -d example.com \
  -d '*.example.com'

4. デメリットと導入時の注意点

強力で利便性の高い構成だが、導入・運用にあたっては以下のデメリットや注意点を考慮する必要がある。

① DNS運用構成の変更に伴うハードル

  • ネームサーバー移管の手間と障害リスク既存のDNSサーバー(お名前.comやRoute 53など)からCloudflareへNSを変更する際、既存レコードの移行漏れがあると、メール受信不可やWebサイト不通などの障害に直結する。
  • Cloudflareへの依存度向上ドメインの権威DNSを完全にCloudflareへ委ねるため、Cloudflare側で大規模障害が発生した場合、自社サービス全体の名前解決に影響が及ぶ。

② APIトークン漏洩時のセキュリティリスク

  • 権限管理の徹底が必須APIトークンが漏洩した場合、悪意のある第三者にDNSレコードを書き換えられ、ドメイン乗っ取りや偽証明書の発行が行われる危険性がある。
    • 対策: グローバルAPIキーは絶対に使用せず、対象ドメインのみ・DNS編集権限のみに絞ったトークンを発行すること。必要に応じてアクセス元のIP制限も行う。

③ 検証完了までのレイテンシ

  • TXTレコード反映のタイムラグHTTP-01(80ポートでのファイル配置確認)に比べ、DNS-01は「TXTレコード書き込み → DNSプロパゲーション(伝播)」のプロセスが入るため、検証完了まで数十秒〜数分の待ち時間が発生する。
    • 対策: Certbotでは --dns-cloudflare-propagation-seconds 30 などのオプションを指定し、反映の待ち時間を調整する。

④ レジストラ・プランによる制約

  • 完全なNS委任が必要CloudflareのFreeプランでは、特定のサブドメインのみを委任する構成や、独自のネームサーバー名を維持する構成(CNAME setupなど)が使えず、ドメイン全体のNS変更(Full Setup)が必須となる。

5. まとめ

DNS-01チャレンジとCloudflare APIを組み合わせることで、以下のメリットが得られる。

  • ワイルドカード証明書(*.example.com)が容易に取得できる
  • プライベートネットワーク内のサーバーでも、80/443ポートを開けずに証明書を取得・更新できる
  • トークンの権限を「対象ゾーンのDNS編集」のみに絞ることで、高いセキュリティレベルを維持できる

ネームサーバーの移管作業やAPIトークンの管理といった注意点はあるものの、一度構築してしまえば証明書管理の完全自動化が実現するため、インフラ運用において非常に強力な手段である。

タイトルとURLをコピーしました