Keystore:その概要、形式、そして仕組み

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

Keystoreは、Android開発において秘密鍵やアプリ署名証明書を保存するための安全な暗号化ストレージです。Android Developers Documentation(2026年)によると、すべてのAPKまたはApp BundleはGoogle Playに公開する前にKeystoreからのデジタル署名で署名する必要があります。Keystoreの形式、作成方法、プロジェクトでの使用方法を解説します。

重要なポイント

  • Keystore — Androidアプリの署名に使用する秘密鍵と証明書を保存するコンテナ
  • JKS(Java KeyStore)— Javaエコシステムに限定されたレガシー形式
  • PKCS12 — Googleが新しいプロジェクトに推奨する標準化された形式
  • Keytool — コマンドラインからKeystoreを作成・管理するJDKユーティリティ
  • Keystoreの喪失はGoogle Playでのアプリ更新不能を意味します — バックアップは必須です

Keystoreとは

Keystore(KeyStore)は、暗号鍵、証明書、信頼できるエントリを保存するためのJava Cryptography Architecture(JCA)の標準メカニズムです。Android開発では、公開前にアプリに署名する秘密鍵を保存するためにKeystoreが使用されます。署名は、アプリが指定された開発者によって実際に公開されたこと、および公開後にそのコードが変更されていないことを保証します。アプリの更新はすべて同じ鍵で署名する必要があり、そうしないとGoogle PlayはAPKまたはApp Bundleを拒否します。

Keystoreには複数のエントリ(エイリアス)を含めることができ、それぞれが証明書付きの鍵ペア(秘密鍵と公開鍵)を表します。エイリアスは、署名時にアプリが鍵にアクセスするための一意のエントリ名です。一般的なAndroidプロジェクトでは、Keystoreにはリリース版に署名するための1つのエントリと、デバッグビルドに署名するための追加のエントリを含めることができます。Google Play Consoleは、アップロードされた各アプリのSHA-1およびSHA-256証明書フィンガープリントを表示します。

Android Studioには、Build → Generate Signed Bundle / APKメニューからKeystoreの組み込みサポートが含まれています。Android Studioの署名ウィザードでは、新しいKeystoreを作成するか既存のものを選択し、エイリアス、Keystoreと鍵のパスワード、および証明書データ(組織名、市区町村、国)を指定できます。このデータは証明書に埋め込まれ、APK署名の検証時にユーザーに表示されます。Google Playでは、証明書の有効期間が少なくとも25年であることが必要です。Androidはアプリのインストール時に有効期限を確認します。

AndroidにとってKeystoreが重要な理由

Google Playでのアプリの更新は、最初のバージョンに署名したものと同じ鍵でのみ可能です。Keystoreを紛失すると、更新を公開できなくなります — アプリは別のパッケージ名で再公開する必要があります。Google Play Console Help(2026年)によると、アプリ署名鍵はGoogle Play App Signing(鍵をGoogle側で保管するサービス)を通じてのみ回復できます。開発者がこのオプションを使用した場合、ローカルのKeystoreを紛失しても重大ではありません。

Keystoreの仕組み

Androidアプリの署名プロセスには、APKコンテンツのダイジェスト(ハッシュ)を作成し、Keystoreの秘密鍵で暗号化することが含まれます。Android SDK Build Toolsには、APK Signature Scheme v2(またはAndroid 9+の場合はv3)を使用して署名を実行するapksignerユーティリティが含まれています。アプリのインストール時に、Androidは署名を検証します。証明書の公開鍵で署名を復号化し、APKハッシュをオリジナルと比較します — ハッシュが一致しない場合、インストールは拒否されます。

Androidは複数の署名スキームをサポートしています:v1(JAR署名)、v2(APK Signature Scheme)、v3(鍵ローテーション対応のAPK Signature Scheme)、v4(Android 11+のインクリメンタルインストール)です。Google Playでは、新しいアプリにv2またはv3が必要です。apksignerは、鍵が対応するアルゴリズムをサポートしている場合、署名時に必要なすべてのスキームを自動的に追加します。Android 11+はv4署名によるADBインストールをサポートしており、デバイスへの大規模なAPKのインクリメンタルロードを高速化します。

アルゴリズム:Androidは署名鍵にRSA-2048またはECDSA P-256の使用を推奨しています。証明書はX.509 v3である必要があります。Androidはインストール時に証明書が有効であることを確認します。期限切れの場合はインストールがブロックされます。そのため、Googleは証明書の有効期間を少なくとも25年に設定することを推奨しています。Google Play App Signingは2つの鍵を使用します:アプリ署名鍵(app signing key)とアップロード鍵(upload key)です — 開発者はアップロード鍵を使用してConsoleにAPKをアップロードし、Googleはメイン鍵でユーザー向けにアプリに署名します。

Keystoreの形式:JKSとPKCS12

Javaは2つの主要なKeystore形式をサポートしています:JKS(Java KeyStore) — JDK 1.2から存在するOracleのプロプライエタリ形式、およびPKCS12 — RSA Laboratoriesによる標準化されたPublic-Key Cryptography Standards #12形式です。JKSは独自のデータストレージ形式を使用し、Javaエコシステム内でのみサポートされています。PKCS12は、Java、.NET、OpenSSL、Python(cryptography)、およびその他のほとんどの暗号化ライブラリでサポートされているオープンスタンダードです。

Google Playは、2021年以降に作成された新しいKeystoreにはPKCS12を推奨形式としています。JDK 9以降は、デフォルトでPKCS12形式でKeystoreを作成します(以前はJKSがデフォルトでした)。PKCS12の主な利点は互換性です。.p12ファイルはJavaに依存しない任意の環境で開くことができます。OpenSSLはPKCS12から証明書を抽出し、PEM形式に変換できます。JKSファイルは読み取りにJDKユーティリティが必要であり、OpenSSLでは処理できません。

形式間の変換は、JDKのkeytoolユーティリティを使用して行います。JKSからPKCS12に移行する場合は、すべてのエイリアスとパスワードが正しく転送されていることを確認してください。keytool -importkeystoreコマンドを使用すると、形式に関係なく、あるKeystoreの内容を別のKeystoreにインポートできます。変換後は、鍵のバージョンの混乱を避けるために、古いJKSファイルを削除することをお勧めします。Android Studioは、署名付きビルドを生成する際に両方の形式をサポートしています。

特性JKSPKCS12
標準プロプライエタリ(Oracle)オープン(RSA Labs)
拡張子.jks / .keystore.p12 / .pfx
サポートJavaのみJava、OpenSSL、.NET、Python
デフォルトJDK 8までJDK 9+
Googleの推奨レガシー推奨

keytoolでKeystoreを作成する

keytoolユーティリティはJDK(Java Development Kit)の一部であり、Keystoreを作成、表示、管理するための完全なコマンドセットを提供します。1つの鍵ペアで新しいKeystoreを作成するには、PKCS12形式、RSAアルゴリズム、鍵サイズ、証明書の有効期間を指定してkeytool -genkeypairコマンドを使用します。Google Playでは、証明書の有効期間が少なくとも25年(9125日)必要です — この値は-validityパラメータで指定することをお勧めします。

新しいKeystoreの作成

Androidプロジェクト用のPKCS12形式でのKeystore生成例。-dnameパラメータには証明書のX.500 Distinguished Nameが含まれます。-extパラメータは、必要に応じてSubject Alternative Nameを含めます — Androidの場合はBasic Constraintsで十分です:

bash
# Android用PKCS12 Keystoreの作成
keytool -genkeypair -alias "upload_key" \
  -keyalg RSA -keysize 2048 -validity 9125 \
  -keystore "release-keystore.p12" \
  -storetype PKCS12 \
  -dname "CN=Developer,O=Company,C=RU"

KeytoolはKeystoreパスワードと鍵パスワードを要求します(一致させることができます)。-storetype PKCS12パラメータは、最新形式でファイルを作成します。-keysize 2048は、Googleの最小RSA鍵サイズ要件を満たします。-validity 9125(25年)は、アプリケーションの予想される全ライフサイクルにわたって互換性を保証します。Keystoreを作成したら、keytool -list -v -keystore release-keystore.p12コマンドで内容を確認することをお勧めします。

Keystoreの内容を表示する

Keystoreのエントリを確認するには、-listフラグを付けたコマンドを使用します。出力には、エイリアス、作成日と有効期限、エントリの種類、SHA-256フィンガープリントが含まれます。Android Studioは、既存のKeystoreを選択する際にGenerate Signed Bundle / APKダイアログで同じ情報を表示します:

bash
# Keystoreエントリの表示
keytool -list -v -keystore "release-keystore.p12" \
  -storetype PKCS12

CI/CDでのKeystoreの使用

CI/CDパイプラインでは、Keystoreを安全に保管し、危険にさらすことなくビルドエージェントに渡す必要があります。GitHub Actionsは、バイナリファイルをbase64形式で保存するためのSecretsを提供します。Keystoreはbase64コマンドでエンコードされ、結果の文字列はリポジトリシークレットに保存され、ビルド段階でファイルにデコードされます。GitLab CIは、FileタイプのVariablesを通じて同様のメカニズムを使用します。

GitHub ActionsでKeystoreを使用したCIビルドの設定例には、シークレットからのKeystoreのデコード、Gradleプロパティの設定、署名付きビルドの実行が含まれます。GradleのAndroidプラグインは、keystore.propertiesファイル(ローカル開発用に.gitignoreから除外)またはCIシステムの環境変数からKeystoreのパスとパスワードを読み取ります:

groovy
// build.gradle(app)— 署名設定
@Override
android {
    signingConfigs {
        release {
            storeFile file("release-keystore.p12")
            storePassword System.getenv("STORE_PASSWORD")
            keyAlias System.getenv("KEY_ALIAS")
            keyPassword System.getenv("KEY_PASSWORD")
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
}

GradleはCIシステムによって設定された環境変数を読み取ります。Keystoreファイルは、storeFileで指定されたように、アプリケーションモジュールのルートに配置する必要があります。セキュリティのため、リポジトリにパスワードを保存しないでください — CIシステムのSecretsを使用してください。Android用のFastlaneは、Google Play Consoleと連携するsupplyプラグインを提供しますが、APKの署名にはエージェント上のローカルKeystoreが依然として必要です。

代替案はGoogle Play App Signingです。このオプションを使用すると、開発者はアップロード鍵(upload key)のみをGoogle Playにアップロードし、Googleは独自の鍵で最終的なAPKに署名します。この場合、Keystoreはアップロード鍵の作成にのみ使用され、紛失しても更新は妨げられません — 新しいアップロード鍵を生成してConsoleに登録できます。Google Play App Signingは、2021年8月以降の新しいアプリケーションに必須です。

Keystoreのセキュリティとバックアップ

Keystoreの紛失は、Android開発において最も重要な問題の1つです。バックアップなしでは、既存のアプリケーションのアップデートをリリースできません — Google Playは異なる鍵で署名されたAPKを拒否します。Keystoreのバックアップコピーは、異なる物理ストレージまたはクラウドストレージに少なくとも2つ保管することをお勧めします:例えば、チームのクラウドストレージに暗号化されたファイルと、組織の金庫に物理メディアを保管します。Keystoreと鍵のパスワードは、ファイルとは別に、例えばアクセス制御付きのパスワードマネージャーに保管します。

Android Studioは、Generate Signed Bundle / APKダイアログで新しいKeystoreを作成する際に、将来のビルド用にパスを記憶するオプションを提供します。ただし、開発環境自体はバックアップを作成しません — これは開発者の責任です。チーム開発では、安全なチャネルを介してすべてのチームメンバーにアップロード鍵を渡すGoogle Play App Signingの使用をお勧めします。Gradleは、生成されたdebug.keystoreを使用して自動的にデバッグビルドに署名できます。これはバックアップを必要とせず、すべてのAndroid Studioインストールで同じです。

転送時のKeystoreのセキュリティ:.p12または.jksファイルは、暗号化されたチャネル(SFTP、HTTPS、暗号化されたメール添付ファイル)を介してのみ転送する必要があります。Keystoreをソースコードリポジトリに含めないでください — プライベートリポジトリであってもです。GitGuardianGitHub secret scanningは自動的に資格情報の公開を検出しますが、リポジトリにKeystoreを保存することは依然としてセキュリティ違反です。CI/CDでは、インフラストラクチャレベルの暗号化とともに、プラットフォームのシークレットメカニズム(GitHub Actions Secrets、GitLab CI Variables、Jenkins Credentials)を使用してください。

よくある質問

アプリ公開後にKeystoreを紛失した場合はどうなりますか?

Google Play App Signingを使用している場合、アップロード鍵のみが失われます — 新しい鍵を生成してGoogle Play Consoleに登録できます。App Signingが有効でない場合、Keystoreの紛失はアプリを更新できないことを意味します — 別のパッケージ名で新しいアプリを公開する必要があります。

1つのKeystoreを複数のアプリケーションに使用できますか?

はい、1つのKeystoreには、異なるアプリケーション用の異なる鍵を持つ複数のエイリアス(エントリ)を含めることができます。1つのKeystore内で、アプリケーションごとに個別のエイリアスを使用することをお勧めします。Google Playは異なるアプリケーションに異なる鍵をサポートしています — 1つのKeystoreを複数のプロジェクトで使用することに制限はありません。

RSAとECDSAのどちらの署名アルゴリズムが優れていますか?

Androidは両方のアルゴリズムをサポートしていますが、ECDSA P-256が推奨されます:RSA-2048と同等のセキュリティを、より小さな署名サイズと高速な検証で提供します。ただし、Android 4.4以下との互換性が必要な場合は、RSAを選択してください — ECDSAはAndroid 4.3+でのみサポートされています。

Google Playが25年以上の有効期間の証明書を必要とするのはなぜですか?

Androidはアプリのインストール時に証明書の有効期間を確認します。証明書の期限が切れている場合、既存アプリの更新であってもインストールはブロックされます。25年は、新しい証明書を発行することなくモバイルアプリケーションの予想される全ライフサイクルをカバーするためにGoogleが推奨する最小期間です。

debug.keystoreとリリース用Keystoreの違いは何ですか?

Debug.keystoreはAndroid SDKによって自動的に作成され、デバッグビルドの署名に使用されます。これはすべてのAndroid Studioインストールで同じです(標準パスワード:android)。リリース用Keystoreは、Google Playに公開するバージョンに署名するために開発者が作成し、安全に保管する必要があります — 紛失は重大です。

まとめ

  • KeystoreはAndroidアプリケーション署名用の秘密鍵を保存する暗号化ストレージです
  • JKSはレガシー形式であり、PKCS12はGoogleが推奨する最新の標準です
  • KeytoolはコマンドラインからKeystoreを作成・管理するJDKユーティリティです
  • 証明書の有効期間はGoogle Playでは少なくとも25年(9125日)必要です
  • CI/CDではbase64エンコードを使用してプラットフォームのSecretsにKeystoreを保存する必要があります
  • Google Play App Signingは鍵をGoogle側で保管することで鍵紛失のリスクを軽減します
  • Keystoreのバックアップは必須です — 鍵を失うとアプリの更新がブロックされます

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

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

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

こちらもお読みください