English | 日本語
ConoHa VPS 上で Let's Encrypt のワイルドカード証明書を、DNS-01 認証 + ConoHa DNS API で自動取得・更新するためのスクリプトです。
k2snow/letsencrypt-dns-conoha(MIT)
の fork です。主な変更点は、ConoHa API v3(c3j1)への対応(従来の v2
tyo1 / tyo2 に加えて)、DNS 伝播待ちの堅牢化、ロギングの追加です。
CNH_REGIONによる API v2 / v3 の自動切り替え(tyo1/tyo2は v2、 それ以外は v3)。.envによる設定(元のconoha_idファイル方式から変更)。- 権威ネームサーバへのポーリングによる伝播待ち(固定
sleepを廃止)。 対象ゾーンの権威 NS を解決し、TXT レコードが全ての権威 NSで見えるまで待機 します(ACME バリデータが参照するのは権威 NS のため)。タイムアウトあり。 - 最長サフィックスマッチによる ConoHa DNS ドメイン一覧との照合。サブドメイン
証明書や多段 TLD(
co.jp、ne.jpなど)でも正しい登録ゾーンを特定します。 - API 呼び出しの HTTP ステータスチェックと、トークン・ドメイン ID の 早期検証(fail-fast)。設定ミスがハングせず即座に表面化します。
- タイムスタンプ付きの
conoha_dns.logへの ロギング。 - 廃止された certbot の
--manual-public-ip-logging-okフラグは使用しません (certbot 2.0 で削除済み)。
- ConoHa VPS アカウント(対象ドメインを ConoHa DNS で管理していること)
- certbot(新しめのバージョン。削除済みの
--manual-public-ip-logging-okフラグを使わない構成で動作確認) jqdig(RHEL 系ではbind-utilsに含まれます)- bash 4 以上(
mapfileを使用)
AlmaLinux 9 でのインストール例:
sudo dnf install -y certbot jq bind-utils
-
スクリプトをサーバに配置します(例:
/etc/letsencrypt/conoha/)。 -
テンプレートから認証情報ファイルを作成し、編集します:
cp .env.example .env $EDITOR .env -
フックスクリプトに実行権限を付与します:
chmod +x create_conoha_dns_record.sh delete_conoha_dns_record.sh
| 変数 | 説明 |
|---|---|
CNH_REGION |
ConoHa VPS 3.0(API v3)は c3j1、VPS 2.0 は tyo1 / tyo2 |
CNH_TENANT_ID |
コントロールパネル「API」ページのテナント(プロジェクト)ID |
CNH_USERNAME |
API ユーザー名(gncu... の値)。「API ユーザー」欄から取得 |
CNH_PASSWORD |
API ユーザー作成時に設定したパスワード |
.envは git の追跡対象外です。実際の認証情報をコミットしないでください。
sudo certbot certonly \
--dry-run \
--manual \
--agree-tos \
--no-eff-email \
--preferred-challenges dns-01 \
--server https://acme-v02.api.letsencrypt.org/directory \
-d "<ベースドメイン名>" \
-d "*.<ベースドメイン名>" \
-m "<メールアドレス>" \
--manual-auth-hook /etc/letsencrypt/conoha/create_conoha_dns_record.sh \
--manual-cleanup-hook /etc/letsencrypt/conoha/delete_conoha_dns_record.sh
上記コマンドから --dry-run を外して実行します。
sudo certbot renew --dry-run # 検証
sudo certbot renew # 実行
certbot は証明書とともにフック設定を保存するため、renew 時は同じフックが自動的に
再利用されます。
| ファイル | 役割 |
|---|---|
create_conoha_dns_record.sh |
--manual-auth-hook: TXT 作成と伝播待ち |
delete_conoha_dns_record.sh |
--manual-cleanup-hook: TXT レコードの削除 |
conoha_dns_api_v2.sh |
ConoHa API v2(tyo1/tyo2)用の関数群 |
conoha_dns_api_v3.sh |
ConoHa API v3(c3j1)用の関数群 |
.env.example |
認証情報のテンプレート(.env にコピーして使用) |
*.example.comの証明書取得時、certbot は auth フックを2回呼び出します (同じ名前_acme-challenge.example.comで値が異なる)。検証中は2つの TXT レコードが共存しますが、これは正常な動作です。conoha_dns.logは時間とともに肥大化しますが、スクリプトがサイズ超過時に 世代ローテートします(.envのLOG_MAX_BYTES/LOG_GENERATIONSで調整可。 既定は 1 MiB・3 世代)。総容量はLOG_MAX_BYTES × (世代数+1)で頭打ちです。_acme-challengeが CNAME(acme-dns 等の委任に使用)の場合は削除しないで ください。削除して安全なのは使い捨ての TXT レコードのみです。
MIT License(LICENSE 参照)。Original work Copyright (c) k2snow.