アプリの署名
キーとPlay App Signingを学びます。
「アプリの署名」はCoddyKit上の無料Android Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAndroid Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Android Academyコースには全4レッスンが含まれています。
アプリに署名が必要な理由
Androidは、アプリにデジタル署名がない限りインストールを許可しません。署名によって、アプリの公開者が誰であるか、そしてAPKが署名後に改ざんされていないことの2点を証明できます。
特に重要なのは、署名によって更新が元のアプリと結び付けられることです。更新版は、インストール済みのバージョンと同じキーで署名されている場合にのみ受け入れられます。そのキーを失うと、以後アプリを更新できなくなります。
このレッスンでは、キーストア、署名設定、そしてGoogleが推奨するより安全な最新の方法であるPlay App Signingについて説明します。
キーストアとキー
署名に使用するIDは、キーストアファイル(.jksまたは.keystore)に保存されます。キーストアには複数のキーを格納でき、各キーにはエイリアスと固有のパスワードがあります。
- キーストアのパスワード — ファイルのロックを解除します。
- キーエイリアス — キーストア内のキーを識別します。
- キーパスワード — その特定のキーのロックを解除します。
毎日実行するデバッグビルドには、使い捨てのデバッグキーストアで自動的に署名されます。リリースには、自分で用意したキーストアが必要です。
キーストアを作成する
キーストアはAndroid Studioのダイアログから作成することも、JDKに付属するkeytoolコマンドで作成することもできます。
長い有効期間(25年以上)を設定してください。キーの有効期限が切れると、更新版を公開できません。RSA 2048が標準です。
keytool -genkeypair \
-v \
-keystore release.jks \
-alias upload \
-keyalg RSA \
-keysize 2048 \
-validity 10000signingConfigsブロック
Gradleビルド中に自動で署名するには、signingConfigsエントリを宣言し、それをreleaseビルドタイプに関連付けます。
この方法は機能しますが、パスワードがビルドファイルにそのまま記載されていることに注意してください。次にこの問題を解決します。
android {
signingConfigs {
create("release") {
storeFile = file("release.jks")
storePassword = "superSecret"
keyAlias = "upload"
keyPassword = "superSecret"
}
}
buildTypes {
release {
signingConfig = signingConfigs.getByName("release")
isMinifyEnabled = true
}
}
}シークレットをGitから除外する
パスワードやキーストアをバージョン管理にコミットしてはいけません。代わりに、Gitで追跡対象外にしたローカルのkeystore.propertiesファイルから読み込みます。
keystore.propertiesと*.jksを.gitignoreに追加します。
// top of app/build.gradle.kts
val keystoreProps = Properties().apply {
val f = rootProject.file("keystore.properties")
if (f.exists()) load(f.inputStream())
}
android {
signingConfigs {
create("release") {
storeFile = file(keystoreProps["storeFile"] as String)
storePassword = keystoreProps["storePassword"] as String
keyAlias = keystoreProps["keyAlias"] as String
keyPassword = keystoreProps["keyPassword"] as String
}
}
}keystore.propertiesファイル
対応するプロパティファイルは、Gitから除外して安全に保管する単純なkey=value形式のリストです(パスワードマネージャーやCIのシークレットストアなどに保管します)。
CIサーバーでは、コミット済みのファイルではなく、環境変数から取得するシークレットとしてこれらを注入します。
# keystore.properties (git-ignored!)
storeFile=release.jks
storePassword=superSecret
keyAlias=upload
keyPassword=superSecretPlay App Signing
現在のPlayではPlay App Signingが使用されます。Googleが安全なインフラストラクチャ上で実際のアプリ署名キーを保管し、それを使ってユーザーに配信するAPKに署名します。
あなたが管理するのはアップロードキーだけです。このキーでBundleに署名してアップロードすると、Playがアップロードキーを検証して取り除き、アプリ署名キーで再署名します。
大きな利点は、アップロードキーを失ってもリセットを申請できることです。一方、ユーザーが信頼するアプリ署名キーはGoogleによって安全に保管されます。
アップロードキーとアプリ署名キー
2つのキーにはそれぞれ異なる役割があります。混同しないでください。
- アップロードキー — あなたが管理します。アップロードするAABに署名します。紛失した場合はリセットできます。
- アプリ署名キー — Googleが管理するキー(または一度アップロードしたキー)です。ユーザーがインストールする最終APKに署名します。変更できません。
新しいアプリを登録する場合は、Googleにアプリ署名キーを生成してもらい、アップロードキーでアップロードに署名するのが最も簡単です。
署名を検証する
成果物がどのように署名されているかを確認するには、Android SDKのbuild-toolsに含まれるapksignerを使用します。署名証明書と、どの署名スキーム(v1/v2/v3)が存在するかが表示されます。
証明書のSHA-256フィンガープリントを比較することは、FirebaseやGoogle Sign-Inなどのサービスにアプリを登録する際にも使用します。
# Verify and print signer certificates of an APK
apksigner verify --print-certs app-release.apk
# Show the SHA-256 fingerprint of a keystore key
keytool -list -v -keystore release.jks -alias uploadキーを保護する
アップロードキーは交換が難しく、自分で管理するアプリ署名キーは交換できません。これらを非常に重要なものとして扱ってください。
- キーストアを少なくとも2か所の安全な場所にバックアップします。
- パスワードはパスワードマネージャーに保存し、ソースコードには決して書き込みません。
- Play App Signingを使用して、アップロードキーを紛失しても復旧できるようにします。
- チーム内でキーストアにアクセスできる人を制限します。
開発者がキーを失い、更新版をリリースできなくなったために、公開済みアプリが使われなくなった例は数多くあります。
全体の流れ
リリース署名の一連の流れは次のとおりです。
keytoolでアップロード用キーストアを作成します。keystore.propertiesからシークレットを読み込むようにsigningConfigsを設定します。./gradlew bundleReleaseで署名済みの.aabをビルドします。- Playにアップロードすると、Playがユーザーに配信する前にアプリ署名キーで再署名します。
今後は、すべての更新版を同じアップロードキーで署名する必要があります。
確認問題
Play App Signingを有効にしている場合、アップロードするBundleにはあなたがどのキーで署名しますか。また、そのキーを失うとどうなりますか。
まとめ:アプリの署名
署名によって、Androidアプリをインストールおよび更新できるようになります。
- キーストアにはキーが格納され、各キーにはエイリアスとパスワードがあります。
keytoolで有効期間の長いキーを作成し、signingConfigsに設定します。keystore.propertiesと.gitignoreを使って、パスワードをGitから除外します。- Play App Signingでは、キーがリセット可能なアップロードキーと、Googleが管理する変更不可能なアプリ署名キーに分かれます。
- キーを慎重にバックアップしてください。キーを失うと、アプリの運用を続けられなくなる可能性があります。
次は、Play Consoleとストア掲載情報を設定します。
よくある質問
「アプリの署名」レッスンは無料ですか?
はい。「アプリの署名」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Android Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Android Academyコースには全4レッスンが含まれています。
「アプリの署名」で何を学びますか?
キーとPlay App Signingを学びます。 ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Android Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAndroid Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「アプリの署名」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAndroid Academyレッスンでコードを書いて実行できますか?
はい。すべてのAndroid Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。