信頼を「なんとなく」で終わらせない
OS の信頼ストアには、日々の開発や運用で意識されないまま多数のルート CA と中間 CA が入っています。期限切れや未信頼の証明書が紛れていても、通常の業務は動いてしまうことがあります。ca-checker は、その見えないリスクを一覧できる状態にします。
OS の信頼ストアにある X.509 証明書を、有効期限・署名アルゴリズム・信頼チェーンから検証する GPUI 製デスクトップダッシュボード兼 CLI。ルート CA の状態を、ひと目で、確実に。
ca-checker は、証明書を発行・配布するためのツールではありません。いま自分の環境が信頼している証明書が、本当に信頼してよい状態かを確認するための「信頼の点検ツール」です。
証明書は、ファイルやストアに置いてあるだけでは安全ではありません。有効期限が切れていないか、弱い署名アルゴリズムを使っていないか、発行者とのつながりが正しいか、失効していないか。これらを確認して初めて、証明書は「信頼の鎖」として機能します。ca-checker は、その鎖を人間にも機械にも扱いやすい形で可視化します。
OS の信頼ストアには、日々の開発や運用で意識されないまま多数のルート CA と中間 CA が入っています。期限切れや未信頼の証明書が紛れていても、通常の業務は動いてしまうことがあります。ca-checker は、その見えないリスクを一覧できる状態にします。
ローカル環境の TLS エラーを切り分けたい開発者、証明書の期限を事前に把握したい運用担当、弱い署名や失効を確認したいセキュリティ担当。GUI と CLI のどちらからでも、同じ検証エンジンを使えます。
有効期限、弱い署名アルゴリズム、ルートからリーフまでのチェーン、CRL / OCSP による失効状態を確認します。結果はステータス、検証メッセージ、JSON として出力でき、CI の終了コードにも利用できます。
ca-checker が答えるのは、次の4つの問いです。
有効期間の開始前・期限切れ・期限間近を判定します。期限警告日数は 7 / 30 / 90 / 180 日から選べ、設定ファイルにも保存できます。
MD5 や SHA-1 など、現在では弱いとされる署名アルゴリズムを検出します。
ルート CA・中間 CA・リーフ証明書の連なりを rustls-webpki で検証します。自己署名証明書や未信頼のルートも区別して表示します。
証明書に記載された CRL Distribution Point と OCSP Responder を使って失効状態を確認します。有効・失効・不明を区別し、取得できなかった理由も表示します。
| 利用場面 | ca-checker でできること |
|---|---|
| ローカル開発 | TLS エラーの原因が期限切れ・未信頼・失効のどれかを切り分ける |
| 日々の運用 | OS 信頼ストアを一覧し、期限間近の証明書をデスクトップ通知で把握する |
| リリース前チェック | verify --revocation を CI に組み込み、異常時は終了コード 1 で止める |
| セキュリティ確認 | 弱い署名アルゴリズムや失効済み証明書を洗い出す |
| 調査・学習 | 証明書のフィールド、チェーン、CRL / OCSP の応答を画面と CLI で確認する |
できないこと: 秘密鍵の管理、証明書の発行、HSM / スマートカードの操作、CT ログの照会は行いません。また、失効確認は証明書に記載された CRL / OCSP エンドポイントに依存するため、ネットワークや提供元の状態によって「不明」になることがあります。ca-checker は専門的な PKI 運用を置き換えるものではなく、日々の確認を手早くするための補助ツールです。
起動すると OS の信頼ストアを読み込み、証明書ごとの状態を一覧化します。フィルタで絞り込み、行を選ぶと詳細と PEM を確認できます。
証明書のパースからチェーン検証、失効確認、ファイルインポート、通知、JSON 出力まで。GUI と CLI で同じ検証エンジンを使います。
総数・有効・期限間近・期限切れ・問題あり・CA をカードで集計。ステータス別のフィルタで一覧を絞り込めます。
Subject / Issuer / Serial / SAN / 基本制約 / 鍵・署名アルゴリズム / SHA-256 を表示。検証メッセージと PEM も確認できます。
rustls-webpki でルート・中間・リーフの信頼チェーンを検証。期限切れ、有効期間開始前、弱い署名も検出します。--host でリモートサーバーのチェーンも直接検証できます。
list-os / inspect / verify / scan / fetch / notify / config を提供。検証結果に応じた終了コードで CI にも組み込めます。
ディレクトリを再帰的に走査し、.pem / .crt / .cer / .der の証明書をまとめて読み込みます。
GUI から PEM / DER 証明書やフォルダを選択して読み込みます。OS 信頼ストアの証明書と同じ一覧で比較できます。
証明書の CRL Distribution Point と OCSP Responder を利用して失効状態を確認。署名検証、有効期限、レスポンスの鮮度もチェックします。
期限切れ・期限間近・問題のある証明書が見つかったとき、OS の通知機能で知らせます。起動時の通知と CLI からの通知に対応します。
GUI の Terminal タブからローカルシェルを起動し、cert-cli の検証やスキャンをその場で実行できます。
一覧・詳細・検証結果を JSON で出力。別のツールやレポート生成にそのまま渡せます。
証明書は次のいずれかの状態で分類されます。Valid と ExpiringSoon が正常扱いです。
| ステータス | 意味 | 正常 |
|---|---|---|
| Valid | 有効期限内で、チェーン検証に成功 | はい |
| ExpiringSoon | 警告日数以内に期限を迎える(既定 30 日) | はい |
| Expired | 有効期限が切れている | いいえ |
| NotYetValid | 有効期間開始前 | いいえ |
| UntrustedRoot | 信頼チェーンを構築できない | いいえ |
| SelfSigned | 自己署名かつ信頼ストアに未登録 | いいえ |
| WeakSignature | MD5 / SHA-1 など弱い署名アルゴリズム | いいえ |
| Revoked | CRL / OCSP により失効が確認された | いいえ |
| RevocationUnknown | 失効確認を実行したが、判定できなかった | いいえ |
| Error | その他の検証エラー | いいえ |
ダッシュボードは数字の羅列ではなく、状態の偏り・期限の山・発行者の集中をひと目で把握できるように構成しています。棒や凡例をクリックすると、そのまま一覧のフィルタになります。
正常・期限間近・期限切れ・その他の問題を比率で表示します。凡例をクリックすると該当ステータスだけに絞り込めます。
月ごとに期限を迎える証明書の件数を表示します。警告日数以内の月はアンバー色で強調し、12か月より先の件数はパネル下部にまとめます。
ファイル入力とネットワーク入力は同じパーサに合流し、信頼アンカーとの照合を経て検証結果になります。CLI ではその結果が終了コードに、GUI では一覧のステータスになります。
取得(cert_infra)と検証(cert_core)を分離し、GUI と CLI が同じ検証エンジンを共有します。図は oh-my-mermaid と同じ「関心ごとに Mermaid で説明する」アプローチで構成しています。
図の数値はサンプルです。実際の統計は GUI が OS 信頼ストアから起動時に集計します。Mermaid は CDN から読み込むため、オフラインでは図が表示されず、グラフ定義のテキストがそのまま残ります。
Rust 1.85 以上が必要です。macOS で GPUI をビルドする場合は Xcode の DEVELOPER_DIR を指定してください。
git clone https://github.com/watanabe3tipapa/ca-checker.git
cd ca-checker
export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
cargo build --workspace
OS の信頼ストアを読み込み、ダッシュボードを開きます。Import から証明書ファイルやフォルダを追加でき、Settings で期限警告日数・通知・失効確認モードを変更できます。
cargo run -p app
失効確認を有効にしたら、証明書の詳細画面で「Check revocation」を押します。Terminal タブではローカルシェルを起動できます。
OS の証明書一覧、ファイルの詳細、チェーン検証、失効確認、通知、設定ファイルの表示、リモート証明書の取得と検証を実行できます。
# 設定ファイルを初期化する
cargo run -p cert_cli -- config --init
# OS 信頼ストアの一覧
cargo run -p cert_cli -- list-os
# 証明書ファイルの詳細
cargo run -p cert_cli -- inspect certificate.pem
# ルートを明示してチェーン検証 + CRL / OCSP 失効確認
cargo run -p cert_cli -- verify leaf.pem \
--chain intermediate.pem \
--trust root.pem \
--revocation both
# 期限切れ・期限間近をデスクトップ通知する
cargo run -p cert_cli -- notify
# リモートサーバーのチェーンを OS 信頼ストアで検証
cargo run -p cert_cli -- verify --host example.com
# ディレクトリを再帰スキャン
cargo run -p cert_cli -- scan /path/to/certs --json
# リモートサーバーが提示するチェーンを取得(検証なし)
cargo run -p cert_cli -- fetch example.com --json
設定ファイルの場所は ~/.config/ca-checker/config.toml です。--config PATH で別のファイルを指定できます。
各コマンドは同じ cert_core のパーサを使い、検証を行うコマンドは共通の検証エンジンを使います。異なるのは入力の取得方法です。
| コマンド | 入力 | 内部処理 | 主な出力 |
|---|---|---|---|
list-os | OS 信頼ストア | rustls-native-certs でネイティブストアを読み込み、各 DER を x509-parser でパース | 証明書一覧、パースエラー(stderr) |
inspect | ファイル | PEM ブロックまたは DER を判定してパース | Subject / Issuer / 有効期間 / 署名・鍵アルゴリズム / CA フラグ / SAN / SHA-256 |
verify | ファイルまたは --host | リーフと中間 CA を収集し、rustls-webpki で信頼アンカーまで検証 | ステータス、信頼アンカー、エラー、警告 |
scan | ディレクトリ | .pem / .crt / .cer / .der を再帰的に列挙してパース | 証明書一覧、ファイル単位のエラー |
fetch | --host / --port | TLS ハンドシェイクでサーバー提示のチェーンを取得 | 証明書一覧(取得のみで検証なし) |
verify の処理フローverify は「対象の決定 → 中間 CA の収集 → 信頼アンカーの決定 → 検証」の順に進みます。
--host 指定では TLS ハンドシェイクで取得したチェーンの先頭をリーフ、残りを中間 CA として扱います。--chain を併用すると、サーバーが送らなかった中間 CA を補完できます。--trust 指定時は指定ファイルの証明書だけを、未指定時は OS 信頼ストア全体をアンカーにします。NotYetValid / Expired)、MD5 / SHA-1 系の弱い署名(WeakSignature)、アンカーとの完全一致、自己署名(SelfSigned)を順に確認します。その後 rustls-webpki の verify_for_usage を現在時刻で実行し、EKU が serverAuth で失敗した場合は clientAuth で再試行します。残日数が --warn-days(既定 30 日)以内なら ExpiringSoon とします。fetch と verify --host は rustls で TLS 1.2 / 1.3 のハンドシェイクを行い、サーバーが送信した証明書チェーンを取得します。
--host の値をそのまま使用します(IP リテラルの場合は SNI を送信しません)。verify のチェーン検証で行います。--chain intermediate.pem で補完できます。fetch 単体では行わず、verify --revocation または設定ファイルで有効にします。# 取得と検証を一度に実行
cargo run -p cert_cli -- verify --host example.com --json
# サーバーが提示したチェーンをそのまま表示(検証なし)
cargo run -p cert_cli -- fetch example.com --json
| 終了コード | 意味 |
|---|---|
0 | 検証成功(Valid / ExpiringSoon) |
1 | 検証失敗(期限切れ・未信頼など) |
2 | 実行エラー(ファイル読込失敗・ネットワークエラーなど) |
--json を付けると stdout に整形済み JSON を出力します。list-os / inspect / scan / fetch は Certificate の配列、verify は ChainValidationResult(target / intermediates / trust_anchor / status / checked_at / errors / warnings)を返します。JSON 出力にはパース警告を含めないため、警告を確認したい場合は --json を外して実行してください。
ca-checker/
├── Cargo.toml # Cargo workspace
├── crates/
│ ├── cert_core/ # ドメインモデル、パース、検証エンジン
│ ├── cert_infra/ # ファイル / OS 信頼ストア / ネットワーク
│ ├── cert_cli/ # CLI バイナリ (cert-cli)
│ └── app/ # GPUI アプリケーション (ca-checker)
├── docs/ # GitHub Pages ランディングページ
└── .github/workflows/ # CI / Pages デプロイ
fetch はサーバーが提示したチェーンを取得するのみで、その場では検証しません(verify で明示的に検証してください)