Hello there, ('ω')ノ
✅ SSLピンニングとは?
🔐 まず、SSL/TLS通信の基本
通常、アプリとサーバー間の通信は HTTPS(SSL/TLS) で暗号化されています。 通信の際、アプリはサーバーのSSL証明書を検証します。
アプリ → サーバーに接続 → サーバーの証明書を確認 → 信頼できるCAか?
⚠️ それでも起きる中間者攻撃(MITM)
攻撃者がWi-Fiアクセスポイントを乗っ取ったり、端末に独自のCA証明書をインストールしていれば、偽サーバーに接続させることができます。
🛡 そこで「SSLピンニング」
SSLピンニングとは、特定の証明書や公開鍵をアプリ側にあらかじめ埋め込んでおき、それと一致しないサーバーは信用しないという仕組みです。
アプリ → サーバーの証明書を比較 → あらかじめ埋め込んだものと違う → 通信拒否!
✔ 実装例(Java / OkHttp)
CertificatePinner pinner = new CertificatePinner.Builder() .add("example.com", "sha256/XXXXXXXXXXXXXXXXXXXXXX") .build(); OkHttpClient client = new OkHttpClient.Builder() .certificatePinner(pinner) .build();
✅ 診断時の影響
- SSLピンニングがあると、Burp Suiteなどのプロキシツールで通信を傍受できない
- 通信内容を診断したい場合は、Fridaなどでバイパス処理が必要
- 逆にいえば、未実装だと通信の盗聴や改ざんが可能になるリスクが高い
✅ コード署名とは?
この続きはcodocで購入