Know-how アプリ開発 読了目安 約7分

Androidアプリの署名鍵を失くさないために|keystoreの作成・管理とPlay App Signing

Androidアプリの更新版を公開するには、最初に使った署名鍵が必要です。パソコンの買い替えやディスクの故障で鍵を失くすと、ストアのアプリを更新できなくなることもあります。作るときに知っておきたい仕組みと、守り方を整理しました。

署名鍵とは何か

Androidのアプリは、インストールする前に必ず「署名」されている必要があります。署名は、そのアプリが誰によって作られ、途中で書き換えられていないことを証明するための仕組みです。

スマホに入っているアプリを更新するとき、Androidは「新しいアプリが、前と同じ鍵で署名されているか」を確認します。鍵が違えば、たとえ同じパッケージ名でも別人が作ったアプリとみなされ、上書きインストールできません。つまり、署名鍵はアプリの「実印」のようなものです。

開発中に flutter run で実機に入れるときは、自動で作られる「デバッグ用の鍵」が使われます。これはパソコンごとに違ううえ、ストアには使えません。リリース用には、自分で鍵を作る必要があります。

Play App Signingで鍵は2本になる

現在、Google Playに新しく登録するアプリは、Play App Signing(Google Playによるアプリ署名)を使うことが前提になっています。この仕組みでは、鍵が2本に分かれます。

鍵持っている人役割
アプリ署名鍵Google利用者の端末に配られるアプリに署名する。いわば本物の実印
アップロード鍵開発者(自分)Play Consoleにアップロードするファイルに署名し、本人からの提出だと証明する

自分が作って手元で管理するのは「アップロード鍵」です。アップロードされたファイルは、Googleがアップロード鍵で本人確認をしたあと、Googleが保管しているアプリ署名鍵で署名し直して配信します。

この仕組みの大きな利点は、アップロード鍵を失くしても、手続きをすれば新しい鍵に交換できることです。昔のように、開発者が配信用の鍵を直接管理していた時代は、鍵を失くすとそのアプリは二度と更新できませんでした。

手順1:アップロード鍵を作る

JDKに付属している keytool コマンドで作ります。Macのターミナルで次を実行します。

keytool -genkey -v -keystore ~/upload-keystore.jks \
  -keyalg RSA -keysize 2048 -validity 10000 \
  -alias upload

実行すると、キーストアのパスワード、名前や組織名などを聞かれます。個人開発なら、名前の欄に自分の名前を入れ、組織名などは空欄でもかまいません。-validity 10000 は有効期間(日数)で、約27年です。Google Playでは、2033年10月22日より後まで有効な鍵が求められるため、長めにしておきます。

作ったファイル(ここでは upload-keystore.jks)と、設定したパスワード、エイリアス(upload)の3点が、これから大切に保管するものです。

手順2:パスワードを別ファイルに書く

パスワードをビルド設定に直接書くと、Gitにコミットしたときに漏れてしまいます。そこで、android/key.properties という別ファイルに書いておきます。

storePassword=キーストアのパスワード
keyPassword=鍵のパスワード
keyAlias=upload
storeFile=/Users/あなたのユーザー名/upload-keystore.jks

そして、このファイルと鍵ファイルをGitの管理から外します。android/.gitignore に次の行があるか確認してください。Flutterの新しいテンプレートでは、最初から入っていることが多いです。

key.properties
**/*.keystore
**/*.jks

手順3:build.gradle.ktsで読み込む

android/app/build.gradle.kts を開き、ファイルの先頭に import を、android { } の中に署名の設定を追加します。import 文は必ずファイルの先頭に書く必要があります。

import java.io.FileInputStream
import java.util.Properties

plugins {
    // (既存のまま)
}

val keystoreProperties = Properties()
val keystorePropertiesFile = rootProject.file("key.properties")
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}

android {
    // (namespace や defaultConfig などは既存のまま)

    signingConfigs {
        create("release") {
            keyAlias = keystoreProperties["keyAlias"] as String
            keyPassword = keystoreProperties["keyPassword"] as String
            storeFile = keystoreProperties["storeFile"]?.let { file(it) }
            storePassword = keystoreProperties["storePassword"] as String
        }
    }

    buildTypes {
        release {
            signingConfig = signingConfigs.getByName("release")
        }
    }
}

テンプレートの buildTypes に signingConfig = signingConfigs.getByName("debug") と書かれている場合は、"release" に置き換えます。ここが debug のままだと、リリース用のファイルがデバッグ鍵で署名され、Play Consoleで受け付けてもらえません。

設定できたら、flutter build appbundle でAAB(Android App Bundle)を作ります。build/app/outputs/bundle/release/app-release.aab ができれば成功です。

手順4:鍵をバックアップする

鍵を作ったら、その日のうちにバックアップしておきます。最低限、次の2か所に分けて保管するのがおすすめです。

  • パスワード管理アプリ:パスワードとエイリアスを記録し、可能なら鍵ファイル自体も添付する。
  • パソコンとは別の場所:暗号化した外付けドライブや、信頼できるクラウドストレージ。パソコンの故障や盗難に備えます。

パスワードだけ、鍵ファイルだけを保管しても意味がありません。「鍵ファイル・キーストアのパスワード・鍵のパスワード・エイリアス」の4点をセットで残してください。

アップロード鍵を失くしたら

Play App Signingを使っていれば、アップロード鍵はリセットできます。

  1. 新しいアップロード鍵を、手順1と同じ方法で作ります。
  2. 新しい鍵の証明書をPEM形式で書き出します。
    keytool -export -rfc -keystore new-upload-keystore.jks -alias upload -file upload_certificate.pem
  3. Play Consoleで対象のアプリを開き、「アプリの完全性」の「アプリの署名」から、アップロード鍵のリセットをリクエストし、PEMファイルを提出します。
  4. 承認されると、指定された日時以降、新しい鍵で署名したファイルをアップロードできるようになります。承認までには数日かかることがあります。

なお、Play App Signingが始まる前に公開し、その後も移行していない古いアプリでは、鍵を失くすと更新できません。その場合は、新しいパッケージ名で別のアプリとして出し直すしかなくなります。古いアプリを持っている人は、Play Consoleで署名の状態を確認しておきましょう。

見落としがちな落とし穴:SHA-1フィンガープリント

FirebaseやGoogleログイン、Google Maps APIなどを使うアプリでは、鍵の「フィンガープリント(SHA-1やSHA-256)」を登録する必要があります。ここでよくあるのが、次のようなトラブルです。

「開発中は動いていたGoogleログインが、Google Playからインストールしたアプリでは失敗する」。原因は、登録しているフィンガープリントが、デバッグ鍵やアップロード鍵のものだけだからです。Playから配られるアプリはGoogleのアプリ署名鍵で署名されているため、アプリ署名鍵のフィンガープリントも登録しなければなりません。

鍵フィンガープリントの確認方法
デバッグ鍵keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android
アップロード鍵keytool -list -v -keystore ~/upload-keystore.jks -alias upload
アプリ署名鍵Play Consoleの「アプリの完全性」→「アプリの署名」に表示される

3つすべてを登録しておけば、開発中・社内テスト・ストア配信のどの段階でも同じように動きます。

まとめ

  • リリース用にはアップロード鍵を自分で作り、鍵ファイルとパスワードはGitに入れない。
  • buildTypes の release が release の署名設定を使っているか確認する。
  • 鍵ファイル・パスワード・エイリアスをセットで、2か所以上にバックアップする。
  • Play App Signingなら、アップロード鍵を失くしてもリセットを申請できる。
  • GoogleのAPIを使うなら、アプリ署名鍵のフィンガープリントも登録する。

パソコンを買い替えるときの準備については、Intel MacでFlutter開発を続けるときの注意点でも触れています。