🤖

【Android】keystoreファイルをなくした場合の対処法

2020/12/01に公開

はじめに

ReactNativeKotlinFlutterを使って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 StoreAPKファイル(Andoridアプリの実行ファイル)をアップロードする際には、APKファイルに署名を行わなければなりません。
Google側はこの署名を確認して、アプリの開発元が正しいものである(=正規のAPKファイルである)と判定します。

そして、その署名に必要になってくるのがkeystoreファイル(とその中にあるalias)です。

署名はAPKファイルのビルド時に行い、そこでkeystoreファイル、aliasaliasのパスワードを使います。

今回はkeystoreファイルが何らかの原因で消失してしまったわけです。

GoogleはGoogle Play App Signingという署名方法を推奨しており、今回はこの方式を採用していたのでなんとかなった、という話です。
他の方式の場合は、そもそもkeystoreを紛失したら対応不可!なんて記事も見かけます(真偽は不明ですが・・・)

何が起きたか

直接の紛失原因は今のところ不明です。
アプリのコード自体はGitLabで管理しているのですが、デフォルトでkeystore.gitignoreに含まれているため管理されていませんでした。
ignoreされている事自体は何ら悪いことではなく、むしろアプリ公開に必要なkeystoreGitに載せる事の方がセキュリティ的にリスクがあるためだと思います。

いずれにせよ、今回は自端末(それも開発機として頻繁にソースをいじる)にしかリリース用のkeystoreを置いておらず、管理をしていないことが原因でした。

復旧手順

もうダメか・・・、と思いましたがGoogle Play Consoleから申請を行うことで対応できました。

ざっくり説明すると、

  1. 新規にkeystoreファイルを作成し、pemファイルを作成。
  2. 作成した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をアップロード

  1. Google Play Consoleで対象アプリを開いたら【リリース管理】→【アプリの署名】を開き、【鍵のアップグレードをリクエスト】をクリック。

  2. 事由を聞かれるので、
    【各リリースの署名に使用しているアップロード鍵を紛失したため】を選択し【次へ】を押下
    keystore1

  3. サポートに問い合わせてほしい旨のメッセージが表示されるので、【サポートにお問合せ】を押下。

  4. 問い合わせ画面が表示されるので、各種アプリ情報を入力して【鍵またはキーストアに関連する問題がある】を選択。

  5. 続いて【アップロード鍵を忘れた】を選択し、詳細を記入(下図参照)。
    最後にpemファイルを添付して【送信】を実行。
    keystore2

数日経つとGoogleから登録していたアドレス宛にメールが届きます。
内容をかみ砕くと、

  • 新しい鍵の登録が完了したで
  • YYYY-mm-ddから利用可能や
  • 今度からは気を付けるんやで(意訳)

といった旨です。
実際に指定された日時以降は、新しいkeystoreファイルで署名をしたAPKファイルがリリースできるようになりました!

まとめ

今回はkeystoreファイルを紛失した場合の対処方法についてご紹介しました。
原因としてはkeystoreファイルを単一の端末でしか管理していなかったことだと思います。
※このファイルに限らず、大事なファイルはバックアップを取っておく等の初歩的な対処が甘かったです。

Expoの場合はどういった管理になっているかわかりませんが、少なくともreact-native initで作成したプロジェクトはデフォルトでkeystoreファイルがignoreされているので、同じ状況になる人は多少はいるのかなと思います。
その際にこの記事が役立てば幸いです。

Discussion