【しょうめいしょぴんにんぐ】

証明書ピンニング とは?

💡 「この証明書だけ信頼する」と事前に決めておく
📌 このページのポイント
証明書ピンニング:MITM攻撃を防ぐ ピンニングなし(危険) アプリ 中間者 (MITM) サーバー 偽の証明書を受け入れてしまう ✗ ピンニングあり(安全) アプリ 📌固定 中間者 ブロック サーバー 固定された証明書のみ受け入れ ✓ 証明書ピンニングの仕組み アプリに証明書を 事前に埋め込み📌 接続時に証明書を 比較・照合 🔍 一致 → 通信許可 不一致 → 拒否 🚫 特定の証明書だけを信頼することで、偽の証明書による攻撃を防ぐ
証明書ピンニングのイメージ
ひよこ ひよこ

なんで普通のTLS検証では不十分なの?

ペンギン先生 ペンギン先生

通常のTLS検証はOSやブラウザが持つ認証局リストを信頼する。でもCAが不正に証明書を発行したり、端末にルートCA証明書を追加されたりすると偽の証明書でも検証を通過してしまう。証明書ピンニングは「このサーバーはこの証明書しか使わない」と明示するから、偽CAの証明書を排除できるんだよ

ひよこ ひよこ

どうやって実装するの?

ペンギン先生 ペンギン先生

サーバー証明書の公開鍵のSHA-256ハッシュを計算、②アプリに埋め込む、③TLS接続時にサーバーから受け取った証明書のハッシュとピン留めした値を比較、④一致しなければ接続拒否。iOSならTrustKit、AndroidならOkHttpのCertificatePinnerが使えるよ

ひよこ ひよこ

運用の課題は?

ペンギン先生 ペンギン先生

証明書はLet's Encryptなら90日、商用CAなら1年で更新が必要。ピン留めした証明書が変わるとアプリが通信できなくなる。対策は①バックアップピンを含める(現在の証明書+次の証明書)、②中間CA証明書にピンニングする(エンドエンティティより変更頻度が低い)、③アプリの強制アップデートの仕組みを用意する

ひよこ ひよこ

最近はピンニングしない方がいいの?

ペンギン先生 ペンギン先生

実はAppleがATSでピンニングの代替を推奨し、ChromeもHTTP Public Key Pinning(HPKP)を廃止した。運用ミスで大規模障害を起こした事例が相次いだためだよ。代わりにCertificate Transparency(CT)ログで不正な証明書発行を監視する方向に移行している。金融アプリなど高セキュリティ要件では今でもピンニングは有効だけどね

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「証明書ピンニング」って出てきたら「特定の証明書だけを信頼するセキュリティ対策」と思えればだいたいOK!
📖 おまけ:英語の意味
「Certificate Pinning」 = 証明書の固定
💬 Pin(ピン留め)で証明書を固定する。信頼のアンカーを自分で設定するんだよ
← 用語集にもどる