【Android】keystoreファイルをなくした場合の対処法
はじめに
ReactNative
やKotlin
、Flutter
を使ってAndroid
アプリを開発した場合、最終的にGoogle Play Store
でアプリを公開するのは一応のゴールになるかと思います。
その際に必要となるのがkeystore
ファイルです。
これは、アプリの開発元が正しいものであると証明するために行う署名作業に必要なファイルです。
今回はうっかりこのkeystore
ファイルをなくして、Google Play Store
にアプリを公開できなくなりかけた場合の対応方法についてご紹介します。
事の経緯
仕事で開発しているReactNative
アプリで、久しぶりにAndroid
のリリースビルドを行うことになりました。
※しばらくはiOS
向けに細々した機能のリリースを行っていた
手順自体は明文化されているため、特に問題らしい問題もなく、いよいよ最後のkeystore
ファイルによる署名作業に移ろうとしました。
署名自体は簡単で、下記のコマンドを実行するだけです。
apksigner sign --ks app/my-release-key.keystore --ks-key-alias my-key-alias my-app.apk
・・・とここで見たことのないエラーが発生しました。
よくよく内容を見ていくと my-release-key.keystore
が無くなっている・・・
補足.keystoreファイルとは
Google Play Store
にAPK
ファイル(Andorid
アプリの実行ファイル)をアップロードする際には、APK
ファイルに署名を行わなければなりません。
Google
側はこの署名を確認して、アプリの開発元が正しいものである(=正規のAPK
ファイルである)と判定します。
そして、その署名に必要になってくるのがkeystore
ファイル(とその中にあるalias
)です。
署名はAPK
ファイルのビルド時に行い、そこでkeystore
ファイル、alias
、alias
のパスワードを使います。
今回はkeystore
ファイルが何らかの原因で消失してしまったわけです。
GoogleはGoogle Play App Signing
という署名方法を推奨しており、今回はこの方式を採用していたのでなんとかなった、という話です。
他の方式の場合は、そもそもkeystore
を紛失したら対応不可!なんて記事も見かけます(真偽は不明ですが・・・)
何が起きたか
直接の紛失原因は今のところ不明です。
アプリのコード自体はGitLab
で管理しているのですが、デフォルトでkeystore
は.gitignore
に含まれているため管理されていませんでした。
ignore
されている事自体は何ら悪いことではなく、むしろアプリ公開に必要なkeystore
をGit
に載せる事の方がセキュリティ的にリスクがあるためだと思います。
いずれにせよ、今回は自端末(それも開発機として頻繁にソースをいじる)にしかリリース用のkeystore
を置いておらず、管理をしていないことが原因でした。
復旧手順
もうダメか・・・、と思いましたがGoogle Play Console
から申請を行うことで対応できました。
ざっくり説明すると、
- 新規に
keystore
ファイルを作成し、pem
ファイルを作成。 - 作成した
pem
ファイルをGoogle Play Console
からアップロードしてアップロード用鍵のリセットを申請した。ということです。
詳細な手順は以下のようになります。
keystoreを再生成
下記のコマンドを入力し、いくつかの質問に答えるとkeystore
ファイルが生成されます。最後にパスワードを聞かれるので登録する。
keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
pemファイルを生成
下記のコマンドを入力し、keystore
生成時のパスワードを入力すると、pem
ファイルが生成されます。
keytool -export -rfc -alias my-key-alias -file my-release-key.pem -keystore my-release-key.keystore
なぜpemファイルを生成する?
これは先にちらっと出てきたGoogle Play App Signing
に関連しています。
Google Play App Signing
をざっくり説明すると、Google
に対してリリース用鍵を渡し、APK
ファイルをビルドする際はアップロード用鍵で署名する方式です。
この方式のポイントは、リリース用鍵を管理しなくともよく、リリースする側(APK
をアップロードする側)はアップロード用鍵だけを管理すればよいということです。
アップロード用鍵は再登録できる(とはいても簡単にはできない)ので紛失しても安心、というわけです。
つまり、ここで生成したpem
ファイルは新たなリリース用鍵で、keystore
はアップロード用鍵です。
Googleにpemをアップロード
-
Google Play Console
で対象アプリを開いたら【リリース管理】→【アプリの署名】を開き、【鍵のアップグレードをリクエスト】をクリック。 -
事由を聞かれるので、
【各リリースの署名に使用しているアップロード鍵を紛失したため】を選択し【次へ】を押下
-
サポートに問い合わせてほしい旨のメッセージが表示されるので、【サポートにお問合せ】を押下。
-
問い合わせ画面が表示されるので、各種アプリ情報を入力して【鍵またはキーストアに関連する問題がある】を選択。
-
続いて【アップロード鍵を忘れた】を選択し、詳細を記入(下図参照)。
最後にpem
ファイルを添付して【送信】を実行。
数日経つとGoogle
から登録していたアドレス宛にメールが届きます。
内容をかみ砕くと、
- 新しい鍵の登録が完了したで
- YYYY-mm-ddから利用可能や
- 今度からは気を付けるんやで(意訳)
といった旨です。
実際に指定された日時以降は、新しいkeystore
ファイルで署名をしたAPK
ファイルがリリースできるようになりました!
まとめ
今回はkeystore
ファイルを紛失した場合の対処方法についてご紹介しました。
原因としてはkeystore
ファイルを単一の端末でしか管理していなかったことだと思います。
※このファイルに限らず、大事なファイルはバックアップを取っておく等の初歩的な対処が甘かったです。
Expo
の場合はどういった管理になっているかわかりませんが、少なくともreact-native init
で作成したプロジェクトはデフォルトでkeystore
ファイルがignore
されているので、同じ状況になる人は多少はいるのかなと思います。
その際にこの記事が役立てば幸いです。
Discussion