🔐

クライアント証明書認証(CBA)の概要と開発環境構築(オレオレ証明書発行スクリプト付き)

に公開

はじめに

こんにちは。ourlyでバックエンドエンジニアをしているjakeです。

この記事は ourly Advent Calendar 2025🎄 17日目の記事です。

https://adventar.org/calendars/11698

SaaSでSAML SSO連携を実装していると、クライアント証明書認証(CBA)への対応が必要になることがあります。
CBAの検証には証明書の発行・検証環境が必要ですが、無料で手軽に試せる方法があまり見つかりませんでした。

この記事では、自作スクリプトを使ってプライベートCA環境を構築し、CBAを試す方法を解説します。

IdPとしてはEntra IDを使いました。Entra IDでは無料枠でアカウント発行からCBA設定、認証まで一通り試すことができます。
ただ概念の理解や設定の複雑さに最初はかなり戸惑いました。この記事が後世の人のためになれば幸いです。

この記事では、以下の内容を解説します。

  • CBAの基本的な仕組みと位置づけ
  • 商用CAとプライベートCAの違い
  • プライベートCA環境の構築方法
  • Entra IDでのCBA設定手順
  • PC/iOSシミュレータでの動作確認方法

クライアント証明書認証(CBA)とは

クライアント証明書認証はX.509証明書を使ってユーザーを認証する方式です。
多要素認証(MFA)の選択肢の一つで、パスキー認証などと並んで「フィッシング耐性のある認証方式」に分類されます。

エンタープライズ環境では、証明書をデバイスにバインドすることで「この証明書がインストールされたデバイスからのみアクセスを許可する」という使い方ができます。

商用CAとプライベートCAの違い

CBAを構成する登場人物の関係を整理します。本番環境(商用CA利用)とプライベートCAを利用した場合では、誰が何を担当するかが異なります。

項目 商用CA プライベートCA
ルートCA 商用CAが管理 自分で作成
中間CA 商用CAが管理 自分で作成
ユーザー証明書 商用CAから発行依頼 自分で発行
CRL/OCSP 商用CAが提供 不要(または自分で用意)
費用 有料 無料
信頼性 公的に信頼される 自分で信頼設定が必要

開発環境では、商用CAが担っている部分を全て自分で構築します。今回はこれをスクリプト1つで完結できるようにしました。

プライベートCA環境の構築

スクリプトの概要

プライベートCA環境を構築するBashスクリプトを用意しました。AIと一緒に作成したもので、gistで公開しています。

スクリプト

主なコマンド:

コマンド 説明
init ルートCA と 中間CA を作成
issue ユーザー証明書を発行
batch CSVから複数ユーザーの証明書を一括発行
list 発行済み証明書の一覧表示
crl CRL(証明書失効リスト)の再生成

CA環境の初期化

スクリプトをダウンロードして実行権限を付与します。

curl -O https://gist.githubusercontent.com/j4keh/351f8e15aeca47dcc9c6c667fecc3cf9/raw/dev-pki.sh
chmod +x dev-pki.sh

init コマンドでCA環境を初期化します。

./dev-pki.sh init

実行すると、以下のようなディレクトリ構造が作成されます。

dev-pki/
├── root/
│   ├── certs/
│   │   └── root.cer          # ルートCA証明書
│   ├── private/
│   │   └── root.key          # ルートCA秘密鍵
│   └── crl/
│       └── root.crl
├── inter/
│   ├── certs/
│   │   └── inter.cer         # 中間CA証明書
│   ├── private/
│   │   └── inter.key
│   └── crl/
│       └── inter.crl
└── out/                       # 発行したユーザー証明書の出力先

ユーザー証明書の発行

issue コマンドでユーザー証明書を発行します。--cn にユーザー名、--email にEntra IDのUPN(メールアドレス形式)を指定します。

./dev-pki.sh issue \
  --cn "Taro Yamada" \
  --email "taro.yamada@contoso.onmicrosoft.com"

実行すると、dev-pki/out/ ディレクトリに以下のファイルが生成されます。

ファイル 説明
Taro_Yamada.crt 証明書(PEM形式)
Taro_Yamada.key 秘密鍵
Taro_Yamada.pfx PKCS#12形式(Windows/macOS/iOSでインポート用)
Taro_Yamada.pfx.pass.txt PFXファイルのパスワード

複数ユーザー分を一括発行する場合は、CSVファイルを用意して batch コマンドを使います。

# developers.csv の形式: CN,EMAIL
# Taro Yamada,taro.yamada@contoso.onmicrosoft.com
# Hanako Sato,hanako.sato@contoso.onmicrosoft.com

./dev-pki.sh batch --csv developers.csv

Entra IDへのCA証明書登録

ここからはEntra ID側の設定です。Azure Portalにおける詳細な手順は公式ドキュメントも参照してください。

📖 公式ドキュメント: Microsoft Entra ID で証明機関を構成する

証明機関への移動

  1. Microsoft Entra 管理センター にサインイン
  2. 保護 > もっと見る > セキュリティ センター
  3. 管理 > 証明機関 を選択

ルートCA証明書のアップロード

  1. アップロード をクリック
  2. dev-pki/root/certs/root.cer を選択
  3. ルート証明機関であるはい に設定
  4. CRL配布ポイントは空のままでOK(開発環境のため)

中間CA証明書のアップロード

  1. アップロード をクリック
  2. dev-pki/inter/certs/inter.cer を選択
  3. ルート証明機関であるいいえ に設定
  4. CRL配布ポイントは空のままでOK

CBA認証方法の有効化

証明機関の登録が終わったら、認証方法としてCBAを有効化します。

📖 公式ドキュメント: Microsoft Entra 証明書ベース認証を構成する

証明書ベース認証の有効化

  1. 保護 > 認証方法 > ポリシー を選択
  2. 証明書ベースの認証 をクリック
  3. 有効にするはい に設定
  4. ターゲット で対象ユーザー/グループを選択

ユーザー名バインディングの設定

構成 タブで、証明書のどの属性をユーザー識別に使うかを設定します。

証明書フィールド Entra IDユーザー属性
SubjectAlternativeName > RFC822Name userPrincipalName

スクリプトで発行した証明書は、--email で指定した値がSANのRFC822Nameに設定されるため、この設定で動作します。

動作確認:CBAでサインインする

Windowsでの証明書インポート

  1. PFXファイル(*.pfx)をダブルクリック
  2. 現在のユーザー を選択して 次へ
  3. パスワード(*.pfx.pass.txt の内容)を入力
  4. 証明書の種類に基づいて、自動的に証明書ストアを選択する を選択
  5. 完了 をクリック

macOSでの証明書インポート

  1. キーチェーンアクセス を開く
  2. ファイル > 読み込む でPFXファイルを選択
  3. パスワードを入力してインポート
  4. インポートした証明書をダブルクリックし、信頼 セクションを展開
  5. この証明書を使用するとき常に信頼 に変更

iOSシミュレータでの証明書インポート

iOSアプリの開発でCBAをテストする場合、シミュレータに証明書をインストールできます。

# PFXファイルをシミュレータで開く
xcrun simctl openurl booted "file://${PWD}/dev-pki/out/Taro_Yamada.pfx"

シミュレータでSafariが起動し、ダウンロード確認が表示されます。

  1. 許可 をタップしてダウンロード
  2. 設定 アプリを開く
  3. 一般 > VPNとデバイス管理 > ダウンロード済みプロファイル を選択
  4. 証明書プロファイルを インストール
  5. パスワードを入力

次に、証明書を信頼します。

  1. 設定 > 一般 > 情報 > 証明書信頼設定
  2. インストールした証明書の 完全な信頼を有効にする をオン

サインインテスト

  1. InPrivate/シークレットウィンドウで https://portal.azure.com にアクセス
  2. サインイン オプション をクリック
  3. 組織にサインインする を選択
  4. 組織のドメインを入力
  5. 証明書選択ダイアログが表示されたら、インストールした証明書を選択
  6. サインイン成功を確認

まとめ

クライアント証明書認証(CBA)は、MFAの選択肢の一つとして検討に値する認証方式です。特に、証明書をデバイスにバインドしてアクセス制限を行いたい場合に有用です。

開発環境では、今回紹介したスクリプトを使えば手軽にプライベートCA環境を構築してCBAの動作を確認できます。iOS/Androidいずれのシミュレータ・エミュレータでも検証可能なので、モバイルアプリ開発時のCBA対応検証にも活用できます。

参考資料

ourly tech blog

Discussion