Certificate Pinning:その概要、証明書バインディングの方法、実装方法

著者: IT Sectr 公開日: 2026-04-02 読了時間: 8 分

Certificate Pinningとは、モバイルアプリケーションがサーバーの証明書が事前に既知のサンプルと一致することを検証するセキュリティ技術であり、CAチェーンの任意の証明書を単に信頼するわけではありません。数百の認証局に依存する通常のTLS検証とは異なり、ピンニングは信頼を1つの特定の証明書またはその公開鍵に絞り込みます。OWASPモバイルセキュリティテストガイド(2024)によると、Certificate Pinningの実装により、証明書のすり替えを伴うMan-in-the-Middle攻撃シナリオの100%をブロックできます。 OWASP MSTG, 2024

重要ポイント

  • Certificate Pinningは、アプリを特定のサーバー証明書または公開鍵にハードバインディングする技術です。
  • Public Key Pinningは最も柔軟で安全な方法であり、証明書変更時にアプリのアップデートは不要です。
  • TLSとの違い — 通常のTLSは任意のCAを信頼しますが、ピンニングは特定の証明書に対して第二の検証レベルを追加します。
  • ブロッキングリスク — 証明書が誤って更新されると、新しいバージョンがリリースされるまでアプリはサーバーとの接続を失う可能性があります。
  • OkHttpとTrustKitは、それぞれAndroidとiOSでピンニングを実装するための最も人気のあるライブラリです。

Certificate Pinningとは?

Certificate Pinningは、アプリケーションがサーバーの証明書のサンプルを保存(または“ピン”)し、接続のたびに受信した証明書をこのサンプルと比較するセキュリティメカニズムです。証明書が一致しない場合 — たとえ信頼できる認証局によって正式に署名されていても — 接続は終了します。これにより、攻撃者が侵害されたCAを介して偽の証明書を入手する攻撃(2011年のDigiNotarや2011年のComodoで発生したように)から保護します。

証明書バインディングの仕組み

ピンニングプロセスは3つの段階で構成されます:信頼できるインスタンスから証明書または公開鍵のフィンガープリントを抽出する;このフィンガープリントをアプリケーションコードまたはリソースに保存する;TLSハンドシェイク中に比較する。開発者は証明書全体のSHA-256フィンガープリント、または公開鍵のみ(Public Key Pinning)をピンできます。第二のアプローチが推奨されます:証明書が更新されても公開鍵は多くの場合同じままであり、アプリはサーバーとの接続を失いません。OWASPの推奨によると、最小ピン数は2です:現在のもの1つと、キーローテーション用のバックアップ1つです。OkHttpやTrustKitのような最新のライブラリは、開発者の追加作業なしに、各TLS接続時に指定されたピンの検証プロセスを自動化します。ピンニングは標準のTLS検証を置き換えるのではなく、補完することを理解することが重要です:最初に証明書チェーンの検証を伴う通常のハンドシェイクが実行され、次に追加のピンニングチェックが行われます。この2レベルの保護は、誤った証明書発行や認証局インフラへの攻撃を含む、CA侵害に関連する脆弱性を排除します。

Certificate Pinningの種類

Certificate Pinningを実装するにはいくつかのアプローチがあり、それぞれに独自の保存および検証特性があります。方法の選択は、アプリケーションアーキテクチャ、証明書の更新頻度、および柔軟性の要件によって異なります。

ピンニングの種類保存されるもの柔軟性使用例
Certificate Pinning完全なX.509証明書低い1–2年の固定証明書
Public Key Pinning公開鍵(SPKI)中程度OWASP推奨アプローチ
Hash PinningSHA-256フィンガープリント中程度OkHttpで人気(certificatePinner)
CA Pinning中間CA高いエンタープライズアプリケーション

最もバランスの取れた方法はPublic Key Pinningであり、OWASPとGoogleによって推奨されています。特定の証明書(1–2年ごとに変更される)の代わりに、アプリケーションはSubjectPublicKeyInfoフィンガープリント — 公開鍵の抽象化 — を保存します。同じ鍵で証明書が更新された場合(鍵の再利用)、ピンは有効なままです。鍵が変更された場合 — 開発者は事前にアプリケーションアップデートにバックアップピンを追加します。モバイルプロジェクトでは、最小/最大ピン戦略が使用されます:バックアップを含む最小2ピン、そして肥大化と検証時間の増加を防ぐための最大4ピンです。

ピンニングタイプの選択戦略

特定のピンニングタイプの選択は、アプリケーションのアーキテクチャと要件によって異なります。単一ドメインを介してREST APIで動作するパブリックモバイルアプリケーションには、OkHttpまたはTrustKitを介した2つのピンによるPublic Key Pinningが最適です。独自の認証局を持つエンタープライズアプリケーションには、CA Pinningが適しています — クライアント証明書が変更されてもアップデートは不要で、信頼は最終証明書ではなくCAに結び付けられているためです。IoTおよび組み込みシステムには、完全な証明書ピンニングによるCertificate Pinningが推奨されます:デバイスはめったに更新されないため、信頼チェーン全体の制御が重要です。ピンの有効期限の監視は必須のプラクティスです:現在の証明書が無効になる前に新しいピンでアプリケーションアップデートをリリースするために、証明書の期限切れの30日、14日、7日前にアラートを設定します。新しいピンでのアップデートリリースを自動化するには、Firebase Remote Configまたはアプリストアに新しいバージョンを公開せずにピンリストを動的に更新できるカスタム設定APIを使用することをお勧めします。

Certificate Pinningの利点と欠点

Certificate Pinningはモバイルアプリケーションのセキュリティを大幅に向上させますが、開発チームに運用上の負担をかけます。不適切な実装による接続ブロックのリスクとセキュリティ上の利点を比較検討することが重要です。

主な利点は、CA侵害のケースを含むMan-in-the-Middle攻撃からの保護です。ピンニングは、攻撃者によって発行された偽の証明書を無効にします:CAが偽造品に署名したとしても、アプリケーションはそれを拒否します。追加の利点は、トラフィック検査のために証明書を置き換える企業プロキシサーバーからの保護です。Google Security Blog(2023)によると、標準的なTLS検証のみを使用するアプリケーションと比較して、ピンニングを使用するアプリケーションはトラフィック傍受による侵害の可能性が86%低くなります。

ピンニングの主な欠点は自己ブロックのリスクです:アプリケーションアップデートがリリースされる前にサーバー証明書が変更された場合(更新、プロバイダー変更、鍵ローテーション)、ユーザーはサーバーにアクセスできなくなります。追加の欠点:デバッグの複雑さ(設定変更のたびにピンの更新が必要)、TrustKit使用時のAPKサイズの5–15 KB増加、および新しいリリースなしでの迅速な変更ロールバックの不可能性。リスクを最小限に抑えるために、バックアップピン、2–3か月ごとの自動ローテーション、およびアプリケーションが古い証明書と新しい証明書の両方を受け入れる猶予期間が使用されます。また、ピンニングを有効にした開発中は、プロキシツール(Burp Suite、Charles)を使用してネットワークリクエストをデバッグできないことを考慮することも重要です — 開発ビルドでは、BuildConfig.DEBUGフラグを介してピンニングを無効にする必要があり、QAテストは保護を有効にしたリリース署名で実行する必要があります。一部のチームは、開発中でも保護を維持するために、開発環境用に別のピンニング証明書を持つステージングドメインを使用しています。

AndroidでのCertificate Pinningの実装

OkHttp — ネットワークリクエストの標準ライブラリ — を使用したAndroidでのCertificate Pinning実装の例を見てみましょう。OkHttpは、公開鍵のSHA-256ハッシュを受け入れる組み込みのCertificatePinnerを提供します。

kotlin
val certificatePinner = CertificatePinner.Builder()
    .add(
        "api.example.com",
        "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
    )
    .add(
        "api.example.com",
        "sha256/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB="
    )
    .build()

val client = OkHttpClient.Builder()
    .certificatePinner(certificatePinner)
    .build()

上記のコードでは、ドメインapi.example.comに2つのピンを追加します:プライマリ(現在の証明書)とバックアップピン(ローテーション用)です。OkHttpは自動的にサーバーの証明書が指定されたSHA-256フィンガープリントのいずれかに一致することを検証します。証明書のSHA-256フィンガープリントを取得するには、コマンドを使用します:openssl s_client -connect api.example.com:443 | openssl x509 -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64。フィンガープリントはコード内にプレーンテキストとしてではなく、暗号化または難読化して保存することが重要です:MobSFの静的解析はDEXファイル内の生のSHA-256文字列を簡単に見つけます。ピンはres/rawリソースにAESで暗号化して保存し、ネイティブコード(NDK/JNI)を介してアプリケーション起動時に復号化することをお勧めします。

TrustKitによるiOS実装

iOSでは、Certificate Pinningの主要ツールはオープンソースのTrustKitライブラリです。OkHttpとは異なり、TrustKitはInfo.plistを介して宣言的に設定され、アプリケーションを再コンパイルせずにピンを変更できます。設定には、ドメインを持つディクショナリとSHA-256公開鍵フィンガープリントの配列が含まれます。TrustKitは自動的にNSURLSessionリクエストをインターセプトし、データ送信が始まる前に証明書を検証します。TrustKitの重要な機能はピン検証レポートのサポートです:ライブラリはピンの不一致が発生したときに指定されたエンドポイントにレポートを送信でき、証明書の異常に迅速に対応できます。AppleもiOS 14以降、Info.plistにネイティブのNSPinnedDomainsメカニズムを提供していますが、TrustKitはより柔軟な設定、レポートサポート、OSアップデートなしでのピンのホットスワップ機能により、引き続き好ましい選択肢です。TrustKitはdidReceiveChallengeデリゲートを介してURLSessionと統合し、ピン検証成功時に.performDefaultHandling、不一致時に.cancelAuthenticationChallengeを返すことに注意することが重要です。ピン検証レポートの監視には、エラー頻度を分析する別のエンドポイントを設定することをお勧めします:レポート数が急増した場合 — これはMitM攻撃または証明書の期限切れが差し迫っており、即時のピン更新が必要であることを示している可能性があります。

よくある質問

Certificate Pinningを簡単に説明すると?

Certificate Pinningは、電話に友達の指紋を保存するようなものです:“正しい”サーバー証明書がどのようなものかを覚えておき、たとえ誰かが“公式の”機関からの身分証明書を見せても、他の誰も信頼しません。

Certificate Pinningは通常のHTTPSとどう違うのですか?

通常のHTTPSは、数百の認証局の中の任意のCAによって署名された任意の証明書を信頼します。Certificate Pinningは追加のチェックを追加します:証明書は単に有効であるだけでなく、アプリケーションコードにハードコードした特定のものでなければなりません。

Pinning使用時に証明書を更新するには?

2–3のピンを保存することをお勧めします:現在のものと新しい証明書用のバックアップピンです。証明書変更の1–2か月前に、将来の証明書のピンを追加したアプリケーションの新バージョンをリリースします。変更後、古いピンは次のリリースで削除されます。

無料のCAでCertificate Pinningを使用できますか?

はい、使用できます。ピンニングはLet’s Encryptを含む任意の証明書で機能します。無料の証明書は有効期間が短い(3か月)ことを覚えておくことが重要であり、そのためバックアップピン戦略と自動ローテーションが必須になります。

アプリケーションでCertificate Pinningをテストするには?

ピンニングのテストにはBurp Suiteまたはmitmproxyを使用します。ピンニングを使用するアプリケーションが正しく設定されている場合、プロキシツールはトラフィックをインターセプトできません — ハンドシェイク段階で接続が終了します。統合テストには、OkHttpのMockWebServerを使用します。

まとめ

  • Certificate Pinningは、Man-in-the-Middle攻撃やCAのすり替えから保護する証明書バインディング技術です。
  • Public Key Pinningは、証明書全体ではなく公開鍵のフィンガープリントに基づく、OWASP推奨の方法です。
  • OkHttp CertificatePinner(Android)とTrustKit(iOS)は、モバイルプロジェクトでピンニングを実装するための主要ツールです。
  • 2+ピン戦略は、サーバー証明書変更時のアプリケーションブロッキングを防ぎます。
  • SHA-256ピンニングには、サーバーの公開鍵フィンガープリントを生成するためのopensslコマンドが必要です。
  • 猶予期間 — 有効期限が重複するバックアップピンを使用することで、接続喪失のリスクをゼロに減らします。
  • 推奨事項:バックアップピンを使用してすべての本番ドメインに公開鍵ピンニングを実装し、接続断の監視を設定してください。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください