メインコンテンツにスキップ

署名検証: 2026年のアプリケーションアップデートのセキュリティ

Learn how signature verification protects Capacitor and Electron app updates, covering cryptographic principles and CI/CD integration.

署名検証: 2026年のアプリケーションアップデートのセキュリティ

アップデートパイプラインは緑色です。エッジでバンドルが利用可能で、デバイスはそれをチェックしています。すると、誰かが生成されたJavaScriptの不審な変更を発見します。テストが終了した後、ビルドランナーが妨害された、開発者資格が盗まれた、またはアーティファクトが変更された可能性があります。テストが終了した後、リリースに不正なペイロードが含まれる可能性があります。署名検証がなければ 署名検証、チームが作成したバンドルと、攻撃者がトランザクション中または配信層で変更したバンドルを区別する方法がないため、クライアントには信頼できる方法がない。

署名付きの更新では、この決定が変わる。デバイスは、現在実行中の code を置き換える前に、信頼された公開鍵を使用してバンドルを検証する。署名が一致しない場合、更新は非活性のままになる。そう思えるかもしれないが、生産的な障害は通常、暗号化にではなく、その中には起きる。チームは鍵の回転を追跡できなく、誤ったアーティファクトに署名する、または未検証のキャッシュファイルを適用する、または更新を拒否したデバイスの数を説明するのに十分なテレメトリを収集できない。

以下のセクションでは、信頼モデルと検証フローからCI/CD制御、インシデント対応、署名自体で解決しない制限まで、実際のエッジを扱う。

目次

シグネチャ検証が大規模なアップデートを防ぐ理由

人気のあるCapacitorプラグインのCI/CDパイプラインはリリースプロセスの後半で乗っ取られます。攻撃者はライブアップデートパッケージを変更し、codeを追加し、データを読み取るアプリケーションを追加し、パイプラインの通常の配信パスを使用してアーティファクトを公開します。デバイスは不明なダウンロードドメインを認識しません。デバイスは、インストールを待つ有効なアップデートを認識します。

検証がクライアント側の暗号化チェックがない場合、アプリはアップデートポリシーが許可するときに、変更されたパッケージをダウンロードして実行します。可能な破壊範囲には、データ漏洩、資格情報の盗用、支払いフローの変更、ビジネスロジックの静的な操作が含まれます。調査も痛みが伴います。エンジニアは、どのアーティファクトが配信されたか、どのチャネルが受信したか、どのデバイスがダウンロードしたか、どのデバイスが適用したか、そしてリリースが取り消された前に、悪質なcodeが実行されたかを判断する必要があります。

ソフトウェアアップデート配信パイプラインで悪質なcodeのインジェクションをブロックする図

A signature verification が有効になっているチームは、異なる失敗モードを取得します。アプリは同じ汚染されたバンドルをダウンロードし、期待されるダイジェストを計算し、信頼されたキーと比較する署名を検証します。暗号化チェックが失敗し、アップデーターはバンドルを有効化しないとし、セキュリティチームにイベントが到達する前に、新しい code が実行される前に。

生産ルール: 更新を敵対的と扱うまで、デバイスが両方のアイデンティティと精確なバイトを検証するまで。

保護は、検証者がデバイス上で実行され、抽出または有効化前に、信頼されたキーが更新自体によって置き換えられない場合にのみ機能します。そのため、証明書とキー管理はアップデート設計の一部であり、管理上の詳細ではありません。Capacitor を使用するチームは、この境界を含む証明書管理プロセスと共にドキュメントする必要があります。 包括的な証明書管理プロセス、署名者が誰であるか、キーがどこに保存されているか、クライアントが承認された後継キーについて学ぶ方法などを含む。

近年、署名検証は、20年以上にわたって測定可能な工学分野として研究されています。1977年に最初に公開されたオフラインおよびオンライン署名検証の研究は、後続の研究でHMMとFFTを含むさまざまな方法が拡大されました。広く引用された比較では、専門家は約 0.5% の誤認と 7% の誤認を達成したと報告されました。一般人では、6.5% の誤認と 26% の誤認を達成しました。これは、署名検証の歴史的概要の概要としてまとめられています。 0.5% false acceptance and 7% false rejection, while laypeople reached 6.5% false acceptance and 26% false rejection, as summarized in this historical overview of signature verification researchハンド書きの署名に関連する数字は、ソフトウェアのアップデートとは関係ありませんが、有用な点を強調しています:検証の品質は検証者、検証元データ、決定ポリシーに依存します。

暗号署名による信頼の構築

リリースバンドルを想像してください。ビルドシステムは、正確なバイトのハッシュ値を計算し、 秘密鍵 を使用して、そのハッシュ値にデジタル署名を付与します。アプリケーションは、対応する 公開鍵を含む、または安全に受信します。この公開鍵は、封筒の知られている紋章のように機能します。攻撃者がバンドルの小さな部分を変更すると、アプリケーションは異なるハッシュ値を計算し、署名が検証されないことを意味します。

開発者が署名を作成し、モバイルアプリケーションが検証する暗号署名プロセスの図示。

このフローには、4 つの異なる部分があります:

  1. ハッシュ化 バンドルを固定長のハッシュ値に変換します。SHA-256とSHA-512は、この整合性ステップの一般的な選択肢です。
  2. 鍵生成 非対称鍵 pairを作成します。 私鍵は署名を行い、公開鍵は署名の検証を行います。
  3. 署名 ダイジェストをリリースメタデータにバインドし、バージョン、チャネル、プラットフォーム、対象者を含めて理想的には。
  4. 検証 ダウンロードされたバイトからダイジェストを再計算し、信頼されたプライベートキーによって生成された署名が検証されます。

アップデータは、署名を同じペイロードにバインドする必要があります。 マニフェストの署名だけでは、後でバンドルをダウンロードする際に、メニフェストのハッシュがバンドルのハッシュと一致することを確認しないと、十分ではありません。 また、バンドルのハッシュを検証するだけでは、ハッシュ自体が認証されていない限り、誰が承認したかを確実に知ることはできません。

モバイル配信のためのアルゴリズムの選択

RSAは馴染みのあるもので広くサポートされていますが、通常は大きいキー材料と注意深いパディングの選択が必要です。 新しいモバイルアップデートプロトコルでは、Ed25519はしばしば魅力的な選択肢です。 キーと署名はコンパクトであり、モバイルプロセッサ上の検証パスも効率的です。 RSA-PSSは、互換性の要件がRSAを必要とする場合に適切な選択肢でもあります。 選択は、プラットフォームの暗号ライブラリ、サポートされているハードウェア、相互運用性の要件、移行計画に従うべきであり、別の環境からコピーしたベンチマークではありません。

非対称鍵署名の理解のための独立した導入としては、このガイドをご覧ください。 ブロックチェーンの署名の理解トランザクションのコンテキストは、OTA配信とは異なりますが、プライベートキー認証とパブリックキー検証の説明は直接転用できます。

信頼チェーンと固定鍵

A certificate chain delegates trust from a root through intermediate authorities to a leaf certificate. That model can simplify broad PKI operations, but an app update client often has a narrower requirement: trust only the publisher key that authorized this update. Embedding a public key, or a small set of authorized keys, directly in the app binary is a form of pinning. It reduces dependence on external certificate authorities, but it creates a rotation problem because the binary must already trust the replacement key.

署名されたエンベロープを完全に保存してください。 ご自身のリリースメタデータは、アイテム、ダイジェスト、目的のチャネル、および鍵識別子を識別する必要があります。 これを Capacitor に組み込むチームは、集中した Capacitor アプリ用のトークン署名チェックリストを使用できます。 __CAPGO_KEEP_0__ アプリ用のトークン署名チェックリストを使用できます。

モバイルとWebシステムにおける実用例

署名検証はモバイル製品のいくつかの層に現れ、各層は異なる質問に答えます。 アプリストアの署名は、オペレーティングシステムがインストール可能なパッケージが承認されたパブリッシャーから来ているかどうかを判断するのに役立ちます。署名されたOTAバンドルは、JavaScriptとアセットのペイロードがご自身のアップデーターが信頼するリリース権限者から来ているかどうかを判断するのに役立ちます。 JWT署名は、API が期待どおりのアイデンティティサービスから発行されたトークンであることを検証するのに役立ちます。

層を混同することはギャップを生み出す。有効なIPA署名は、後続のウェブバンドを自動的に認証することはない。有効なJWTは、更新パッケージが安全であることを証明するものではない。TLS接続は輸送を保護するが、CDN、プロキシ、キャッシュ、またはビルドシステムが改ざんの元となる場合、アーティファクト署名を置き換えるものではない。

コンテキスト 署名機構 失敗モード防止 一般的なギャップ
アプリストアパッケージ プラットフォームcode署名とプラットフォームレビュー制御 再署名または未承認のインストール可能パッケージ チームはストア署名がポストインストールのウェブアセットをカバーすることを想定している
ウェブバンドとサービスワーカー 署名済みエクスチェンジまたはSRIスタイルの整合性参照 毒性CDNの応答または変更されたアセット エントリーファイルのみがチェックされ、インポートされたアセットは未検証のまま
API トークン 信頼された公開鍵でJWT署名が検証され、JWKSエンドポイントから取得されることが多い 偽造または改ざんされたトークン サーバーは署名を検証するが、発行者、受信者、有効期限、またはトークンの目的を無視する
オーバー・ザ・エア更新 デタッチドまたは埋め込まれたバンドル署名がデバイス上で検証される マニン・ザ・ミドルウェアまたは改ざんされた更新インジェクション クライアントはコンテンツをダウンロード、キャッシュ、または展開する前に決定を強制する

ウェブアセットの場合、サブリソースの整合性は参照されたリソースを受け入れるブラウザに制限するが、ダイナミックインポート、サービスワーカーキャッシュ、または更新マニフェストが攻撃者が選択したファイルに指すことは自動的に解決しない。実装は、実行されるバイトを含む完全なアーティファクトセットを定義し、検証する必要がある。

JWTのデプロイは異なる方法で失敗する。エンジニアは正しい公開鍵を公開するが、誤った発行者または受信者を持つトークンを受け入れるか、トークンヘッダからアルゴリズムの選択を信頼することが多い。暗号化された署名は有効であるが、認可決定はまだ間違っている。

運用上のコンテキストも、頻繁なリリースと顧客向けモバイルエクスペリエンスに依存する製品の評価に影響する 2026年の小売アプリエンゲージメント戦略 アップデートの整合性を迅速な実験の前提条件として扱うべきである。迅速なロールアウトは、リリースチャネル、アーティファクト、受信者がすべて同じ認可決定に結びついている場合にのみ有効である。

完全な検証フローの構築

生産用のアップデーターは、検証をゲートとして行うべきであり、インストールの近くで実行されるコールバックではありません。安全なシーケンスは決定論的です:

  1. 認証されたトランスポート上でマニフェストと署名を取得する。
  2. マニフェスト構造、バージョンポリシー、チャネル、有効期限、そしてアーティファクトの識別性を検証する。
  3. マニフェストによって指定された正確なバンドルをダウンロードする。
  4. ローカルでバンドルのダイジェストを計算する。
  5. 信頼できるEd25519またはRSA-PSS公開鍵に対して署名を検証する。
  6. 検証されたアーティファクトを隔離された場所に保存する。
  7. 原子的に適用し、ロールバックパスを保持する。

ソフトウェアアップデートバンドルの取得、署名検証、検証プロセスの4ステップのダイアグラム

署名検証の重要性

署名検証の重要性

type UpdateManifest = {
  version: string
  channel: string
  platform: string
  sha256: string
  signature: string
  keyId: string
}

async function verifyBundle(
  bundle: Uint8Array,
  manifest: UpdateManifest,
  trustedKeys: Map<string, Uint8Array>
): Promise<boolean> {
  const publicKey = trustedKeys.get(manifest.keyId)
  if (!publicKey) return false

  const digest = await sha256(bundle)
  if (!constantTimeEqual(digest, hexToBytes(manifest.sha256))) {
    return false
  }

  try {
    return await ed25519Verify(
      base64ToBytes(manifest.signature),
      digest,
      publicKey
    )
  } catch {
    return false
  }
}

署名検証の重要性

署名検証の重要性

Download into a temporary path. Close and flush the file, verify its complete contents, then rename it into a versioned verified store. The activation step should reference only that verified path. In Capacitor and Electron environments, avoid letting an asynchronous download completion event trigger activation independently of the verification promise. A single update state machine should own transitions such as downloading, verified, pending, active, rejected署名検証の重要性 rolled_back.

比較が敏感なバイトシーケンスを比較する場合、定数時間の比較は適切です。特に、攻撃者が繰り返し検証行動を観察できる場合です。実際には、前の試行でバージョンを利用可能としてマークした場合、バンドルを受け入れるショートカットを公開しないでください。利用可能性と正当性は別々の状態です。

Capacitor のアップデートの整合性チェック は、ハッシュ検証とアクティベーションロジックを区別する実装の参考になります。失敗分枝を意図的にテストし、短縮されたファイル、不正な署名、未知のキー、古いマニフェスト、重複バージョン、プロセス終了時のアクティベーションを含めます。

自動署名検証の研究は、他の分野でも閾値と参照データの重要性を示しています。1994年のオンライン研究では、 22 の特性を選択し、 10を報告し、 99.5% 正当な署名の正しい分類 86% を Euclidean 距離法で、 の出版された統計的方法研究によれば、偽造署名を拒否しました。ソフトウェアアップデートの検証は決定論的ではなく、生物学的ではありませんが、教訓は依然として関連しています: 決定境界を厳密に定義してください。

Key Management Challenges Most Teams Underestimate

最初の署名キーは簡単です。2 番目のキーは、設計が試される場所です。

チームはキーパリスを生成し、パブリックキーをアプリに配置し、最初のバンドルを 1 日で署名できます。数か月後、エンジニアがラップトップにアクセスし、CI シークレットがビルドログに印刷されたり、署名ジョブが 1 つのランナーから別のランナーに移動する必要がある場合、「キーを回転するだけ」は、チェックインしないデバイスを捨てることを意味する場合があります。

複雑な、継続的な生産現実と比較するグラフィック。

最初のリリース前に設計に注目すべき 3 つの問題があります。

  • ローテーションなしの死角: 後継キーを必要とする前に、信頼できるキーに信頼を与えるようにアプリを運営してください。既存の信頼されたキーが次のキーを承認できる署名されたキートランジションレコードが必要です。アプリは定義されたマイグレーションウィンドウ内で古いキーを受け入れることができます。
  • 無保証の削除: アプリ内にピン留めされたキーは、OCSP または CRL スタイルの削除を自動的に提供しません。クライアントには署名された拒否リスト、最低許容するキー バージョン、またはサーバーが制御するポリシーが必要です。このポリシーは、ネットワークが利用できない場合でも安全です。
  • 制限付き署名アクセス: CIランナーのは、シグネチャー作成のリクエストを、または再利用可能なプライベートキーを受け取るのではなく、セキュアな環境変数としてではなく、セキュアなストレージまたはHSMから行うべきです。ログはコマンド出力を暗号化し、信頼できないブランチからプルリクエストは生産環境のシグネチャー認証情報に到達してはなりません。

実際の運用状況: キー更新は、更新メカニズムが安全に信頼性の変更を提供できない場合、コンプロミットされたキーから適切に回復できない問題です。

キー階層は、破壊半径を減らします。根権限の権限はリリースキーを承認し、開発、ステージング、生産チャンネルの別々のキーで署名します。Threshold署名は、敏感な生産リリースに複数の承認されたパーティが必要になり、1つの盗まれた認証情報が有効な更新を作成するのを防ぐのに役立ちます。これらの制御は、プロセスと遅延を追加するので、チームは更新の影響とチャンネルの感受性に応じて適用する必要があります。

最初の信頼の基準は、モバイル更新の場合に特に弱いです。最初のキーが、パッケージと同じチャンネルで到達した場合、攻撃者がそのチャンネルを制御している場合、両方を置き換えることができます。初期の信頼アナーカーは、初期アプリバイナリ、プラットフォーム保護された構成、または独立して認証されたパスで到達する必要があります。

Capacitorのチームにとっては、Capgoの文書化されたアプローチは、公開鍵ピンニングとキー更新のサポートを含みます。 セキュアなOTA更新のためのキー管理ガイド 生産サイクルにおけるキー生成を一時的なセットアップとして扱うのではなく、実用的なリファレンスとして、生産サイクルにおけるそのライフサイクルを計画するための実践的なガイドを提供します。

CI/CDと監視統合のための検証統合

リリーストランザクション内に署名を含める。パイプラインは、最初にバンドルを公開し、その後別の手動ステップで署名を追加することはしない。不可変アーティファクトを構築し、そのハッシュ値を計算し、正確なバイトを署名し、クリーンな検証ステップで署名を検証し、最後にバンドルとメタデータを一つのリリースユニットとして公開する。

実用的なパイプラインは次のアーティファクトを生成する。

  • 不可変バンドル: クライアントがダウンロードするファイルであり、CDNが再パッケージするディレクトリではない。
  • マニフェスト: バージョン、チャネル、プラットフォーム、ハッシュ値、キーID、ロールアウトポリシー。
  • 分離された署名: canonicalマニフェストデータまたは厳密に定義されたハッシュ表現に対する署名。
  • 検証結果: 署名が環境の公開キーと検証されるかどうかの機械読み取り可能なチェック。

GitHub ActionsとGitLab CIは、シンタックスが異なるにもかかわらず、同じパターンを強制できる。署名ジョブは、プライベート署名サービスが利用できない場合、署名が不正である場合、または新しくダウンロードしたテストコピーが検証されない場合に失敗するようにする。デプロイジョブは、その結果に依存する必要がある。ただし、ビルドが成功しただけでは依存する必要はない。

パスを署名せずに、後でジョブがそのパスを変更しないようにする。署名後、パブリッシュする前にアーティファクトのダイジェストを比較し、リリースレコードからパブリッシュされたマニフェストを再現できるようにする。この方法は、CIジョブが圧縮アーカイブを署名し、配信層が再圧縮または再生成されたファイルを提供するという、意外と一般的な統合ギャップを捕捉する。

デバイス上で可視性を実現する

署名ジョブが成功した場合、パイプラインが有効な署名を生成したことを証明するだけである。デバイスが意図したバイトを受信したこと、またはアプリが意図したキーを使用したことを証明するものではない。アプリバージョン、更新バージョン、チャネル、プラットフォーム、キーID、結果カテゴリ、プライバシーサフティなリリース関連IDとともに、検証結果を記録する。バンドル、トークン、プライベートメタデータ、ユーザーコンテンツをログに記録しないようにする。

便利なダッシュボードは次のとおりである。

  • 署名失敗とダウンロード失敗を区別する。
  • ダイジェスト不一致と不正なマニフェストを区別する。
  • 未知のキーとポリシー拒否を区別する。
  • アプリバージョン、リージョン、チャネル、リリースの年齢に基づいて失敗を区別する。

突然のダイジェスト不一致の集団は、汚染されたキャッシュ、変更された配信パス、またはアーティファクトのパブリッシュエラーを示唆する。未知のキーイベントは、不完全なローテーションまたは未承認のリリース試行を示唆する。検証テレメトリは、単独では攻撃者を特定できないが、タイムラインと調査対象の人口を提供する。

The Capacitor OTA更新のためのCI/CDセキュリティガイド チームは、署名、検証、デプロイゲートを1つのワークフロー内に配置するのに役立ちます。重要な設計上の選択肢は、所有権です。セキュリティは、検証が実行されたかどうかをエンジニアに尋ねる必要はありません。リリースレコードとクライアントのテレメトリは、その答えを直接提供する必要があります。

セキュリティのベストプラクティスと一般的な落とし穴

Signature verification should be a hard requirement for every update path that can execute code. The updater must verify before extraction, installation, or activation, and it must fail closed when the signature, digest, key, or policy check is unavailable.

このチェックリストを即時で使用してください。

  • プライベートキーを保護する 署名材料をHSMまたはマネージドバウツに保持し、ソースコントロールにコミットしないようにし、モバイルバイナリに含めないようにし、CIログに許可しないようにします。
  • 信頼できる公開キーを固定する 初期の信頼アナーカーをアップデートペイロード外に保存します。複数のキーをサポートする場合、その目的と移行ルールを定義します。
  • リリースを完全に結合する 特定のバンドル、チャネル、プラットフォーム、意図されたポリシーを識別するためのcanonicalメタデータを署名します。
  • すべての検証エラーを拒否する タイムアウト、不正な署名、不明なキー、または欠落したマニフェストは、前の未検証の結果を続行するための招待状ではありません。
  • テストの妥当性回復: ステージングでキーのローテーション、削除されたキーの処理、ロールバック、中断されたダウンロード、および古いデバイスを実行します。
  • 検証者変更のレビュー: 暗号化ライブラリ、canonicalization、パース、フォールバック動作、およびデバッグ構成のセキュリティに焦点を当てたcodeレビューを必要とします。
  • デバッグ動作を分離する: デフォルトのフラグまたは環境ミスによって、開発者バイパスがプロダクションビルドにパッケージ化されることが不可能になります。

署名も新鮮さ、受信者への結び付け、再送信抵抗、またはプロバイダーの現在の状態と互換性のあるペイロードが残っていることを証明しないので、Webhook セキュリティ ガイドラインでは明確に区別しています。最近の脆弱性報告では、不正確または null の署名とcanonicality の問題は、狭い検証チェックを乗り越えることができます。Webhook セキュリティのギャップ分析を読んで、周辺の承認ルールを設計する際に。

閾値の選択は、生物学的システムに関連する教訓を生み出します。102 人の個人の 1,232 の署名から 62 のパラメトリック特性を使用した研究では 1,232 の署名から 62 のパラメトリック特性を使用した研究では 102 人の個人の 102 人の個人の署名から 102 人の個人の署名 2.8% の誤認定1.6% の誤認定, 1 つの方法では 2.68% の誤認定1.99% の誤認定, 以下に記載されているように 閾値選択の研究. そのアプリケーションは異なりますが、操作原理は同じです: 検証者の決定ポリシーは、暗号化アルゴリズムよりも重要です。

Capgo は、Capacitor と Electron チームが署名されたライブアップデートパッケージ、オンデバイス検証、ロールアウト制御、ロールバック保護、配信観察性を同じシステムで提供する必要がある場合の 1 つの実装オプションとして機能できます。Visit Capgo アップデートフローがあなたのキーマネジメント、CI/CD、監視要件に適合するかどうかを評価するには。

Capacitor アプリの即時更新

When a web-layer bug is live, ship the fix through Capgo instead of waiting days for app store approval. Users get the update in the background while native changes stay in the normal review path.

ウェブ層のバグが生じたときは、__CAPGO_KEEP_0__ を通して修正を配信するのではなく、数日間待ってアプリストアの承認を待つのではなく、ユーザーはバックグラウンドで更新を受け取り、ネイティブの変更は通常のレビューのパスを通る。

コンテキスト:Capgoのマーケティングウェブサイト。役割:サポートする説明文またはメタ説明文。見つける場所:コンポーネント GetStarted.astro。Capgoの製品/ブランド名と開発者用語をそのままにする。メッセージキー `instant_updates_for_capacitor_apps_description` (Capacitor アプリの即時更新の説明)。

マーティンから人間のサポート

Capgo gives you the best insights you need to create a truly professional mobile app.