ca-checker v0.1.1 · X.509

CA Certificate Checker

OS の信頼ストアにある X.509 証明書を、有効期限・署名アルゴリズム・信頼チェーンから検証する GPUI 製デスクトップダッシュボード兼 CLI。ルート CA の状態を、ひと目で、確実に。

このツールは何のためにあるのか

ca-checker は、証明書を発行・配布するためのツールではありません。いま自分の環境が信頼している証明書が、本当に信頼してよい状態かを確認するための「信頼の点検ツール」です。

証明書は、ファイルやストアに置いてあるだけでは安全ではありません。有効期限が切れていないか、弱い署名アルゴリズムを使っていないか、発行者とのつながりが正しいか、失効していないか。これらを確認して初めて、証明書は「信頼の鎖」として機能します。ca-checker は、その鎖を人間にも機械にも扱いやすい形で可視化します。

why

信頼を「なんとなく」で終わらせない

OS の信頼ストアには、日々の開発や運用で意識されないまま多数のルート CA と中間 CA が入っています。期限切れや未信頼の証明書が紛れていても、通常の業務は動いてしまうことがあります。ca-checker は、その見えないリスクを一覧できる状態にします。

visibility trust-store
who

開発者・運用・セキュリティ担当へ

ローカル環境の TLS エラーを切り分けたい開発者、証明書の期限を事前に把握したい運用担当、弱い署名や失効を確認したいセキュリティ担当。GUI と CLI のどちらからでも、同じ検証エンジンを使えます。

developer sre security
how

期限・署名・連なり・失効をまとめて確認

有効期限、弱い署名アルゴリズム、ルートからリーフまでのチェーン、CRL / OCSP による失効状態を確認します。結果はステータス、検証メッセージ、JSON として出力でき、CI の終了コードにも利用できます。

expiry chain revocation

ca-checker が答えるのは、次の4つの問いです。

  1. この証明書は、いつまで有効か

    有効期間の開始前・期限切れ・期限間近を判定します。期限警告日数は 7 / 30 / 90 / 180 日から選べ、設定ファイルにも保存できます。

  2. この署名は、十分に強いか

    MD5 や SHA-1 など、現在では弱いとされる署名アルゴリズムを検出します。

  3. この証明書は、信頼の起点までつながっているか

    ルート CA・中間 CA・リーフ証明書の連なりを rustls-webpki で検証します。自己署名証明書や未信頼のルートも区別して表示します。

  4. この証明書は、失効していないか

    証明書に記載された 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 を確認できます。

ca-checker v0.1.1 · OS trust store

CA Certificate Checker

162 certificates · 42 anchors
162TOTAL
150VALID
8EXPIRING
2EXPIRED
2ISSUES
96CA
STATUS DISTRIBUTION 162 certificates
DigiCert Global Root G2DigiCert Inc 2038-01-15 Valid
Example Intermediate CAExample Trust Services 2026-11-08 Expiring soon
Legacy Root AuthorityLegacy CA 2024-06-30 Expired
画面イメージ(数値はサンプル)

主な機能

証明書のパースからチェーン検証、失効確認、ファイルインポート、通知、JSON 出力まで。GUI と CLI で同じ検証エンジンを使います。

dashboard

状態サマリー

総数・有効・期限間近・期限切れ・問題あり・CA をカードで集計。ステータス別のフィルタで一覧を絞り込めます。

summary filter
detail

証明書詳細

Subject / Issuer / Serial / SAN / 基本制約 / 鍵・署名アルゴリズム / SHA-256 を表示。検証メッセージと PEM も確認できます。

x509 pem
validator

チェーン検証

rustls-webpki でルート・中間・リーフの信頼チェーンを検証。期限切れ、有効期間開始前、弱い署名も検出します。--host でリモートサーバーのチェーンも直接検証できます。

webpki chain tls
cli

CLI ツール

list-os / inspect / verify / scan / fetch / notify / config を提供。検証結果に応じた終了コードで CI にも組み込めます。

clap exit-code
scanner

一括スキャン

ディレクトリを再帰的に走査し、.pem / .crt / .cer / .der の証明書をまとめて読み込みます。

recursive pem der
import

GUI ファイルインポート

GUI から PEM / DER 証明書やフォルダを選択して読み込みます。OS 信頼ストアの証明書と同じ一覧で比較できます。

pem der folder
revocation

CRL / OCSP 失効確認

証明書の CRL Distribution Point と OCSP Responder を利用して失効状態を確認。署名検証、有効期限、レスポンスの鮮度もチェックします。

crl ocsp revoked
notify

デスクトップ通知

期限切れ・期限間近・問題のある証明書が見つかったとき、OS の通知機能で知らせます。起動時の通知と CLI からの通知に対応します。

notification startup
terminal

内蔵ターミナル

GUI の Terminal タブからローカルシェルを起動し、cert-cli の検証やスキャンをその場で実行できます。

pty shell cli
json

JSON 出力

一覧・詳細・検証結果を JSON で出力。別のツールやレポート生成にそのまま渡せます。

serde automation

検証ステータス

証明書は次のいずれかの状態で分類されます。Valid と ExpiringSoon が正常扱いです。

ステータス意味正常
Valid有効期限内で、チェーン検証に成功はい
ExpiringSoon警告日数以内に期限を迎える(既定 30 日)はい
Expired有効期限が切れているいいえ
NotYetValid有効期間開始前いいえ
UntrustedRoot信頼チェーンを構築できないいいえ
SelfSigned自己署名かつ信頼ストアに未登録いいえ
WeakSignatureMD5 / SHA-1 など弱い署名アルゴリズムいいえ
RevokedCRL / OCSP により失効が確認されたいいえ
RevocationUnknown失効確認を実行したが、判定できなかったいいえ
Errorその他の検証エラーいいえ

統計と可視化

ダッシュボードは数字の羅列ではなく、状態の偏り・期限の山・発行者の集中をひと目で把握できるように構成しています。棒や凡例をクリックすると、そのまま一覧のフィルタになります。

状態分布

pie showData title 信頼ストアの状態分布(サンプル) "Valid" : 150 "ExpiringSoon" : 8 "Expired" : 2 "Other issues" : 2

正常・期限間近・期限切れ・その他の問題を比率で表示します。凡例をクリックすると該当ステータスだけに絞り込めます。

期限タイムライン

xychart-beta title "今後12か月に期限を迎える証明書(サンプル)" x-axis ["Nov", "Dec", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct"] y-axis "証明書数" 0 --> 8 bar [2, 1, 0, 4, 3, 1, 0, 2, 6, 1, 0, 0]

月ごとに期限を迎える証明書の件数を表示します。警告日数以内の月はアンバー色で強調し、12か月より先の件数はパネル下部にまとめます。

検証フローの可視化

flowchart LR A["leaf.pem"] --> P["cert_core::parse"] B["--host example.com"] --> N["cert_infra::fetch_chain
TLS handshake"] N --> P P --> V["cert_core::validate"] T["--trust / OS trust store"] --> V V --> S{"status"} S -->|"Valid / ExpiringSoon"| OK["exit 0"] S -->|"Expired / Untrusted / ..."| NG["exit 1"]

ファイル入力とネットワーク入力は同じパーサに合流し、信頼アンカーとの照合を経て検証結果になります。CLI ではその結果が終了コードに、GUI では一覧のステータスになります。

コンポーネント構成

flowchart TB subgraph core["cert_core(ドメイン)"] PARSER["parser"] VALIDATOR["validator"] PARSER --> VALIDATOR end subgraph infra["cert_infra(取得)"] FILE["file_loader"] OS["os_store"] NET["network"] end subgraph frontends["フロントエンド"] GUI["GPUI dashboard"] CLI["cert-cli"] end FILE --> PARSER OS --> PARSER NET --> PARSER GUI --> OS GUI --> VALIDATOR CLI --> FILE CLI --> NET CLI --> OS CLI --> VALIDATOR

取得(cert_infra)と検証(cert_core)を分離し、GUI と CLI が同じ検証エンジンを共有します。図は oh-my-mermaid と同じ「関心ごとに Mermaid で説明する」アプローチで構成しています。

図の数値はサンプルです。実際の統計は GUI が OS 信頼ストアから起動時に集計します。Mermaid は CDN から読み込むため、オフラインでは図が表示されず、グラフ定義のテキストがそのまま残ります。

使い方

  1. ビルドする

    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
  2. GUI を起動する

    OS の信頼ストアを読み込み、ダッシュボードを開きます。Import から証明書ファイルやフォルダを追加でき、Settings で期限警告日数・通知・失効確認モードを変更できます。

    cargo run -p app

    失効確認を有効にしたら、証明書の詳細画面で「Check revocation」を押します。Terminal タブではローカルシェルを起動できます。

  3. CLI で検証する

    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-osOS 信頼ストア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 / --portTLS ハンドシェイクでサーバー提示のチェーンを取得証明書一覧(取得のみで検証なし)

verify の処理フロー

verify は「対象の決定 → 中間 CA の収集 → 信頼アンカーの決定 → 検証」の順に進みます。

  1. 対象の決定 — ファイル指定ではファイル内の最初の証明書をリーフ、残りを中間 CA として扱います。--host 指定では TLS ハンドシェイクで取得したチェーンの先頭をリーフ、残りを中間 CA として扱います。--chain を併用すると、サーバーが送らなかった中間 CA を補完できます。
  2. 信頼アンカーの決定 — --trust 指定時は指定ファイルの証明書だけを、未指定時は OS 信頼ストア全体をアンカーにします。
  3. 検証 — 有効期間(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 のハンドシェイクを行い、サーバーが送信した証明書チェーンを取得します。

  • 接続・読み書きのタイムアウトはそれぞれ 10 秒です。
  • SNI には --host の値をそのまま使用します(IP リテラルの場合は SNI を送信しません)。
  • 取得時点では証明書を検証しません。 自己署名・期限切れ・未信頼の証明書でも取得でき、信頼判定は verify のチェーン検証で行います。
  • サーバーが中間 CA を送らない場合は --chain intermediate.pem で補完できます。
  • クライアント証明書と ALPN には未対応です。失効確認は fetch 単体では行わず、verify --revocation または設定ファイルで有効にします。
# 取得と検証を一度に実行
cargo run -p cert_cli -- verify --host example.com --json

# サーバーが提示したチェーンをそのまま表示(検証なし)
cargo run -p cert_cli -- fetch example.com --json

終了コードと 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 で明示的に検証してください)
  • GUI のファイル選択は対応済みですが、ウィンドウへのドラッグ&ドロップは未対応
  • OCSP の nonce 検証は未対応
  • Windows は未対応
  • wterm は Web 専用のため、GUI 内では GPUI ネイティブの PTY ターミナルを使用
  • GPUI は pre-1.0 のため、アップグレード時に API 変更が発生する可能性あり

信頼の鎖を、確かめる。

OS に眠っているルート CA を一覧し、期限とチェーンをまとめて確認できます。

リポジトリを開く README を読む