クライアント証明書の発行基盤を選ぶ ─ CodeBuild+OpenSSL・Vault Community・AWS Private CA

 更新 2026-11-08

クライアント証明書の発行・配布・停止を、CodeBuild+OpenSSL、Vault Community、AWS Private CAでどう構成するか。具体的な部品と処理の流れを示し、CA鍵の保護、所有者管理、周辺機能、保守責任の違いを比較する。

クライアント証明書で接続を制限するには、証明書を発行する認証局(CA)、利用者へ渡す仕組み、接続時に証明書と失効を確認する仕組みが要る。 CAだけを選んでも、誰に発行し、どの端末へ渡し、不要になった証明書をどう止めるかは決まらない。

本稿では、CodeBuildでOpenSSLを実行するCA運用構成、Vault CommunityのPKI、AWS Private CAを比較する。 まずCodeBuild+OpenSSL構成の具体的な部品と処理を示し、CAの鍵の保護と、実装・保守を引き受ける範囲の違いを整理する。 利用者の発行と管理者の停止は、運用画面例で試せる。

1. CA・配布・接続の判定を分ける

役割
決めること
担当する処理
認証局(CA)
どの鍵で、どの名前・用途・期限の証明書に署名するか
CAの鍵の保管、証明書の発行、失効情報の管理
利用者と管理者の窓口
誰が何を発行・取得・停止できるか
ログイン、所有者の確認、配布、操作の記録
保護するサイトの入口
どのCAを信頼し、どの証明書を拒否するか
証明書の検証、期限の検査、失効の照合

CAの公開証明書は、接続側が信頼する発行者を確認するために使う。CAの秘密鍵は署名する側だけが持つ。 また、所有者や配布状態を持つ台帳と、接続を拒否するための失効簿は別の役割である。 台帳の状態を書き換えても、接続時の照合先へ反映されなければ、その証明書による新しい接続を止められない。

2. CodeBuild+OpenSSLによるCA運用構成

この構成はAWS Private CAを使わず、CodeBuildの実行環境でOpenSSLを動かしてCAを運用する。 CodeBuildが常時稼働するCAサーバーになるのではなく、初期作成・発行・失効の要求ごとに処理を起動する。 以下は参照したコミットの設定・実装定義を整理したもので、AWS実環境の稼働状態を確認した結果ではない。

役割
構成と動き
利用者の窓口
S3の画面をCloudFrontから配り、Lambda APIで本人の発行・取得・停止を扱う
窓口の認証
CognitoとMFAを使い、Lambda@Edgeでログインを確認する。証明書を取得する前にも入れるよう、この窓口にはmTLSを要求しない
CAの処理
CodeBuildからOpenSSLを実行し、CAの初期作成、利用者の証明書発行、失効を処理する
CAの鍵と公開証明書
秘密鍵をSSM Parameter StoreのSecureStringに保管し、署名の際にCodeBuildが取得する。CAの公開証明書はS3へ置く
所有者と状態
DynamoDBの台帳で、利用者の識別子と証明書の識別子を組にし、端末名・通し番号・期限・発行や取得の状態を持つ
配布
パスワード付きPKCS#12(.p12)をS3へ一時保存し、有効期限付きの署名付きURLで渡す。URLの再発行を台帳で制御する
配布パスワードの保護
発行APIがKMSで暗号化し、CodeBuildが復号する。証明書の識別子を暗号化コンテキストに結び付ける
接続時の検査
CloudFront Viewer mTLSとTrust Storeで証明書を検証し、Connection FunctionとKeyValueStoreで失効した通し番号と用途を確かめる
管理者の操作
利用者の窓口とは別の管理画面とAPIから一覧・失効を扱い、失効を管理者の権限に限定する
所有者不在の検出
定期処理でCognitoの利用者と台帳を照合し、削除・無効化済み利用者の有効な証明書を通知する
利用者の発行窓口からLambda APIがCodeBuildを起動する。CodeBuildはSecureStringからCAの秘密鍵を取得し、OpenSSLで証明書とPKCS#12を作る。PKCS#12はS3へ一時保存し、APIが台帳と照合して署名付きURLを返す。停止はCodeBuildからKeyValueStoreの失効簿へ登録し、CloudFrontの接続時にTrust Storeと失効簿を用いて検査する。所有者台帳と失効簿は別のものとして示す図
CA処理はCodeBuild、所有者管理は台帳、接続時の停止判定は失効簿が受け持つ

発行APIは本人の要求を受け、CodeBuildを起動する。 CodeBuildがCAの鍵を一時取得してOpenSSLで署名し、配布ファイルをS3へ置く。 窓口はDynamoDBの所有者と状態を確認して、利用者へ取得方法を返す。

この構成の配布パスワード用KMS鍵は、CAの署名を行う鍵ではない。 パスワードを保護する処理と、CA秘密鍵を使って署名する処理を区別する必要がある。 また、署名付きURLの再発行を窓口で制御することと、発行済みURLが一度しか使えないことも別である。 S3の署名付きURLは、有効な期間中は再利用できる。

停止するときはCodeBuildがKeyValueStoreの失効簿へ通し番号を登録し、Connection Functionが新しいTLS接続を拒否する。 接続時の判定はDynamoDBの台帳を読まない。 Cognitoの利用者を削除・無効化しても、証明書そのものは失効しないため、通知と停止の運用を別に持つ。

人の端末用とは別に、配信監視用の機械証明書も扱う。 こちらは秘密鍵と証明書をSecrets Managerへ置き、監視Lambdaが更新を起動する。 CodeBuildは新しい証明書を発行し、古い証明書を失効させる。 人へのファイル配布と、機械の自動更新を同じ操作として扱わない。

この方式は、所有者の台帳、配布状態、本人による停止、監視用の自動更新まで含む構成である。 その分、CA処理のスクリプトだけでなく、API・台帳・配布・失効・定期処理の整合性も保守対象になる。 直接起動する経路の権限、途中失敗と再試行、鍵の更新、配布ファイルの削除などを、構成を維持する側が継続して管理する。

3. Vault CommunityのPKIへ任せる範囲

Vault Communityは、CAの鍵を内部で生成し、PKIのAPIから証明書の発行や失効を扱える。 内部生成する設定では、発行を頼むアプリケーションへCAの秘密鍵を返さずに署名する。 発行する名前・用途・期限の制限は、PKIのロールとVaultのポリシーへまとめる。

これにより、CodeBuildへCAの鍵を渡して署名する処理を持たずに済む。 一方、Vaultは自分で動かすサービスなので、稼働、版の更新、保存先、バックアップ、復旧、管理権限の保守を引き受ける。 CA処理の実装を製品へ任せることと、運用責任を外部へ委ねることは同じではない。

Vault CommunityでもKMSによる自動アンシールを使えるが、これは封印を解除するための仕組みである。 CAの署名鍵をHSMやKMSの中で使用するManaged Keysは、Vault Enterpriseの機能になる。 自動アンシールを使っていることだけで、CAの署名鍵がHSMから出ないとは判断できない。

利用者は発行画面から本人の権限でVaultへ要求し、暗号化したPKCS#12を受け取り端末へ取り込む。管理者は別の管理画面から証明書を失効させ、その情報を配信側の失効簿へ同期する。接続時はTrust Storeと失効簿で検査し、Vaultへは問い合わせない構成例
Vaultを使う構成例。CAの発行・失効と、利用者対応・配信への反映を分ける

この構成例では、利用者は本人の端末用に発行し、管理者は全件の確認と失効を担当する。 独自の配布台帳や本人だけの証明書一覧は設けず、発行者と通し番号の対応は監査ログで追う。 VaultのPKIの一覧・通常の失効APIは、発行した本人を基準に自動的に絞り込むAPIではないため、利用者へそのまま公開しない。

利用者の秘密鍵はVaultで生成し、APIが証明書とともにPKCS#12へまとめ、応答で一度だけ渡す。 取り損ねたときは再発行する。CodeBuild+OpenSSL構成のS3による一時配布とは異なる方式である。 また、この構成例には機械証明書の自動更新や、所有者不在の証明書を検出する機能を作っていない。 Vaultの導入だけで、CodeBuild+OpenSSL構成と同じ周辺機能まで提供されることにはならない。

CloudFrontとの接続では、Vaultの失効をKeyValueStoreへ同期する。 CAで失効したこと、失効簿への書込み、配信への伝播、新しい接続の拒否確認を別の状態として扱う。 この方式は接続のたびにVaultを呼ばないが、同期失敗の検知と再試行は必要になる。

4. AWS Private CAへ任せる範囲

AWS Private CAは、CAの生成・署名・失効を扱うマネージドサービスである。 CAの秘密鍵をAWS管理のHSMへ保管し、CAサービスの基盤運用をAWSが担う。 AWSの文書では、そのHSMはFIPS 140-3 Level 3に準拠する。 ソフトウェアで動かすVault Communityや、CodeBuildへ鍵ファイルを読み出す方式と比べ、CA鍵の保護と基盤保守を委ねられる点に利点がある。

証明書の発行APIへはCSRを渡す。 利用者の秘密鍵をどこで作るか、PKCS#12にまとめて誰へ渡すか、所有者をどう確認するかは別に設計する。 この比較でAWS Private CAを選ぶことは、CAの中核を任せることであり、利用者の窓口や既存の台帳・自動更新まで不要になることではない。

CAの鍵を直接読めなくても、不適切な相手へ発行できる権限を渡せば、正規の証明書を不正に作られる。 IAM、証明書テンプレート、窓口の認証と発行条件の管理は必要である。

5. 3方式を実装と保守の範囲で比較する

以下のCodeBuild+OpenSSLとVaultの列は、それぞれ参照した構成を示す。 AWS Private CAの列はサービス仕様と、別途実装が必要な部分である。同じ一式をAWS Private CAで構築して実測した比較ではない。

比較する点
CodeBuild+OpenSSL構成
Vault Communityを使う構成例
AWS Private CAを使う場合
CAの署名鍵
SecureStringからCodeBuildへ取得して使う
Vault内部で生成し、発行アプリへ渡さず使う
AWS管理HSMで使う
発行条件
API・設定・署名処理で実装し、起動経路も管理する
PKIのロールとポリシーで制限する
IAM・テンプレート等で制限し、業務固有の条件は窓口へ実装する
CA基盤の保守
署名処理、保管先、権限、鍵の更新手順を管理する。CodeBuildの実行基盤はAWSが管理する
Vaultの稼働・更新・バックアップ・復旧を管理する
CAサービスの基盤はAWSが管理する。CA設定と権限は利用側が管理する
所有者・配布状態
DynamoDB台帳で持つ。本人の一覧・停止と管理者の操作を分ける
独自台帳を持たず、全件の確認・失効を管理者へ限定する
別途設計する。CAサービスだけでは利用者の業務台帳にならない
人への配布
S3へ一時保存したPKCS#12を署名付きURLで渡す
PKCS#12を応答で一度だけ渡し、取り損ねたら再発行する
秘密鍵の生成と配布方法を別途設計する
CloudFrontでの停止
CodeBuildからKeyValueStoreへ登録する
Vaultの失効をKeyValueStoreへ同期する
OCSPまたは失効簿との連携を要件に合わせて設計する
機械証明書の更新
監視LambdaとCodeBuildで新規発行・旧証明書の失効を行う
この構成例では未実装
自動化する側の処理を別途設計する
所有者不在の検出
Cognitoと台帳を定期照合し通知する
この構成例では未実装
利用者の管理基盤と連携して別途設計する

Vault Community自体が、機械証明書の更新や所有者台帳の作成を妨げるわけではない。 必要なら周辺機能を追加することになる。 どの方式でも、PKCS#12とパスワードが複製されれば別の端末で使われ得ること、更新しても古い証明書が自動で止まらないことは共通の運用課題である。

費用も、CAの料金と周辺機能の開発・保守を分けて比較する。 2026年11月7日に確認したAWS Private CAの公表料金は、汎用モードが1 CAあたり月400 USD、短期証明書モードが1 CAあたり月50 USDで、発行等は別料金になる。 短期モードは最長7日の証明書向けなので、人が手で取り込む30日の証明書と、その料金だけを比べることはできない。

Vault CommunityはBSL 1.1で提供され、組織内で使うことは認められている。 競合する製品やサービスへ組み込む、またはホストして提供する場合は、採用版のLICENSEを確認する。 ライセンスの費用が発生しない使い方でも、稼働させる基盤と保守の費用は残る。

6. 選定では保守責任をどこへ置くかを決める

重視すること
検討する方向
利用者ごとの配布状態や独自の業務処理まで制御したい
CodeBuild+OpenSSL構成のように、CA処理と台帳・窓口を組み合わせて運用する。その一式の保守責任を持つ
CAの処理を製品へ任せ、基盤は自分たちで運用できる
Vault CommunityのPKIを使い、必要な周辺機能だけを組み合わせる
CA鍵のHSM保護と、CA基盤の運用委託を重視する
AWS Private CAを使い、利用者対応や配布・失効の連携を別に設計する

少人数の社内利用でVault Communityを採用した例では、独自のCA処理と周辺機能の組み合わせを維持する保守責任の重さを選定理由とした。 扱う情報と漏えい・停止時の影響、費用を評価し、必要な機能の範囲を絞ってCA処理をVaultへ任せている。 これはVaultの方がAWS Private CAより安全だからという評価ではなく、CA鍵の保護と基盤保守を委ねる利点を認めたうえでの判断である。 Vaultの保守が不要になったことや、全体の保守工数が実測で減ったことを示すものではない。

保守する処理と必要な機能を一覧にし、残すもの、製品へ任せるもの、作らないものを決める。 比較するのは証明書を発行できるかどうかだけでなく、利用者へ渡してから停止するまでの責任を継続して持てるかである。

利用者の発行と管理者の停止を試す

運用画面例はVaultを使う構成を抽象化している。実際のサービスへの接続、実用の鍵・証明書・パスワードの生成は行わない。 CodeBuild+OpenSSL構成やAWS Private CAの全機能を再現するモックではない。