学内のたくさんの証明書を,
秘密鍵を集めずに自動で更新する

ACME Conductor は,大学などの組織が管理する多数のホスト名について,TLS 証明書の発行と更新を ACME(Let's Encrypt など)で自動化するためのコントロールプレーンです. 「どのホスト名に,どのポリシーで,いつ証明書を出すか」を一か所で管理しつつ, 秘密鍵や DNS・Key Vault の資格情報は管理サーバに一切持たせない設計になっています.

証明書を発行したい方(UPKI の登録担当者・事務担当者)はこちら

DNS や Azure に詳しくなくても進められるよう,最初から順に説明したページを用意しています.

一覧とポリシーを一か所で

ホスト名(FQDN)の一覧,許可するドメイン,更新時期,鍵の種類を REST API と GUI で管理し,すべての操作を追記専用の監査ログに残します.

ACME の実装は lego に任せる

新しい ACME クライアントではありません.広く使われている go-acme/lego をバージョン固定で同梱し,1 回の実行ごとに 1 度だけ呼び出します.

秘密鍵は管理側を通らない

秘密鍵は使い捨ての Runner の中で生成され,Key Vault などの証明書ストアへ直接書き込まれた後,破棄されます.

全体像

システムは 2 つのプログラムに分かれています.常駐して「何をすべきか」を決める Conductor(コントロールプレーン)と,1 件の仕事ごとに起動されて実際に証明書を取りに行く Runner(データプレーン)です.両者の間を行き来するのは, 署名付きの「作業指示書(JobSpec)」と「結果報告(Result)」の 2 種類の文書だけです.

ACME Conductor の全体構成 管理者は GUI または REST API で Conductor を操作する.Conductor は署名付き JobSpec を Runner に渡し,Runner は lego を使って ACME 認証局と DNS プロバイダとやり取りし,証明書と秘密鍵を Certificate Store に直接格納し,署名付き Result を Conductor に返す. 管理者・閲覧者 GUI / REST API OIDC で認証 admin / viewer コントロールプレーン acme-conductor Target(FQDN)レジストリ 証明書ポリシー スケジューラ Run(実行)の記録 追記専用の監査ログ Job Launcher SQLite(1 ファイル) 鍵・資格情報は入らない ✕ 秘密鍵を持たない ✕ DNS / Key Vault の権限なし JobSpec Result データプレーン(1 回ごとの使い捨て) acme-runner ① 検証と認可 ② 更新が必要か確認 ③ lego を 1 度だけ起動 ④ 検証して格納 ⑤ Result を返して終了 ACME 認証局 Let's Encrypt など DNS プロバイダ DNS-01 の TXT 証明書 + 秘密鍵 直接書き込み Certificate Store Azure Key Vault(本番)/ ファイル(開発) Web サーバや Application Gateway はここを参照 クラウドの認証はワークロード ID(マネージド ID) 設定ファイルに静的なシークレットを置かない
コントロールプレーン データプレーン 秘密鍵が置かれる場所 外部サービス
Conductor は「いつ・何を」を決めるだけで,ACME 認証局・DNS・証明書ストアとは一切通信しません.それらと話すのは Runner だけです.JobSpec と Result はどちらも Ed25519 で署名されます.

役割分担

Conductor(acme-conductor)Runner(acme-runner)
動き方常駐サービス(API・GUI・スケジューラ)1 件ごとに起動し,終わったら終了するジョブ
秘密鍵決して持たない1 回の実行中だけ一時領域に置き,格納後に破棄
DNS / Key Vault の資格情報持たない自分のワークロード ID で認証
ACME・DNS・Store との通信しないする(Runner だけ)
ネットワークへの公開管理者向けの API と GUIなし(待ち受けるポートを持たない)

どんな組織に向いているか

向いている

  • 学部・研究室・サービスごとに多数のホスト名があり,証明書の期限切れを仕組みで防ぎたい
  • DNS-01 チャレンジで発行したい(Web サーバを外部公開していないホストも含めて)
  • Azure を使っており,証明書を Key Vault に置いて Application Gateway などから参照している
  • 「誰がいつどのホスト名を追加したか」を監査ログとして残したい

今のところ向いていない

  • 秘密鍵を各サーバへ配布する機能が欲しい(配布 API は意図的に持ちません)
  • HTTP-01 チャレンジで発行したい(DNS-01 のみ)
  • AWS / GCP 上で動かしたい(設計上は見越していますが未実装)
  • 国際化ドメイン名(IDN)を扱いたい

詳しくは現状と制限を参照してください.

導入までの道のり

いきなり本番の証明書を切り替える必要はありません.次の順に,小さく確かめながら進められます.

  1. 手元で試す — 開発用の認証(localhost-dev)とローカルプロセスのランチャー,ファイルの証明書ストアで,1 台のマシン上に全体を動かします.ACME は Let's Encrypt の ステージング を使います.
    導入ガイド: 手元で試す
  2. Azure にデプロイする — 同梱の Bicep テンプレートで,Container Apps 上に Conductor と Runner,権限の重ならない 2 つのマネージド ID を作ります.まずはステージング CA と 1 つのホスト名から.
    導入ガイド: Azure にデプロイする

守っている約束

設計全体を通して,次の原則が成り立つようにしています.それぞれがどの脅威に対応するかは安全設計で図解しています.