証明書のピン留め – Certificate pinning

English -> Visit Promon Web Page


⚠️ 開発者・運用担当者の方へ

「証明書の更新を忘れてアプリが突然動かなくなった」「Frida を使ってあっさりピンニングを突破された」……そんな経験や不安はありませんか?

本記事では単なる用語解説にとどまらず、**「運用で失敗しないための動的ピンニング」「バイパスを許さない RASP 対策」**の実践的なノウハウを解説します。

1. 証明書ピンニングとは?

証明書ピンニング(certificate pinning / SSL pinning)は、HTTPS などの TLS(トランスポート層セキュリティ)プロトコルを介した通信のセキュリティを強化する技術です。選択した TLS 証明書または公開キーを API サーバーに排他的に結び付けることで、アプリケーションは接続するたびにサーバーの ID を確実に確認できます。

サーバーが提示した証明書をアプリ内の事前に決定された「ピン留めされた」証明書と照合することで、中間者(MITM)攻撃を防ぎ、サーバー通信の整合性を確保します。

まとめると: 既知の特定の証明書または公開キーをアプリケーション内に埋め込むことで、サーバーの ID を確実に検証できるため、攻撃者がデータを傍受したり改ざんしたりすることがはるかに困難になります。


2. なぜ証明書ピンニングが必要なのか

MITM 攻撃とは

中間者(MITM)攻撃とは、攻撃者がアプリとサーバーの通信の間に割り込み、データを傍受・改ざんする攻撃です。通常の TLS 通信は証明書を発行する認証局(CA)を信頼する仕組みですが、CA が侵害されたり偽の CA が使われたりした場合は TLS だけでは防ぎきれません。

通常のTLS通信(ピンニングなし):
  アプリ ──── HTTPS ────▶ 攻撃者の偽サーバー
                          (有効なCA証明書を悪用)
                               ↓ 中継・改ざん
                          正規のサーバー

証明書ピンニングあり:
  アプリ ──── HTTPS ────▶ 攻撃者の偽サーバー
              ✅ ピン照合 → ❌ 不一致 → 接続ブロック

証明書ピンニングが特に重要なシーン

  • 公共 Wi-Fi 環境:攻撃者が偽アクセスポイントを設置して通信を傍受
  • 金融・決済アプリ:口座情報や取引データの保護(FISC 安対基準・OWASP MASVS L2 準拠)
  • 企業モバイルアプリ:機密データや認証情報を扱う API への通信
  • エンタープライズアプリ:VPN を使わず社内システムへリモートアクセスする場合

3. 証明書ピンニングの実装方法

ステップ 1:サーバーの証明書または公開キーを取得して保存する

サーバーの公開キーまたは証明書全体を取得し、この情報をアプリに直接埋め込みます。アプリの開発フェーズ中に実行します。

ステップ 2:固定された証明書を検証するようにアプリを変更する

TLS ハンドシェイク中にサーバーが提示した証明書と、アプリ内に保存している固定済み証明書を比較する検証チェックを実装します。一致すれば接続を継続し、不一致なら接続を終了します。

ステップ 3:証明書の更新に備える

証明書には有効期限があります。古い証明書が切れる前に新しい証明書でアプリを更新するか、動的に更新できる仕組みを実装することが不可欠です(詳細は「静的ピンニング vs 動的ピンニング」を参照)。

ステップ 4:徹底的なテスト

証明書の更新シナリオや攻撃シミュレーションも含め、様々な条件でテストを実施します。


4. SSL/TLS・Android・iOS それぞれの実装

▶ 詳細を表示する(Android / iOS の実装例)

SSL 証明書ピンニングと TLS 証明書ピンニングの違い

SSL と TLS はしばしば同義で使われますが、SSL は TLS の前身です。現在の標準は TLS であり、より強力な暗号化アルゴリズムを提供しています。証明書ピンニングも TLS との組み合わせで使われるのが一般的です。

Android 証明書ピンニング

  • Network Security Configurationnetwork-security-config.xml に公開鍵ハッシュ(pin-set)を記述する方法が最もシンプル
  • OkHttp の CertificatePinner:コードレベルでピンニングを実装するサードパーティライブラリ
xml

<network-security-config>
  <domain-config>
    <domain includeSubdomains="true">example.com</domain>
    <pin-set>
      <pin digest="SHA-256">AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</pin>
      
      <pin digest="SHA-256">BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB=</pin>
    </pin-set>
  </domain-config>
</network-security-config>

iOS 証明書ピンニング

  • URLSession デリゲートメソッドdidReceive challenge でサーバー証明書を検証
  • Alamofire:Swift ベースのアプリでピンニングを簡素化するサードパーティライブラリ

iOS 開発者は、期限切れに対処するためにピン留めされた証明書を積極的に管理・更新する必要があります。


5. 静的ピンニング vs 動的ピンニング

これが運用担当者が最も頭を抱えるポイントです。

従来の「静的ピンニング」は証明書情報をアプリコードに直接埋め込む手法です。セキュリティ面では強力ですが、証明書が更新されるたびにアプリを再リリースしなければなりません。更新が間に合わなかった場合、ユーザーがアプリを一切使えなくなるという重大なリスクがあります。

静的ピンニング動的ピンニング(Promon SHIELD)
証明書の更新方法アプリの再ビルド・再リリースが必要バックエンドから動的に配信・更新
証明書期限切れ時アプリが通信不能になるリスクあり自動的に新証明書へ切り替え可能
バイパスへの耐性Frida などの注入攻撃で無効化されやすいRASP と組み合わせてバイパスを検出・防御
OWASP MASVS 準拠L1 相当L2 相当(RASP 併用時)
運用コスト高い(リリース作業が毎回必要)低い

💬 現場の声: 「静的ピンニングを採用していると、証明書の有効期限が近づくたびにアプリのアップデート告知・ストア審査・ユーザーへの強制アップデート依頼に追われます。動的ピンニングなら、管理画面で新しいピンを登録するだけで完了。運用負荷が大幅に下がりました。」


6. 証明書ピンニングは”バイパスされる”(攻撃者視点)

⚠️ 証明書ピンニングは”破られる”という前提で設計しなければなりません。

証明書ピンニングは強力なセキュリティ対策ですが、熟練した攻撃者はバイパスする手段を持っています。特にルート化・脱獄済みデバイスでは、ほとんどのピンニング実装が無効化されます。

主なバイパス手法

① Frida によるダイナミックインスツルメンテーション

Frida は正規のペネトレーションテストツールですが、攻撃者がルート化済みデバイス上でアプリのメモリを操作し、証明書検証ロジックを実行時に無効化するために悪用されます。セキュリティ研究者によるペンテストでも最初に試みられる手法です。

② SSL ストリッピング

HTTPS 接続を HTTP に強制ダウングレードする手法。ピンニング自体をそもそも動作させないよう回避します。

③ プロキシツールを使った偽証明書の提示

Burp Suite や Charles Proxy などを使い、有効に見える偽造証明書を提示します。実装が甘いケースで有効です。

④ リバースエンジニアリング+再パッケージング

アプリをリバースエンジニアリングし、証明書検証コードを書き換えた後、改ざん版として再パッケージして配布する手法。

⑤ Hooking フレームワーク(Xposed / Magisk)

Hooking フレームワークを使って TLS 検証の関数呼び出しを横取りし、常に「検証成功」と返すよう改ざんします。

⑥ ルート化・脱獄済みデバイス

ルート化または脱獄されたデバイスでは OS レベルのセキュリティが無効化されており、ピンニングを含む多くの保護が機能しません。


7. 証明書ピンニングだけでは不十分な理由 → Promon SHIELDによる解決

証明書ピンニングはネットワーク層の防御に特化しており、アプリ自体への攻撃には対応できません。

脅威ピンニングで防げる?必要な追加対策
MITM 攻撃✅ 有効
Frida によるバイパスRASP(ランタイム保護)
ルート化・脱獄端末ルート / 脱獄検出
アプリの改ざん・再パッケージアプリシールド
リバースエンジニアリングコード難読化
Hooking 攻撃Hooking 検出

証明書ピンニングは重要ですが、単体では防げない攻撃が増えています。そこで必要になるのが、アプリ自身が攻撃を検出・防御する RASP(ランタイム保護)です。

Promon SHIELD は最も軽量かつ堅牢に RASP を実現し、証明書ピンニングと組み合わせることで多層防御を構成します。

機能内容
ピンニングバイパス検出Frida などのダイナミックインスツルメンテーションツールをリアルタイムで検出・ブロック
Hooking 検出関数呼び出しの横取りによるカスタムコード注入を防止
ルート化・脱獄検出改変されたデバイスでのアプリ実行を制限
エミュレータ対策悪意ある分析に使われるエミュレータ環境での実行を検出
再パッケージング防止改ざんされたアプリの動作を検出・ブロック
動的ピンニングのサポート証明書情報をバックエンドから安全に更新し、運用コストを削減

証明書ピンニングはセキュリティの「第一歩」。RASP(Promon SHIELD)と組み合わせることで初めて、企業アプリを包括的に守ることができます。

データを安全に暗号化する

証明書ピンニングに加えて API キーなどのデータを暗号化すると、セキュリティの重要なレイヤーが追加されます。Promon Asset Protection はアプリのシールドプロセス中にデータを暗号化し、実行時に必要な場合にのみ復号化することで漏洩リスクを最小化します。

App Attestation による追加防御

Promon App Attestation は API 接続を許可する前にアプリの真正性を検証し、正当なアプリのみが機密リソースにアクセスできるようにします。


お問い合わせ・資料ダウンロード

Promon SHIELD について詳しく見る・お問い合わせはこちら


8. 企業アプリが直面するリスク(日本市場向け)

金融アプリ(FISC・OWASP MASVS 対応)

FISC 安全対策基準(第 10 版)では、モバイルバンキングにおける通信の完全性確保が求められます。証明書ピンニングはその実装手段の一つですが、バイパスリスクが存在するため、OWASP MASVS(モバイルアプリセキュリティ検証標準)の L2 要件を満たすためには RASP との組み合わせが必要です。

公共アプリ(マイナポータル等)

マイナポータルをはじめとする政府・自治体のアプリは機微な個人情報を扱うため、通信セキュリティの要件が高く、ルート化・脱獄端末での動作制限も行われています。

BYOD(個人所有デバイス)環境

企業の BYOD 環境では、従業員が使用する端末のセキュリティ状態を管理できません。MDM では端末管理ができても、アプリレベルのランタイム攻撃は防げません。 証明書ピンニングに加え、アプリ側での RASP 防御が必要です。

エンタープライズアプリ

企業が独自の機密情報にリモートでアクセスするエンタープライズアプリでは、社内ネットワーク上の中間プロキシとの衝突が起きる場合があります。動的ピンニングによる柔軟な運用が推奨されます。


9. 証明書ピンニングと OCSP ステープリングの違い

▶ 詳細を表示する

証明書ピンニングと OCSP(Online Certificate Status Protocol)ステープリングは、どちらも TLS 接続のセキュリティを強化する手段ですが、目的が異なります。

証明書ピンニングOCSP ステープリング
主な目的特定サーバーへの信頼を事前固定して MITM 防止証明書の失効状態をリアルタイムで確認
MITM 攻撃への耐性強い(ピンと一致しない限りブロック)弱い(有効な証明書があれば通過)
証明書失効への対応弱い(失効しても古いピンが残る)強い(失効を即座に検出)
向いているケース特定サーバーとの通信保護証明書失効の迅速な検出

両者は補完関係にあり、組み合わせることでより強固なセキュリティが実現します。


10. 歴史・未来

▶ 詳細を表示する

歴史

証明書ピンニングは、MITM 攻撃の高度化への対応として登場しました。攻撃者が侵害された CA から偽造証明書を取得して TLS の信頼モデルを悪用するケースが増え、アプリケーション側でより厳格な信頼モデルを適用できるようにすることを目的に開発されました。

未来

証明書の透明性(Certificate Transparency) は、すべての CA 発行証明書を公開ログに記録することで不正発行を迅速に検出できる補完的なアプローチとして注目されています。

また Apple・Google とも OS レベルでの TLS 検証を年々強化しており、Android の Network Security Configuration や iOS の ATS(App Transport Security)の要件が厳しくなっています。こうした OS 標準機能と、Promon SHIELD のようなアプリシールドを組み合わせることで、より強固な多層防御が実現します。

11. 出典

  1. https://www.ssl.com/blogs/what-is-certificate-pinning/
  2. https://www.ssldragon.com/blog/certificate-pinning/
  3. https://cheatsheetseries.owasp.org/cheatsheets/Pinning_Cheat_Sheet.html
  4. https://owasp.org/www-community/controls/Certificate_and_Public_Key_Pinning
  5. https://developer.android.com/privacy-and-security/security-config
  6. https://certificate.transparency.dev/
  7. https://promon.io/security-news/mitigating-cyber-threats-strengthen-your-apps-security-beyond-certificate-pinning/

セキュリティソフトウェア用語集

アプリケーション・ハーデニングアプリケーションシールドアプリの改ざん
証明書のピン留めコードの難読化デバイスのクローン作成
フッキングフレームワーク脱獄キーロギング
モバイルアプリのセキュリティルート化リバースエンジニアリング
ランタイム保護ソフトウェア開発キットホワイトボックス暗号化

Promon 関連情報

エキスパートによるアプリセキュリティ | Promon
インターネットで利用される、モバイル、デスクトップアプリのセキュリティを確保します。