メインコンテンツまでスキップ

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つの用途で使用されます:

  1. クライアント認証(Token Endpoint)

    • client_secretの代わりにクライアント証明書で認証
    • より強固な認証
  2. Certificate-Bound Access Token(Resource Server)

    • Access Tokenをクライアント証明書にバインド
    • トークン盗聴防止

詳細: OAuth 2.0のセキュリティ


MTLSの適用シーン

必要なケース

  • ✅ 金融API(FAPI準拠)
  • ✅ オープンバンキング
  • ✅ 企業間API(B2B)
  • ✅ 政府機関API
  • ✅ 超高セキュリティ要件

不要なケース

  • ❌ 一般的なWebアプリ
  • ❌ モバイルアプリ(証明書管理が困難)
  • ❌ SPA(ブラウザでMTLS困難)

MTLSのメリット・デメリット

メリット

  • 強固な認証: 証明書 + 秘密鍵の両方が必要
  • 相互認証: サーバーとクライアント両方を確認
  • なりすまし防止: 秘密鍵がないとなりすまし不可能

デメリット

  • 証明書管理が必要: 発行、更新、失効管理
  • 実装が複雑: クライアント側で証明書・秘密鍵の管理
  • コストが高い: 証明書発行コスト
  • ブラウザでは困難: SPAではMTLS実装が難しい

まとめ

学んだこと

  • ✅ 通常のTLS: サーバー認証のみ
  • ✅ MTLS: サーバーとクライアント両方を認証
  • ✅ クライアント証明書の役割
  • ✅ OAuth 2.0でのMTLS使用(tls_client_auth)
  • ✅ FAPIはMTLS必須
  • ✅ MTLSのメリット・デメリット
  • ✅ Self-Signed vs CA発行証明書

MTLSが重要な理由

OAuth 2.0/OIDC:

  • client_secretより強固な認証
  • トークン盗聴・横取り攻撃を防止

FAPI:

  • 金融機関レベルのセキュリティ
  • MTLS必須要件

次に読むべきドキュメント

  1. FAPI実装ガイド - FAPI詳細
  2. OAuth 2.0のセキュリティ - セキュリティ脅威

最終更新: 2025-12-18 対象: IDサービス開発初心者