Androidアプリの署名鍵を失くさないために|keystoreの作成・管理とPlay App Signing
Androidアプリの更新版を公開するには、最初に使った署名鍵が必要です。パソコンの買い替えやディスクの故障で鍵を失くすと、ストアのアプリを更新できなくなることもあります。作るときに知っておきたい仕組みと、守り方を整理しました。
署名鍵とは何か
Androidのアプリは、インストールする前に必ず「署名」されている必要があります。署名は、そのアプリが誰によって作られ、途中で書き換えられていないことを証明するための仕組みです。
スマホに入っているアプリを更新するとき、Androidは「新しいアプリが、前と同じ鍵で署名されているか」を確認します。鍵が違えば、たとえ同じパッケージ名でも別人が作ったアプリとみなされ、上書きインストールできません。つまり、署名鍵はアプリの「実印」のようなものです。
開発中に flutter run で実機に入れるときは、自動で作られる「デバッグ用の鍵」が使われます。これはパソコンごとに違ううえ、ストアには使えません。リリース用には、自分で鍵を作る必要があります。
Play App Signingで鍵は2本になる
現在、Google Playに新しく登録するアプリは、Play App Signing(Google Playによるアプリ署名)を使うことが前提になっています。この仕組みでは、鍵が2本に分かれます。
| 鍵 | 持っている人 | 役割 |
|---|---|---|
| アプリ署名鍵 | 利用者の端末に配られるアプリに署名する。いわば本物の実印 | |
| アップロード鍵 | 開発者(自分) | 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と同じ方法で作ります。
- 新しい鍵の証明書をPEM形式で書き出します。
keytool -export -rfc -keystore new-upload-keystore.jks -alias upload -file upload_certificate.pem - Play Consoleで対象のアプリを開き、「アプリの完全性」の「アプリの署名」から、アップロード鍵のリセットをリクエストし、PEMファイルを提出します。
- 承認されると、指定された日時以降、新しい鍵で署名したファイルをアップロードできるようになります。承認までには数日かかることがあります。
なお、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開発を続けるときの注意点でも触れています。