MTLS(相互TLS認証)
このドキュメントの目的
MTLS(Mutual TLS) の仕組みを理解し、OAuth 2.0/OIDC(特にFAPI)での使われ方を把握することが目標です。
通常のTLS vs MTLS
通常のTLS(サーバー認証のみ)
┌──────────────────┐ ┌──────────────────┐
│ クライアント │ │ サーバー │
│ │ │ │
│ 1. 接続開始 │──────────────────→│ │
│ │ │ │
│ 3. 証明書検証 │ │ 2. サーバー証明書│
│ - ドメイン確認 │←──────────────────│ 送信 │
│ - CA署名確認 │ 証明書 │ │
│ ↓ │ │ │
│ 4. サーバー認証 │ │ │
│ OK │ │ ? │
│ ↓ │ │ クライアントは誰?│
│ 5. 暗号化通信 │ │ (不明) │
│ │ │ │
└──────────────────┘ └──────────────────┘
特徴:
- サーバーの身元は確認される
- クライアントの身元は不明(匿名)
用途: 一般的なWebサイト(誰でもアクセス可能)
MTLS(相互認証)
┌──────────────────┐ ┌──────────────────┐
│ │ │ │
│ クライアント │ │ サーバー │
│ │ │ │
│ ────────────────────────────────────────────────────── │
│ MTLSハンドシェイク(相互認証) │
│ ────────────────────────────────────────────────────── │
│ │ │ │
│ 1. ClientHello │ │ │
│ (暗号スイート)│──────────────────→│ 2. 受信 │
│ │ │ │
│ 5. 受信 │ │ 3. ServerHello │
│ ↓ │←──────────────────│ (暗号選択、 │
│ 6. サーバー証明書│ サーバー証明書 │ 証明書送信、 │
│ 検証 │ +クライアント │ クライアント │
│ - ドメイン確認 │ 証明書要求 │ 証明書要求) │
│ - 有効期限確認 │ │ │
│ - CA署名確認 │ │ 4. 送信 │
│ ↓ │ │ │
│ 7. クライアント │ │ │
│ 証明書送信 │ │ │
│ + 秘密鍵で署名 │──────────────────→│ 8. ク ライアント │
│ │ クライアント証明書 │ 証明書検証 │
│ │ +署名 │ - 有効期限確認 │
│ │ │ - CA署名確認 │
│ │ │ - 秘密鍵所有確認│
│ │ │ ↓ │
│ 9. 鍵交換 │──────────────────→│ 10. 鍵交換 │
│ (暗号化鍵生成)│ │ (暗号化鍵生成)│
│ │ │ │
│ ✅ 両方の身元確認│ │ ✅ 両方の身元確認│
│ │ │ │
│ ────────────────────────────────────────────────────── │
│ 暗号化通信開始(MTLS確立後) │
│ ────────────────────────────────────────────────────── │
│ │ │ │
│ 11. HTTPリクエスト │ │
│ POST /token │ │ │
│ ↓ │ │ │
│ ┌────────────┐ │ │ │
│ │暗号化 │ │─12. 暗号化データ──→│ 13. 復号 │
│ └────────────┘ │ │ ↓ │
│ │ │ 14. 処理実行 │
│ │ │ (クライアント │
│ │ │ 認証済み) │
│ │ │ ↓ │
│ 16. 復号 │ │ 15. 暗号化 │
│ ↓ │ │ ↓ │
│ ┌────────────┐ │ │ ┌────────────┐ │
│ │200 OK │ │←─暗号化データ───── │ │200 OK │ │
│ │{token} │ │ │ │{token} │ │
│ └────────────┘ │ │ └────────────┘ │
│ │ │ │
└──────────────────┘ └──────────────────┘
特徴:
- サーバーとクライアント両方の身元を確認
- クライアントも証明書を持つ必要がある
用途: 高セキュリティ要件(金融API、政府機関、企業間API)
MTLSの仕組み
クライアント証明書とは何か(具体的に)
証明書の実体:
- ファイル: .pem、.crt、.p12等のファイル
- 中身: 公開鍵 + クライアント識別情報 + CAの署名
ファイル例:
client.crt(クライアント証明書ファイル)
client.key(秘密鍵ファイル)← クライアントのみ保持、絶対に外部に出さない
証明書ファイルの中身(PEM形式):
-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJAKL0UG+mRKu3MA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
(Base64エンコードされたデータ)
...
-----END CERTIFICATE-----
デコードすると:
Subject: CN=client-app-123(クライアント識別名)
O=ACME Corporation(組織名)
Issuer: CN=Enterprise CA(企業内認証局)
Valid From: 2025-01-01 00:00:00 UTC
Valid To: 2026-01-01 00:00:00 UTC
Public Key: (2048 bit RSA)
Modulus: 00:d4:3a:...
Exponent: 65537
Signature Algorithm: sha256WithRSAEncryption
Signature: 7f:2e:...
秘密鍵ファイル(client.key):
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDU...
(絶対に外部に出さない)
-----END PRIVATE KEY-----
秘密鍵と公開鍵の関係:
秘密鍵(client.key)← クライアントのみ保持
├─ 署名生成に使用(MTLSハンドシェイク時)
└─ 漏洩すると、なりすまし可能
公開鍵 ← 証明書(client.crt)に含まれる
├─ サーバーに送信される
└─ サーバーが署名検証に使用
MTLSハンドシェイク
相互に証明書と秘密鍵を検証:
1. ClientHello
↓
2. ServerHello + サーバー証明書 + クライアント証明書要求
↓
3. クライアントがサーバー側を検証:
- サーバー証明書の検証(ドメイン名、有効期限、CA署名)
- サーバーの秘密鍵所有を確認(復号できるか)
↓
4. クライアント証明書送信 + 秘密鍵で署名
↓
5. サーバーがクライアント 側を検証:
- クライアント証明書の検証(有効期限、CA署名)
- クライアントの秘密鍵所有を確認(署名検証)
↓
6. 両方OK → 暗号化通信開始
MTLSで認証しているもの:
- ✅ 証明書(公開鍵)が本物か(CAの署名で保証)
- ✅ 秘密鍵を所有しているか(署名・復号で証明)
- ✅ 相手の身元(証明書のSubjectで識別)
OAuth 2.0/OIDCでのMTLS使用
MTLSはOAuth 2.0/OIDCで2つの用途で使用されます:
-
クライアント認証(Token Endpoint)
- client_secretの代わりにク ライアント証明書で認証
- より強固な認証
-
Certificate-Bound Access Token(Resource Server)
- Access Tokenをクライアント証明書にバインド
- トークン盗聴防止
詳細: OAuth 2.0のセキュリティ
MTLSの適用シーン
必要なケース
- ✅ 金融API(FAPI準拠)
- ✅ オープンバンキング
- ✅ 企業間API(B2B)
- ✅ 政府機関API
- ✅ 超高セキュリティ要件
不要なケース
- ❌ 一般的なWebアプリ
- ❌ モバイルアプリ(証明書管理が困難)
- ❌ SPA(ブラウザでMTLS困難)