通常のHTTPSでは、サーバーのみが証明書でIDを証明します。クライアント(ブラウザ)は匿名です — サーバーは誰が接続しているかわかりません。
**相互TLS(mTLS)**は2番目のステップを追加します:クライアントも証明書を提示します。両側が互いを認証します。サーバーは信頼された認証局に対してクライアントの証明書を検証し、クライアントはサーバーの証明書を検証します — したがって「相互」です。
通常のTLS vs 相互TLS
| 通常のTLS | 相互TLS(mTLS) | |
|---|---|---|
| サーバーがIDを証明 | ✅ 証明書 + CA署名 | ✅ 同じ |
| クライアントがIDを証明 | ❌ 匿名 | ✅ クライアント証明書 |
| 認証 | 一方向(サーバーのみ) | 双方向(両方) |
| ユースケース | 公開Webサイト | 内部API、ゼロトラスト |
| クライアントに必要なもの | ブラウザだけ | 証明書 + 秘密鍵 |
| セットアップの複雑さ | 標準 | 高い — クライアント証明書の管理が必要 |
mTLSを使用すべき場面
サービス間通信
ネットワーク上で互いに通信するマイクロサービス。mTLSは認可されたサービスのみが接続できることを保証します — URLを知っているだけの誰でもではなく。
Service A ←──mTLS──→ Service B
両方が検証: 「あなたは主張通りの人ですか?」
ゼロトラストアーキテクチャ
ゼロトラストでは、ネットワーク接続はデフォルトで信頼されません — 企業ネットワーク内部でも。mTLSはネットワークレベルの信頼(ファイアウォール、VPN)をIDレベルの信頼(証明書)に置き換えます。
APIセキュリティ
APIキーだけでなく、機密APIを保護します。盗まれたAPIキーは誰でも使用できます。クライアント証明書は特定の秘密鍵にバインドされています — 盗んで使用するのがより困難です。
IoTデバイス認証
製造時にプロビジョニングされたクライアント証明書でデバイスがバックエンドに接続します。サーバーは本物のデバイスと通信していることを知り、偽装されたものではないと確認できます。
mTLSの仕組み
- クライアントが接続し、TLSハンドシェイクを開始(通常のTLSと同じ)
- サーバーが証明書を送信 — クライアントが検証(通常のTLSと同じ)
- サーバーがクライアント証明書を要求 —
CertificateRequestメッセージを送信 - クライアントが証明書を送信 — サーバーが信頼された認証局に対して検証
- 両側がセッション鍵を計算し、暗号化通信が開始
ステップ3〜4が「相互」にしている部分です。
NginxのmTLS設定
server {
listen 443 ssl;
server_name api.example.com;
# Server certificate (same as regular HTTPS)
ssl_certificate /etc/ssl/server-fullchain.pem;
ssl_certificate_key /etc/ssl/server-privkey.pem;
# Client certificate verification
ssl_client_certificate /etc/ssl/client-ca.pem; # CA that signed client certs
ssl_verify_client on; # Require client cert
# Optional: pass client cert info to your app
proxy_set_header X-Client-DN $ssl_client_s_dn;
proxy_set_header X-Client-Verify $ssl_client_verify;
}
mTLS vs 他の認証方法
| 方法 | セキュリティレベル | 複雑さ | 最適な用途 |
|---|---|---|---|
| APIキー | 低い(共有可能) | 低い | 公開API、レート制限 |
| OAuth/JWT | 中程度 | 中程度 | ユーザー向けAPI |
| mTLS | 高い(暗号バインド) | 高い | サービス間通信、ゼロトラスト |
| mTLS + JWT | 最高 | 高い | トランスポートとアプリケーション両方の認証 |
mTLSとGetHTTPS
GetHTTPSはサーバー証明書を発行します — WebサーバーがIDを証明するために使用する証明書です。これはすべてのHTTPS Webサイトが使用する標準的なSSL証明書です。
mTLS用のクライアント証明書は通常、Let’s Encryptのような公開認証局ではなく、プライベートCA(組織の内部認証局)によって発行されます。Let’s Encryptはクライアント証明書を発行しません — 公開ドメイン用のサーバー証明書のみを発行します。
よくある質問
mTLSにLet’s Encryptを使えますか?
サーバー証明書には:はい。クライアント証明書には:いいえ。クライアント証明書は、あなたが管理するプライベートCAによって発行される必要があります — どのクライアントが認可されるかを決定するためです。openssl、cfssl、step-caなどのツールがプライベートCAとして機能できます。
mTLSは「クライアント証明書認証」と同じですか?
はい。「相互TLS」「mTLS」「双方向TLS」「クライアント証明書認証」はすべて同じことを指します — TLSハンドシェイク中に両側が証明書を提示することです。
mTLSはAPIキーを置き換えますか?
可能ですが、異なる目的を果たします。mTLSはトランスポートレベルのID(どのサービスが接続しているか)を証明します。APIキー/JWTはアプリケーションレベルのID(どのユーザー/権限か)を証明します。多くのシステムは多層防御のために両方を併用しています。
mTLSはどこで一般的に使われていますか?
Kubernetes(IstioやLinkerdによるサービスメッシュ)、Cloudflare Access、AWS API Gateway(相互TLS)、Google CloudのBeyondCorp、ほとんどのエンタープライズゼロトラスト実装で使用されています。