アプリへの署名

Android では、APK をデバイスにインストールしたり更新したりする前に、証明書を使用してすべての APK にデジタル署名する必要があります。Android App Bundle を使用する場合は、Play Console にアップロードする前に App Bundle のみに署名する必要があり、それ以外は Google Play アプリ署名によって処理されます。ただし、Google Play やその他のアプリストアにアップロードするアプリには手動で署名することも可能です。

このページでは、アプリ署名とセキュリティに関する重要な概念、Google Play でリリースするアプリに Android Studio で署名する方法、Google Play アプリ署名にオプトインする方法について説明します。

以下に、新しいアプリに署名して Google Play に公開するために必要な手順の概要を示します。

  1. アップロード鍵とキーストアを生成する
  2. アップロード鍵でアプリに署名する
  3. Google Play アプリ署名にオプトインする
  4. アプリを Google Play にアップロードする
  5. アプリのリリースを準備して公開する

アプリが既存のアプリ署名鍵を使用してすでに Google Play ストアに公開されている場合、または、新しいアプリ用のアプリ署名鍵を Google に生成させる代わりに自分で選択する場合は、次の手順を行います。

  1. アプリの署名鍵を使用してアプリに署名し、その署名鍵を暗号化してエクスポートするオプションを選択する
  2. アプリの署名鍵をアップロードして、Google Play アプリ署名にオプトインする
  3. (推奨)アプリの将来のアップデートに備えて、アップロード証明書を生成して登録する
  4. アプリを Google Play にアップロードする
  5. アプリのリリースを準備して公開する

このページでは、アプリを Google Play 以外のアプリストアにアップロードする際に使用する自分専用の鍵を管理する方法についても説明します。Android Studio を使用しない場合、またはコマンドラインからアプリに署名する場合は、apksigner の使用方法を確認してください。

Google Play アプリ署名

Google Play アプリ署名を使用すると、アプリ署名鍵の管理と保護、APK 配信時の署名を Google に委託することができます。App Bundle では、APK のビルドおよび署名が Google Play ストアで行われるため、App Bundle をアップロードする前に Google Play アプリ署名にオプトインする必要があります。Google Play アプリ署名にオプトインすると、以下のようなメリットが得られます。

  • Android App Bundle を使用し、Google Play の Dynamic Delivery をサポートできます。Android App Bundle ではアプリのサイズを減らし、リリースを簡略化できるだけでなく、動的な機能と Instant 機能を利用できます。
  • 署名鍵のセキュリティを強化できます。また、署名鍵とは別のアップロード鍵を使用して、Google Play にアップロードする App Bundle に署名できます。

Google Play アプリ署名では、アプリ署名鍵とアップロード鍵を使用します。これらの鍵について詳しくは、鍵とキーストアについてのセクションをご覧ください。アップロード鍵は自分で保管し、Google Play ストアにアプリをアップロードする際にこれを使用して署名します。アプリ証明書鍵とは別のアップロード鍵を使用することで、鍵の紛失や不正使用があった場合にアップロード鍵のリセットをリクエストできます。Google Play アプリ署名にオプトインしていない場合、アプリの署名鍵を紛失するとアプリを更新できなくなります。

アプリを公開する準備が整ったら、Android Studio を使用してアプリに署名し、Google Play にアップロードできます。アプリへの署名に使用する鍵がアプリのアップロード鍵になります。図 1 に示すように、Google はアップロード証明書を使用して本人確認を行い、アプリ署名鍵で APK に署名してユーザーに配信します。

アプリ署名鍵をまだ生成していない場合は、サインアップ プロセス中に生成できます。

図 1. Google Play アプリ署名を使用したアプリへの署名

鍵は、Google が自社の鍵の保管に使用しているものと同じインフラストラクチャに保管され、Google の鍵管理サービスによって保護されます。Google の技術インフラストラクチャについて詳しくは、Google Cloud Security のホワイトペーパーをご覧ください。

Google Play アプリ署名を使用しているときにアップロード鍵を失くしたり、鍵が不正使用されたりした場合は、Google に連絡して古いアップロード鍵を取り消し、新しい鍵を生成してください。アプリ署名鍵は Google によって保護されているため、アップロード鍵を変更した場合でも、新しいバージョンのアプリを元のアプリのアップデートとして引き続きアップロードできます。詳しくは、紛失または不正使用があった非公開のアップロード鍵をリセットするをご覧ください。

次のセクションでは、アプリ署名とセキュリティに関連する重要な用語と概念について説明します。Google Play ストアにアップロードするアプリを準備する方法については、アプリに署名してリリースするをご覧ください。

鍵、証明書、キーストア

アプリへの署名に関しては、下記の概念と定義を理解することが重要です。

証明書

公開鍵証明書.der または .pem ファイル)は、デジタル証明書や ID 証明書と呼ばれることもあります。公開鍵証明書には、公開鍵 / 秘密鍵ペアの公開鍵と、それに対応する秘密鍵の所有者を識別するためのメタデータ(名前、所在地など)が格納されています。

アプリに署名する際、署名ツールによってアプリに証明書が添付され、この証明書によって APK や App Bundle が対応する秘密鍵に関連付けられます。この仕組みにより、Android ではアプリ公開後のすべてのアップデートが元の作成者によるものかどうかを確認しています。この証明書の作成に使用する鍵は、アプリ署名鍵と呼ばれます。

API プロバイダに鍵を登録するために、Play Console の [アプリの署名] ページからアプリ署名鍵とアップロード鍵の証明書をダウンロードできます。証明書は誰とでも共有できます。証明書に秘密鍵は含まれていません。

ユーザーがアプリのアップデートとして新しいバージョンをインストールできるようにするには、各アプリで全期間を通じて同じ証明書を使用する必要があります。アプリの全期間を通じてすべてのアプリで同じ証明書を使用するメリットについては、以下の署名に関する考慮事項をご覧ください。

証明書フィンガープリント: 証明書を表す一意の短い値の情報です。API プロバイダは、自身のサービスを利用するアプリを登録するためにパッケージ名と合わせて証明書フィンガープリントをリクエストすることがよくあります。アップロード鍵とアプリ署名鍵の証明書の MD5、SHA-1、SHA-256 の各フィンガープリントは、Play Console の [アプリの署名] ページで確認できます。他のフィンガープリントは、同じページから元の証明書(.der)をダウンロードして計算することもできます。

以下に、理解しておく必要がある各種の鍵とキーストアを示します。

  • アプリ署名鍵: ユーザーのデバイスにインストールされる APK の署名に使用される鍵です。Android の安全な更新モデルの一部である署名鍵は、アプリの全期間にわたって変更されることがありません。アプリ署名鍵は非公開にする必要があります。ただし、アプリ署名鍵を使用して生成した証明書を共有することは可能です。
  • アップロード鍵: Google Play アプリ署名用にアップロードする前に、App Bundle または APK への署名に使用する鍵。アップロード鍵は非公開にする必要があります。ただし、アップロード鍵を使用して生成した証明書を共有することは可能です。アップロード鍵は次のいずれかの方法で生成できます。

    • オプトインするときに Google がアプリ署名鍵を生成するように選択した場合、リリースするアプリへの署名に使用する鍵はアップロード鍵として指定されます。
    • 新規または既存のアプリをオプトインするときに Google にアプリ署名鍵を提供する場合、新しいアップロード鍵の生成は、アプリをオプトインするときとオプトインした後のどちらでも行うことができます。これにより、セキュリティを強化できます。
    • 新しいアップロード鍵を生成しない場合は、自分専用のアプリ署名鍵をアップロード鍵として各リリースへの署名に引き続き使用できます。

    ヒント: 鍵のセキュリティを維持するために、アプリ署名鍵とアップロード鍵にそれぞれ別の鍵を使用することをおすすめします。

  • Java Keystore(.jks または .keystore): 証明書と秘密鍵のリポジトリとして機能するバイナリ ファイル。

  • Play Encrypt Private Key(PEPK)ツール: Java Keystore から秘密鍵をエクスポートして暗号化し、Google Play に転送するために使用します。Google が使用するアプリ署名鍵を提供する際に、[Java Keystore から鍵をエクスポートしてアップロードする] を選択し、指示に沿ってこのツールをダウンロードして使用します。または、[鍵をエクスポートしてアップロードする(Java KeyStore は使用しない)] を選択して PEPK ツールのオープンソース コードをダウンロードし、確認した後に使用します。

デバッグビルドに署名する

IDE からプロジェクトを実行またはデバッグすると、Android Studio は、Android SDK ツールで生成されたデバッグ証明書を使用して自動的にアプリに署名します。Android Studio で初めてプロジェクトを実行またはデバッグするときに、IDE がデバッグ キーストアとデバッグ証明書を $HOME/.android/debug.keystore に自動的に作成し、キーストアと鍵のパスワードを設定します。

デバッグ証明書はビルドツールで作成され、設計上安全性は確保されていないため、ほとんどのアプリストア(Google Play ストアを含む)はデバッグ証明書で署名されたアプリの公開を受け入れません。

Android Studio はデバッグ用署名情報を署名の設定に自動的に保存するため、デバッグのたびに入力する必要はありません。署名の設定は、キーストアの場所、キーストアのパスワード、鍵の名前、鍵のパスワードなど、アプリへの署名に必要なすべての情報で構成されたオブジェクトです。デバッグ用署名の設定を直接編集することはできませんが、リリースビルドに署名する方法を設定することはできます。

デバッグ用のアプリのビルドおよび実行方法について詳しくは、アプリをビルドして実行するをご覧ください。

デバッグ証明書の有効期限

デバッグ用のアプリに署名するために使用する自己署名証明書には、作成日から 30 年の有効期限があります。証明書の期限が切れるとビルドエラーになります。

この問題を修正するには、以下のいずれかの場所に保存されている debug.keystore ファイルを削除します。

  • ~/.android/(OS X および Linux)
  • C:\Documents and Settings\user\.android\(Windows XP)
  • C:\Users\user\.android\(Windows Vista および Windows 7、8、10)

デバッグ バージョンのアプリを次にビルドして実行するときに、Android Studio が新しいキーストアとデバッグ鍵を再生成します。

アプリに署名して Google Play でリリースする

アプリを公開する準備が整ったら、アプリに署名して Google Play などのアプリストアにアップロードする必要があります。アプリを Google Play に公開する場合は、Google Play アプリ署名にオプトインする必要もあります。このセクションでは、アプリに適切に署名してリリースする方法と、Google Play アプリ署名にオプトインする方法について説明します。

アップロード鍵とキーストアを生成する

Google Play アプリ署名にオプトインする際に便利なアップロード鍵をまだ生成していない場合は、次のように Android Studio を使用して生成することができます。

  1. メニューバーで、[Build] > [Build] > [Generate Signed Bundle/APK] をクリックします。
  2. [Generate Signed Bundle or APK] ダイアログで、[Android App Bundle] または [APK] を選択し、[Next] をクリックします。
  3. [Key store path] のフィールドの下で、[Create new] をクリックします。
  4. 図 2 のように、[New Key Store] ウィンドウでキーストアと鍵の情報を指定します。

    図 2. Android Studio で新しいアップロード鍵とキーストアを作成します。

  5. キーストア

    • Key store path: キーストアを作成する場所を選択します。
    • Password: キーストアの安全なパスワードを作成し、確認します。
    • Alias: 鍵を識別する名前を入力します。
    • Password: 鍵の安全なパスワードを作成し、確認します。キーストアのパスワードとは異なるパスワードにする必要があります。
    • Validity (years): 鍵の有効期間を年単位で設定します。鍵は少なくとも 25 年間は有効であるため、アプリの全期間を通じて同じ鍵を使用してアプリのアップデートに署名できます。
    • Certificate: 証明書の所有者に関する情報を入力します。この情報はアプリには表示されませんが、APK の一部として証明書に含まれます。
  6. フォームの入力が完了したら、[OK] をクリックします。

  7. アップロード鍵でアプリをビルドして署名する場合は、アップロード鍵でアプリに署名する方法についてのセクションにお進みください。鍵とキーストアのみを生成する場合は、[Cancel] をクリックします。

鍵を使ってアプリに署名する

アップロード鍵がすでにある場合は、その鍵を使ってアプリに署名します。一方、アプリが既存のアプリ署名鍵を使用してすでに署名され、Google Play ストアに公開されている場合は、その鍵を使ってアプリに署名します。また、アプリ署名鍵を暗号化してエクスポートし、Google Play アプリ署名にアプリをオプトインしてください。その後のアプリのアップデートへの署名とアップロードのために、後で別のアップロード鍵を生成し、Google Play にアップロード鍵の公開鍵証明書を登録することができます。

Android Studio を使用してアプリに署名し、既存のアプリ署名鍵をエクスポートする手順は次のとおりです。

  1. [Generate Signed Bundle or APK] ダイアログを開いていない場合は、[Build] > [Generate Signed Bundle/APK] をクリックします。
  2. [Generate Signed Bundle or APK] ダイアログで、[Android App Bundle] または [APK] を選択し、[Next] をクリックします。
  3. プルダウンでモジュールを選択します。
  4. キーストアへのパスと鍵のエイリアスを指定し、両方のパスワードを入力します。キーストアとアップロード鍵をまだ準備していない場合は、アップロード鍵とキーストアを生成してから、このステップに戻って操作を完了します。

    図 3. アップロード鍵でアプリに署名します。

  5. 既存のアプリ署名鍵で App Bundle に署名し、後でアプリを Google Play アプリ署名にオプトインする場合は、[Export encrypted key] チェックボックスをオンにして、暗号化された *.pepk ファイルとして署名鍵を保存するパスを指定します。これで、暗号化されたアプリ署名鍵を使用して、既存のアプリを Google Play アプリ署名にオプトインできます。

  6. [Next] をクリックします。

  7. 次のウィンドウ(図 4)で、署名済みアプリの保存先フォルダを指定し、ビルドタイプを選択後、該当する場合はプロダクト フレーバーを選択します。

  8. APK をビルドして署名する場合は、アプリでサポートする [Signature Versions] を選択する必要があります。詳しくは、APK Signature Scheme v2 をご覧ください。

  9. [Finish] をクリックします。

    図 4. 選択したプロダクト フレーバーでアプリの署名済みバージョンを生成します。

図 5. ポップアップのリンクをクリックすると、App Bundle の分析または検索、エクスポートされた署名鍵の検索を行うことができます。

Android Studio で署名済みアプリのビルドが終了した後、ポップアップ通知の適切なオプションをクリックして、アプリを検索または分析することができます。署名鍵をエクスポートするオプションを選択した場合は、図 5 のように、ポップアップの右下隅にあるプルダウン矢印をクリックしてその鍵を展開し、[Show Exported Key File] をクリックすることで、その署名鍵の場所に即座に移動できます。

これで、アプリを Google Play アプリ署名にオプトインし、アプリをアップロードしてリリースできるようになりました。アプリの公開プロセスを初めて行う場合は、リリースの概要をご覧ください。初めてでない場合は、Play Console にアプリをアップロードする方法についてのページにお進みください。

Google Play アプリ署名にオプトインする

このページですでに説明したように、Google Play で配信するアプリへの署名には Google Play アプリ署名を使用することをおすすめします。アプリのオプトインに必要な手順は、アプリがまだ Google Play に公開されていない場合と、既存のアプリ署名鍵を使用してアプリがすでに署名および公開されている場合とで異なります。

新しいアプリをオプトインする

まだ Google Play に公開されていないアプリをオプトインする手順は次のとおりです。

  1. アップロード鍵を生成し、それを使用してアプリに署名します(まだ行っていない場合)。
  2. Play Console にログインします。
  3. 手順に沿ってリリースを準備して公開し、新しいリリースを作成します。
  4. リリース トラックを選択してから、[Google で自動的にアプリ署名鍵を作成、管理する] でアプリ署名を設定します。
    • Google Play で生成されたアプリ署名鍵を使ってアプリに署名する場合は、[次へ] を選択します。最初のリリースへの署名に使用した鍵がアップロード鍵となります。それ以降のリリースへの署名にも同じ鍵を使用する必要があります。
    • デベロッパー アカウントの別のアプリと同じ鍵を使用するには、[詳細オプション] > [このアカウントの別のアプリと同じ鍵を使用する] を選択し、アプリを選択して [次へ] をクリックします。
    • 自分専用の署名鍵を Google によるアプリ署名に使用する場合は、[詳細オプション] を選択し、秘密鍵と公開鍵証明書を安全にアップロードする方法としていずれかのオプションを選択します。

[追加する Android App Bundle と APK] というセクションで [ファイルを選択] をクリックすると、アップロード鍵を使用して署名したアプリを見つけてアップロードできます。アプリのリリースについて詳しくは、リリースの準備と公開をご覧ください。Google Play アプリ署名にオプトインした後でアプリをリリースすると、Google Play がアプリの署名鍵を生成して管理します。アプリのその後のアップデートへの署名は、Google Play にアップロードする前にアプリのアップロード鍵を使って行います。

アプリの新しいアップロード鍵を作成する必要がある場合は、紛失または不正使用があった非公開のアップロード鍵をリセットする方法についてのセクションにお進みください。

既存のアプリをオプトインする

すでに Google Play に公開されているアプリを既存のアプリ署名鍵を使用して更新する場合は、次の手順に沿って Google Play アプリ署名にオプトインします。

  1. 既存のアプリ署名鍵を使用してアプリに署名し(まだ行っていない場合)、[Export encrypted key] チェックボックスをオンにして、暗号化された *.pepk ファイルとして署名鍵を保存します。このファイルは後の手順で必要になります。
  2. Play Console にログインし、アプリに移動します。
  3. 左側のメニューで [リリース管理] > [アプリの署名] をクリックします。
  4. 該当する場合は、利用規約を確認し、[同意する] を選択します。
  5. Google Play にアップロードする署名鍵に最も適したオプションを選択し、表示された手順に沿って操作します。たとえば、このページに記載されているとおりに Android Studio を使用してアプリの署名鍵をエクスポートした場合は、[Android Studio からエクスポートした鍵をアップロードする] を選択し、鍵の *.pepk ファイルをアップロードします。
  6. [登録] をクリックします。

現在、アプリの署名証明書とアップロード証明書の詳細が記載されたページが表示されているはずです。Google Play は、アプリをユーザーにデプロイする際に、既存の鍵を使用してアプリに署名します。しかし、Google Play アプリ署名にとって最も重要なメリットの 1 つは、Google Play にアップロードするアーティファクトへの署名に使用する鍵と、ユーザーに配布するアプリへの署名に Google Play が使用する鍵を区別できることです。そのため、次のセクションで説明する手順に沿って、個別にアップロード鍵を生成して登録することを検討してください。

アップロード証明書を生成して登録する

アップロード鍵で署名されていないアプリを公開している場合は、Google Play Console で、アプリの今後のアップデートで使用するアップロード鍵を登録できます。この手順は省略しても構いませんが、Google Play がユーザーへのアプリ配信に使用する鍵とは別の鍵を使用してアプリを公開することをおすすめします。これにより、Google は署名鍵のセキュリティを確保し、紛失または不正使用があった非公開のアップロード鍵をリセットすることができます。このセクションでは、アップロード鍵を作成し、その鍵からアップロード証明書を生成して Google Play に登録し、アプリの今後のアップデートで使用できるようにする方法を説明します。

以下に、Play Console にアップロード証明書を登録するためのオプションが表示される状況を示します。

  • 署名鍵を使用して署名された新しいアプリを公開し、Google Play アプリ署名にオプトインする場合。
  • Google Play アプリ署名にすでにオプトインされている既存のアプリを公開しようとしているが、そのアプリが署名鍵を使用して署名されている場合。

Google Play アプリ署名にすでにオプトインされている既存のアプリのアップデートを公開せずに、アップロード証明書を登録する場合は、次の手順を行って、紛失または不正使用があった非公開のアップロード鍵をリセットする方法についてのセクションにお進みください。

まだアップロード鍵とキーストアを生成していない場合は生成します。

アップロード鍵とキーストアを作成した後、keytool コマンドを使用してアップロード鍵から公開鍵証明書を生成する必要があります。

    $ keytool -export -rfc
      -keystore your-upload-keystore.jks
      -alias upload-alias
      -file output_upload_certificate.pem
    

アップロード証明書を用意できたので、Play Console でプロンプトが表示されたときに Google に登録するか、以下のセクションを確認のうえ、Google Play サポートチームを介して登録します。

アプリ署名鍵をアップグレードする

状況によっては、アプリの署名鍵の変更が必要になることがあります。たとえば、暗号学的にさらに強い鍵が必要である、署名鍵が不正使用された、というような場合です。ただし、ユーザーがアプリを更新できるのはアップデートが同じ署名鍵で署名されている場合のみであるため、公開済みのアプリの署名鍵を変更することは困難です。

アプリを Google Play に公開する場合は、公開済みのアプリの署名鍵を Play Console でアップグレードできます。新しい鍵が新規のインストールとアプリ アップデートへの署名に使用されるのに対し、以前のアプリ署名鍵は、鍵のアップグレードの前にアプリをインストールしたユーザーのアップデートへの署名に使用されます。

詳しくは、新しいインストール用にアプリ署名鍵をアップグレードするをご覧ください。

紛失または不正使用があった非公開のアップロード鍵をリセットする

非公開のアップロード鍵を紛失した場合、または秘密鍵が不正使用された場合は、新しい鍵を作成し、Google Play サポートチームに連絡して鍵のリセットを依頼します。

アプリに自動で署名するようビルドプロセスを設定する

Android Studio で、ビルドプロセス中にアプリのリリース バージョンに自動的に署名するようにプロジェクトを設定できます。そのためには、署名設定を作成し、リリース ビルドタイプにその設定を適用します。署名設定は、キーストアの場所、キーストアのパスワード、鍵のエイリアス、鍵のパスワードで構成されます。Android Studio で署名設定を作成してリリース ビルドタイプに適用するには、次の手順を行います。

  1. [Project] ウィンドウでアプリを右クリックし、[Open Module Settings] をクリックします。
  2. [Project Structure] ウィンドウの左側のパネルにある [Modules] で、署名するモジュールをクリックします。
  3. [Signing] タブをクリックし、Add アイコン をクリックします。
  4. キーストア ファイルを選択して、この署名設定の名前を入力し(複数作成する場合があるため)、必要な情報を入力します。

    図 7. 新しい署名設定を作成するためのウィンドウ

  5. [Build Types] タブをクリックします。
  6. [release] ビルドをクリックします。
  7. [Signing Config] で、作成した署名設定を選択します。

    図 8. Android Studio で署名設定を選択します。

  8. [OK] をクリックします。

これで、Android Studio で [Build] > [Build Bundle(s) / APK(s)] の下のオプションを選択してリリース ビルドタイプをビルドするたびに、IDE が指定された署名設定を使用してアプリに自動的に署名するようになります。署名済み APK または App Bundle は、ビルドしたモジュールのプロジェクト ディレクトリ内の build/outputs/ ディレクトリにあります。

署名設定を作成すると、署名情報が Gradle ビルドファイルに書式なしテキストで追加されます。チームで作業している場合、またはコードを一般公開して共有する場合は、署名情報を保護する必要があるため、ビルドファイルから署名情報を削除して別の場所に保存します。署名情報をビルドファイルから削除する方法については、ビルドファイルから署名情報を削除するをご覧ください。署名情報の保護について詳しくは、鍵を保護するをご覧ください。

プロダクト フレーバーごとに異なる署名をする

アプリでプロダクト フレーバーを使用し、フレーバーごとに異なる署名を行う場合、追加の署名設定を作成し、フレーバーごとに指定することができます。

  1. [Project] ウィンドウでアプリを右クリックし、[Open Module Settings] をクリックします。
  2. [Project Structure] ウィンドウの左側のパネルにある [Modules] で、署名するモジュールをクリックします。
  3. [Signing] タブをクリックし、Add アイコン をクリックします。
  4. キーストア ファイルを選択して、この署名設定の名前を入力し(複数作成する場合があるため)、必要な情報を入力します。

    図 10. 新しい署名設定を作成するためのウィンドウ

  5. 必要に応じて、すべての署名設定を作成するまで手順 3 および 4 を繰り返します。
  6. [Flavors] タブをクリックします。
  7. 設定するフレーバーをクリックし、[Signing Config] プルダウン メニューから適切な署名設定を選択します。

    図 11. プロダクト フレーバーごとに署名設定を行います。

    さらにプロダクト フレーバーがある場合は、設定を繰り返します。

  8. [OK] をクリックします。

Gradle の構成ファイルで署名設定を指定することもできます。詳しくは、署名設定の設定をご覧ください。

自分専用の署名鍵を管理する

Google Play アプリ署名にオプトインしない場合は、自分専用のアプリ署名鍵とキーストアを管理できます。ただし、鍵とキーストアの保護は自分の責任で行う必要があります。また、Android App Bundle と Google Play の Dynamic Delivery をサポートできなくなります。

自分専用の鍵とキーストアを作成する準備ができたら、まず、キーストアのための安全なパスワードと、キーストアに保管する各秘密鍵のための安全なパスワードを作成します。キーストアは安全な場所に保管する必要があります。アプリ署名鍵にアクセスできなくなったり、鍵が不正使用されたりしても、Google がアプリ署名鍵を取得することはできません。また、新しいバージョンのアプリを元のアプリのアップデートとしてユーザーにリリースすることができなくなります。詳しくは、後述の鍵を保護するをご覧ください。

図 12 に示すように、自分専用のアプリ署名鍵とキーストアを管理する場合は、APK に署名するときに、アプリ署名鍵を使用してローカルで APK に署名し、署名済み APK を直接 Google Play ストアにアップロードして配信します。

図 12. 自分専用のアプリ署名鍵を管理する場合のアプリへの署名

Google Play アプリ署名を使用すると、Google が署名鍵を安全に管理し、アプリが正しく署名されていることが保証され、アプリの全期間を通じてアップデートを受け取ることができます。ただし、アプリ署名鍵を自分で管理する場合は、留意すべき考慮事項がいくつかあります。

署名に関する考慮事項

アプリの想定される使用期間全体を通じて、同じ証明書でアプリに署名する必要があります。その理由は次のとおりです。

  • アプリのアップグレード: アプリのアップデートがインストールされる際に、新しいバージョンの証明書と既存のバージョンの証明書が比較されます。証明書が一致するとアップデートが許可されます。異なる証明書を使用して新しいバージョンに署名する場合は、異なるパッケージ名をアプリに割り当てる必要があります。この場合、ユーザーは新しいバージョンを完全に新しいアプリとしてインストールします。
  • アプリのモジュール性: Android では、同じ証明書で署名された APK を同一プロセスで実行できるため(アプリがそのように要求した場合)、これらは単一のアプリとして処理されます。この方法では、アプリをモジュールでデプロイでき、ユーザーは各モジュールを個別にアップデートできます。
  • パーミッションによるコードとデータの共有: Android では署名に基づくパーミッションが適用されます。これにより、アプリでは、指定の証明書で署名された別のアプリに機能を公開できます。同じ証明書で複数の APK に署名し、署名に基づくパーミッション チェックを使用することによって、複数のアプリでコードとデータを安全に共有できます。

アプリのアップグレードをサポートする場合、アプリ署名鍵の有効期間は、そのアプリの想定される使用期間よりも長くなければなりません。推奨される有効期間は 25 年以上です。鍵の有効期間が切れると、ユーザーはアプリの新しいバージョンにシームレスにアップグレードすることができなくなります。

アプリを Google Play で公開する場合、アプリへの署名に使用する鍵の有効期限は 2033 年 10 月 22 日より後でなければなりません。Google Play ではこの要件を適用することで、新しいバージョンが使用可能になったときにユーザーがアプリをシームレスにアップグレードできるようにしています。

鍵を保護する

Google Play アプリ署名にオプトインせず)アプリ署名鍵とキーストアの管理と保護を自分で行う場合、アプリ署名鍵の保護は自分にとってもユーザーにとっても非常に重要です。別の人に鍵の使用を許可したり、第三者が見つけて使用できるような安全ではない場所にキーストアとパスワードを置いたりすると、作成者本人であるという保証がなくなり、ユーザーの信頼を失います。

第三者があなたの知らないうちに、または許可なく鍵を取得できてしまった場合、その第三者が本物のアプリを不正に置き換えたり破損させたりするアプリに署名し、配布するおそれがあります。また、あなたの ID で他のアプリやシステム自体を攻撃したり、ユーザーデータを破損させたり盗んだりするアプリに署名して配布する可能性もあります。

秘密鍵は、アプリの今後のバージョンすべてに署名するために必要です。鍵を紛失したり間違った場所に保管したりすると、既存のアプリのアップデートを公開できなくなります。以前に生成した鍵を再生成することはできません。

デベロッパーとしてのあなたの評判は、アプリ署名鍵を期限切れになるまで常に適切に保護することにかかっています。次に、鍵を安全に保つためのヒントを示します。

  • キーストアと鍵に対して安全なパスワードを選択します。
  • 秘密鍵を他人に与えたり貸したりせず、キーストアと鍵のパスワードを権限のない人に知られないようにします。
  • 秘密鍵が格納されたキーストア ファイルを安全な場所に保管します。

一般に、鍵の生成、使用、保管に関する常識的な注意事項を遵守すれば、鍵の安全は確保されます。

ビルドファイルから署名情報を削除する

署名設定を作成すると、Android Studio がモジュールの build.gradle ファイルに書式なしテキストで署名情報を追加します。チームで作業していたり、コードをオープンソース化したりする場合、この機密情報をビルドファイルから削除し、第三者が容易にアクセスできないようにする必要があります。そのためには、次のように、機密情報を保存するプロパティ ファイルを個別に作成し、ビルドファイルでそのファイルを参照するようにします。

  1. 署名設定を作成し、1 つ以上のビルドタイプに適用します。この手順では、上記のアプリに自動で署名するようビルドプロセスを設定するで説明したように、リリース ビルドタイプの署名設定を 1 つ設定しているものとします。
  2. プロジェクトのルート ディレクトリで keystore.properties というファイルを作成します。このファイルには、次に示す署名情報を含める必要があります。
        storePassword=myStorePassword
        keyPassword=mykeyPassword
        keyAlias=myKeyAlias
        storeFile=myStoreFileLocation
        
  3. モジュールの build.gradle ファイルの android {} ブロックの前に、keystore.properties ファイルを読み込むためのコードを追加します。
        ...
    
        // Create a variable called keystorePropertiesFile, and initialize it to your
        // keystore.properties file, in the rootProject folder.
        def keystorePropertiesFile = rootProject.file("keystore.properties")
    
        // Initialize a new Properties() object called keystoreProperties.
        def keystoreProperties = new Properties()
    
        // Load your keystore.properties file into the keystoreProperties object.
        keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
    
        android {
            ...
        }
    
        

    注: 別の場所に keystore.properties ファイルを保存することもできます(たとえば、プロジェクトのルート フォルダではなくモジュール フォルダや、継続的インテグレーション ツールを使用している場合はビルドサーバー上など)。その場合は、実際の keystore.properties ファイルの場所を使用して keystorePropertiesFile が正しく初期化されるように、上記のコードを変更する必要があります。

  4. keystoreProperties に保存されたプロパティは、構文 keystoreProperties['propertyName'] を使用して参照できます。keystoreProperties に保存された署名情報を、この構文を使用して参照するように、モジュールの build.gradle ファイルの signingConfigs ブロックを変更します。
        android {
            signingConfigs {
                config {
                    keyAlias keystoreProperties['keyAlias']
                    keyPassword keystoreProperties['keyPassword']
                    storeFile file(keystoreProperties['storeFile'])
                    storePassword keystoreProperties['storePassword']
                }
            }
            ...
          }
        
  5. [Build Variants] ツール ウィンドウを開き、リリース ビルドタイプが選択されていることを確認します。
  6. [Build] > [Build Bundle(s) / APK(s)] の下のオプションを選択して、リリースビルドの APK または App Bundle のいずれかをビルドします。モジュールの build/outputs/ ディレクトリにビルドが出力されていることを確認します。

これでビルドファイルに機密情報が含まれなくなったため、ビルドファイルをソース コントロールに含めたり、共有のコードベースにアップロードしたりできます。必ず keystore.properties ファイルのセキュリティを確保し、ソース コントロール システムから削除することなども検討してください。