TL

mTLS と相互認証・サービスメッシュの信頼基盤

サービス間通信を「正しい相手だけ」に絞りたい人向け。mTLS の双方向認証と SPIFFE/SPIRE による短命 ID 発行、証明書ローテーションの設計を原理から押さえ、ゼロトラストを運用に落とせます。

応用mTLSSPIFFEサービスメッシュゼロトラストPKI証明書最終更新: 2026-06-21
TL;DR要点だけ先に
  • 1.mTLS は TLS ハンドシェイク中にサーバーが CertificateRequest を送り、クライアントも証明書と CertificateVerify(秘密鍵による署名)を返すことで、双方が公開鍵の所有を相互に証明する仕組み。
  • 2.SPIFFE は信頼境界内の ID を spiffe:// から始まる SVID として表現し、SPIRE がノード・ワークロード認証を経て分単位の短命証明書を自動発行・自動ローテーションする。
  • 3.サービスメッシュはサイドカープロキシが mTLS を肩代わりし、アプリを変えずに「正しい鍵を持つ相手だけと通信する」ゼロトラストを実現する。

mTLS が解く問題:ネットワーク位置を信用しない

通常の TLS は片側認証です。クライアントはサーバー証明書を検証して相手を確かめますが、サーバーから見たクライアントは匿名で、本人確認はアプリ層のトークンやパスワードに委ねられます。社内ネットワークという「内側だから安全」という前提が崩れた今、この非対称性が問題になります。同一クラスタ内で動くサービス同士は、ネットワーク位置だけを根拠に相互を信頼してしまいがちだからです。

**mTLS(mutual TLS)**は、この前提を捨てます。通信する両者がそれぞれ証明書を提示し、相手の秘密鍵所有を相互に検証する。ネットワークのどこにいるかではなく、どの鍵を持つかで身元を判定する点が本質で、これがゼロトラストの通信基盤になります。

ハンドシェイクの非対称:片側認証との違い

mTLS が普通の TLS と異なるのは、ハンドシェイク中の数メッセージだけです。サーバーが自分の証明書を送った後、続けて CertificateRequest をクライアントへ送る。これが「あなたの証明書も見せてください」という要求の合図です。

TLS 1.3 の mTLS ハンドシェイク(要点のみ)

Client → Server: ClientHello
Server → Client: ServerHello, EncryptedExtensions,
                 CertificateRequest,     ← クライアント証明書を要求
                 Certificate(サーバー証明書),
                 CertificateVerify,      ← サーバー秘密鍵での署名
                 Finished
Client → Server: Certificate(クライアント証明書),
                 CertificateVerify,      ← クライアント秘密鍵での署名
                 Finished

鍵となるのは CertificateVerify です。証明書を提示するだけなら、公開されている他人の証明書をコピーして名乗れてしまう。CertificateVerify は、これまでのハンドシェイクのトランスクリプト(やり取りのハッシュ)に対し、証明書の公開鍵に対応する秘密鍵で署名したものです。検証側は証明書内の公開鍵で署名を確かめるため、秘密鍵を実際に握っている当事者しか正しい署名を作れません。これにより「証明書を持っている」のではなく「証明書に対応する秘密鍵を所有している」ことが証明されます。

検証は2段階で行われる

受け取った証明書に対し、検証側は2つを独立に確かめます。(1) その証明書が信頼する CA から正しく発行されたか(X.509 チェーン検証)。(2) CertificateVerify 署名がその証明書の公開鍵で検証できるか。前者が「身元の保証元が正しいか」、後者が「今まさに通信している相手が本人か」を担います。両方が揃って初めて相手を信頼します。

SPIFFE:ID を URI として表す

mTLS を実運用するうえでの難所は、証明書をどう発行・配布・更新するかです。ここで標準として広まったのが SPIFFE(Secure Production Identity Framework For Everyone) です。SPIFFE はワークロードの身元を、人間の名前ではなく SPIFFE ID という URI で表します。

spiffe://example.org/ns/payment/sa/checkout
        └─ trust domain ─┘└──── path ────┘

trust domain(信頼ドメイン)は1つの CA が支配する信頼境界、path はその中での個別ワークロードを表す論理名です。この ID を運ぶ実体が SVID(SPIFFE Verifiable Identity Document) で、最も一般的な形式は X.509 証明書です。証明書の SAN(Subject Alternative Name)の URI フィールドに spiffe://... を埋め込み、これを mTLS の証明書としてそのまま使います。

ポイントは、検証側が証明書チェーンの正当性を確かめたうえで、SAN に入った SPIFFE ID で認可を判断できることです。「正しい CA が発行した、payment/checkout という ID の証明書」という事実だけで、IP やホスト名に依存せず相手を識別できます。

SPIRE:短命 ID をどう自動発行するか

SPIFFE は仕様で、その代表的な実装が SPIRE(SPIFFE Runtime Environment) です。SPIRE の核心は、証明書を分単位の短命にして自動で配り替える点にあります。長命の証明書を配ると、漏洩時の被害が長期化し、鍵管理ライフサイクルでいう失効(CRL/OCSP)への依存が増えます。SVID を例えば1時間で失効させれば、漏れても短時間で無効化され、失効リストへの依存自体を薄められます。

SPIRE が証明書を渡す前に解く問題は「目の前のワークロードは本当に名乗りどおりの相手か」という認証で、これを二段で行います。

ノードを信頼してからその上のワークロードを識別する二段構え。秘密の事前共有なしに身元を立ち上げるのが狙い。
段階誰を確かめるか確かめる手段の例
ノード認証 (Node Attestation)そのエージェントが載るマシンクラウドのインスタンス署名付き文書、k8s の Projected Service Account Token
ワークロード認証 (Workload Attestation)鍵を要求してきたプロセスプロセスの UID/GID、コンテナの Pod 情報、selector との照合

ワークロードは秘密鍵を SPIRE Agent から平文でもらうのではなく、自分で鍵ペアを生成し公開鍵だけを Agent に渡して署名(CSR)を依頼します。秘密鍵がプロセスの外に出ないため、配布経路の漏洩リスクが下がります。Agent は認証が通ったワークロードにだけ署名済み SVID を返し、有効期限が近づくと自動で新しい SVID を発行し続けます。

信頼の起点(root of trust)を秘密共有から切り離す

SPIRE の妙味は、最初の身元確認に「事前共有された秘密鍵やパスワード」を使わない点です。クラウドが署名したインスタンス識別文書や k8s が発行する短命トークンなど、プラットフォームが既に保証している事実を足がかりにします。秘密を撒かずに信頼を立ち上げられるため、ブートストラップ時の鍵漏洩という古典的な弱点を回避できます。

サービスメッシュ:サイドカーが mTLS を肩代わりする

これらを実務に載せるのがサービスメッシュです。各サービスの隣に サイドカープロキシ(Envoy など)を置き、アプリの代わりにプロキシ同士が mTLS を張ります。アプリは平文でローカルのプロキシと話すだけで、ネットワークを越える区間は自動的に相互認証・暗号化される。

[App A] ──平文──> [Sidecar A] ══ mTLS ══> [Sidecar B] ──平文──> [App B]
                       │                       │
              SVID を受け取る            SVID を検証し
              SPIFFE ID で発信元を提示    SPIFFE ID で認可

この構成の利点は、アプリのコードを一切変えずに相互認証を導入できることです。証明書のローテーションもサイドカーが裏で処理するため、アプリは証明書の存在すら意識しません。さらに認可ポリシーを「SPIFFE ID が payment/checkout のものだけが ledger に接続できる」のように ID ベースで書けるため、IP アドレスの増減に振り回されない、最小権限に沿ったアクセス制御になります。

証明書ローテーションは無停止が前提

短命証明書は更新が頻繁なため、ローテーションは通信を切らずに行う必要があります。実装は、新しい証明書を取得してメモリ上でホットリロードし、既存の接続は古い証明書のまま維持しつつ、新規ハンドシェイクから新証明書を使う方式が一般的です。更新が失敗したまま有効期限を超えると一斉に通信が止まるため、期限のかなり手前(例えば残り寿命の半分)で更新を始める設計が定石です。

mTLS は「位置」でなく「鍵」で信頼する

資格試験では、片側 TLS と mTLS の差を「サーバーだけ vs 双方が証明書を提示」と問われます。本質は CertificateRequest と CertificateVerify の有無であり、後者の署名検証によって秘密鍵の所有が証明される点が要です。ゼロトラスト文脈では「ネットワーク内部だから信頼する」ではなく「正しい鍵を持つ相手だけを信頼する」という原則の通信レイヤ実装が mTLS だ、と押さえます。

まとめ

mTLS は TLS ハンドシェイクに CertificateRequest と双方向の CertificateVerify を加え、両当事者が証明書の正当性と秘密鍵の所有を相互に証明する仕組みです。SPIFFE は身元を spiffe:// の URI(SVID)として標準化し、SPIRE がノード・ワークロード認証を経て短命証明書を自動発行・ローテーションすることで、秘密の事前共有なしに信頼を立ち上げます。サービスメッシュのサイドカーがこれらを肩代わりし、アプリ無改修で「正しい鍵を持つ相手だけと通信する」ゼロトラストを成立させます。

土台となる公開鍵基盤(PKI)X.509 チェーン検証、データを運ぶTLS レコード層、そしてゼロトラスト鍵管理ライフサイクルを併せて読むと、mTLS が「分散システムの相互信頼をどう設計するか」という問いの答えになっていることが原理から見えてきます。

セキュリティ Article

mTLS と相互認証・サービスメッシュの信頼基盤を実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

mTLS

比較で見る軸

難易度: advanced / カテゴリ: セキュリティ / タグ数: 6

導入後に効く点

SPIFFE は信頼境界内の ID を spiffe:// から始まる SVID として表現し、SPIRE がノード・ワークロード認証を経て分単位の短命証明書を自動発行・自動ローテーションする。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
セキュリティ
タグ数
6

判断チェックリスト

  • 自社の用途が「mTLS / SPIFFE」に近いか確認する。
  • 強みである「mTLS は TLS ハンドシェイク中にサーバーが CertificateRequest を送り、クライアントも証明書と CertificateVerify(秘密鍵による署名)を返すことで、双方が公開鍵の所有を相互に証明する仕組み。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

mTLSSPIFFEサービスメッシュゼロトラストPKImTLSSPIFFEサービスメッシュ