見出し画像

徹底解説!Androidアプリ署名鍵のアップグレード(2023年夏版)

はじめに

NTTレゾナントテクノロジー Android/iOSアプリ開発エンジニアの西添です。

最近、全社的なセキュリティ向上施策の一環として、おそらくほとんどのアプリ開発者が経験しないであろう「Androidアプリのアプリ署名鍵をアップグレードする」という希少な経験をしました。今回はその際に行った検証から得られた知見を徹底的に解説したいと思います。


この記事を読む前に

この記事は2023年9月時点の情報に基づいて執筆しました。

Playアプリ署名や署名鍵のアップグレードについての仕様は変更される可能性がありますので、ご自身で実施する前に必ず最新の公式ヘルプをご確認ください。実際、2022〜2023年はアプリ署名鍵のアップグレードの仕様が3度も変更されており、数ヶ月前に調査した内容と現時点での仕様が異なるということに悩まされました……。

検証でわかったことの要点

忙しい人向けに、実際に「アプリ署名鍵のアップグレード」を検証してみてわかった意外な仕様や注意点についてまとめておきます。

  • 「アップロード鍵のリセット」も「アプリ署名鍵のアップグレード」も、どちらもGoogle Play Consoleのディベロッパーアカウントのアカウント所有者でないと実行できない。変更する際は自組織のアカウント所有者に対してGoogle Play Console上での操作を依頼する必要がある。

  • アプリ署名鍵のアップグレードをしても、Google Playで配布中のAPKに新しい署名鍵が即時反映されるわけではない。既にGoogle Play Consoleにアップロード済みのバージョンについてはAPKが再生成されず、古い署名鍵のみが組み込まれたAPKのままになる。

  • アプリ署名鍵のアップグレード後にGoogle Play ConsoleにアップロードしたバージョンからAPKに新しい署名鍵が組み込まれる。

  • アプリ署名鍵のアップグレードをしても古い署名鍵が消えてなくなるわけではない。新しい署名鍵とともに古い署名鍵もAPKに組み込まれる。

  • APKに組み込まれた署名を確認するには必ずリビジョン 33.0.1 以上のapksignerコマンドを使うこと。それ未満のリビジョンだと新しい署名鍵が表示されない。

前提知識1:Playアプリ署名とは?

今回の本題である「アプリ署名鍵のアップグレード」は、Playアプリ署名が有効になっているアプリに対して行うものです。Playアプリ署名は2017年に登場したGoogle Playの機能で、ユーザに配布するAPKへの署名をGoogle Playが代理で行ってくれる仕組みです。

図1. Playアプリ署名

Playアプリ署名よりも以前の仕組みは、開発者がアプリ署名鍵でAPKに署名し、そのAPKがそのままストア上で配布されるというものでした。一方、Playアプリ署名では、開発者はアップロード鍵AAB (Android App Bundle)に署名します。そしてGoogle PlayがAABから最適化された配布用APKを生成してアプリ署名鍵で署名し、その配布用APKをストア上で配布します。

Androidはアップデートとして配布されたアプリの開発元をアプリ署名鍵を用いて確認し、セキュリティを担保します。そのため、もしアプリ署名鍵を紛失してしまうと、アプリのアップデートを配布できなくなってしまいます。さらに、もしアプリ署名鍵を悪意ある第三者に漏洩してしまうと、マルウェアを含んだアップデートがユーザに配布されるリスクがあります。以前はそのような大切なアプリ署名鍵を開発者が厳重に保管しなければなりませんでしたが、Playアプリ署名ではGoogle Playが代わりに保管してくれるというのがミソです。

前提知識2:二種類の署名鍵の変更について

上述の通り、Playアプリ署名にはアップロード鍵アプリ署名鍵という2種類の署名鍵が登場します。どちらもGoogle Play Console上で変更することができますが、それぞれ①変更回数の制限②古い鍵の取り扱い③ユーザ端末に対する制約に違いがあります。

アップロード鍵の変更について

アップロード鍵は開発者がGoogle PlayにアップロードするAABに対して署名するときに使用する鍵です。Google Playからユーザに配布されるAPKにはこのアップロード鍵は含まれません。

アップロード鍵の変更は、Google Play Console上で「アップロード鍵のリセットのリクエスト」を実施することで可能です。

①変更回数の制限:いつでも何回でも変更可能です。
②古い鍵の取り扱い:変更前の古い鍵はもう使用しませんので、破棄しても構いません。
③ユーザ端末に対する制約:ありません。

アプリ署名鍵の変更について

アプリ署名鍵はGoogle Playからユーザに配布されるAPKに対して署名するときに使用する鍵です。こちらが本記事の本題になります。

アプリ署名鍵の変更は、Google Play Console上で「アプリ署名鍵のアップグレードのリクエスト」を実施することで可能です。2023年9月現在は、公式ヘルプの表現を借りると『Android N(API レベル 24)以降でのすべてのインストール用に鍵のアップグレードをリクエストする』という方式になります。過去には他の方式もありましたが、それについては本記事の最後で補足します(補足3を参照)。

図2. アプリ署名鍵のアップグレード実施後のアプリ配布フロー(2023年9月現在)

①変更回数の制限:年に1回まで変更可能です。
②古い鍵の取り扱い:Google Playは古いアプリ署名鍵も引き続き保管し、APKに署名する際に新旧両方のアプリ署名鍵を使用します。
③ユーザ端末に対する制約:Android 6以下の端末は引き続き古いアプリ署名鍵を使用してアプリを検証します。また、Android 7〜12Lの端末でGoogle Play プロテクトが無効になっている場合も、引き続き古いアプリ署名を使用してアプリを検証します。

蛇足ですが、そもそも本来はアプリ署名鍵は変更できるものではありません。なぜなら、アプリ署名鍵を変更してしまうとアプリをアップデートできなくなってしまうからです。Android端末はアプリをアップデートする際に、インストール済みのアプリの署名証明書とアップデートの署名証明書を比較します。そこで両者が一致しなければアップデートは拒否されてしまいます。

この問題を解決するために、Android 9で導入されたAPK署名スキームv3ではアプリ署名鍵を変更するための鍵ローテーションがサポートされました。ただしv3にはいろいろと問題があるらしく、Google Play Console上で実施する「アプリ署名鍵のアップグレードのリクエスト」では、それらの問題が修正されたAPK署名スキームv3.1 (Android 13で導入) の鍵ローテーションが利用されているようです。v3.1はAndroid 13からサポートされたものですが、公式ヘルプの記述の変遷を追ってみると、2023年春頃のGoogle PlayプロテクトのアップデートによってAndroid 7〜12Lでもv3.1を認識できるようになったと推測されます(補足2を参照)。

アプリ署名鍵のアップグレードのリクエスト

前置きが長くなってしまいましたが、ここからが本題です。「アプリ署名鍵のアップグレードのリクエスト」の操作をスクリーンショットを交えて説明します。

※以下のスクリーンショットは2023年7月に検証したときのものです(2023年9月現在で既に画面遷移が変わってしまっています)。検証対象は検証のために作成した非公開アプリです。

まず、ディベロッパーアカウント所有者のアカウントにログインした上でGoogle Play Consoleで変更対象のアプリを開き、【アプリの署名】ページに遷移します。【アプリ署名鍵のアップグレード】という見出しの下にある【鍵のアップグレードをリクエスト】リンクをクリックします。

図3. [STEP1] 【鍵のアップグレードをリクエスト】をクリックする

なお、ディベロッパーアカウント所有者以外のアカウントでは下図のように【権限が必要です】と表示されてしまいます。

図4. ディベロッパーアカウント所有者以外のアカウントではアプリ署名鍵のアップグレードはできない

リンクをクリックした後、下図のように新しい署名鍵の作成方法とリクエストの理由を問う画面が表示されます。適切な選択肢を選び、右下の【アップグレード】ボタンを押します。

図5. [STEP2] オプションを選択する
図6. 【アプリ署名鍵のアップグレードをリクエストする理由】の選択肢

確認ダイアログが表示されますので、【確認】ボタンを押します。

図7. [STEP3] 確認ダイアログの内容を確認して【確認】ボタンを押す

以上の操作で、「アプリ署名鍵のアップグレードのリクエスト」は完了しました。証明書のフィンガープリントが変わり、【アプリ署名鍵のアップグレード】の見出しの下にアップグレードの実施日が表示されるようになります。

図8. アプリ署名鍵がアップグレードされた

【鍵のアップグレードをリクエスト】の右隣にある?マークにポインタをかざすと、アプリ署名鍵のアップグレードからまだ1年が経過していないため、再度アップグレードを実施できない旨が表示されます。

図9. アプリ署名鍵のアップグレードは年に1回まで

また、右上のプルダウンメニューから以前のアプリ署名鍵を選択すると、選択した署名鍵証明書のダウンロードやフィンガープリントの確認が行なえます。

図10. 以前のアプリ署名鍵も確認できる

ここが勘違いしやすいポイントなのですが、この時点でGoogle Playで配布中のAPKは、まだ古いアプリ署名鍵で署名されたAPKのままです。次回以降にGoogle PlayがAABからAPKを生成するタイミングで、新しいアプリ署名鍵が使用されるようになります。AABからAPKが生成されるのは、新しいAABがGoogle Play Consoleにアップロードされたときです。つまり、バージョンコードをインクリメントしたAABをアップロードしてリリースしたときに、ようやく新しいアプリ署名鍵で署名されたAPKがGoogle Play上で配布されるようになります。

アプリ署名鍵がアップグレードできているかの確認

それでは、アプリ署名鍵がきちんとアップグレードできているかを確認してみましょう。まずはGoogle Play上で配布されているAPKを入手します。方法は次の2種類あります。

入手方法1:Google Play Consoleからダウンロードする
1. Google Play Consoleで対象のアプリを開く
2. 左メニューから【App Bundle エクスプローラ】を選ぶ
3. 対象のバージョンコードを選ぶ
4. 【ダウンロード】タブを押す
5. 【署名済みのユニバーサルAPK】の右端にあるダウンロードボタンを押す
※ダウンロードボタンが押せるようになるまで数十秒かかります

入手方法2:Android端末からインストール済みのAPKを吸い出す
やり方はいろいろありますが、ここではadbコマンドを使用する方法を紹介します。
1. 対象のアプリをインストール済みのAndroid端末をPCに接続する
2. 次のコマンドで端末内のAPKファイル(base.apk)のパスを探す
    adb shell pm path {パッケージ名}
3. 次のコマンドで端末内のAPKファイルをPCに転送する
    adb pull {base.apkの絶対パス} {保存先ファイルパス}

次に、Android SDK ビルドツールに同梱されているapksignerコマンドを使って配布用APKの署名情報を確認します。

apksignerコマンドはMacでAndroid Studioを使用してアプリを開発していれば ~/Library/Android/sdk/build-tools/<version>/apksigner に既に存在するはずです。そして必ず <version> の部分は33.0.1以上を指定してください。もし33.0.1以上が上記のパスに存在しなければ、Android Studioに付属しているAndroid SDK Managerで最新の「Android SDK Build-Tools」(SDK Toolsタブ内にあります)をインストールしてください。もし33.0.1以前を使用してしまうと、APK署名スキームv3.1が無視されてしまい、古いアプリ署名鍵しか表示されません(具体例は補足1を参照)。

apksignerコマンドにはいくつかの内部コマンドが用意されています。そのうち「verify」コマンドでAPKの署名鍵証明書を確認できます。また、「lineage」コマンドで鍵ローテーションで使用されるSigningCertificateLineage(アプリ署名鍵の履歴情報のようなもの)が確認できます。それぞれの使用方法については各コマンドのヘルプをご確認ください。

▼verifyコマンドのヘルプ(のソースコード)https://android.googlesource.com/platform/tools/apksig/+/refs/heads/main/src/apksigner/java/com/android/apksigner/help_verify.txt

▼lineageコマンドのヘルプ(のソースコード)
https://android.googlesource.com/platform/tools/apksig/+/refs/heads/main/src/apksigner/java/com/android/apksigner/help_lineage.txt

以下では実際のapksignerコマンドの使用例を紹介していきます。

アプリ署名鍵のアップグレードをする前のAPK

A. apksigner verifyコマンド

% ~/Library/Android/sdk/build-tools/34.0.0/apksigner verify -v --print-certs --in 7.apk

出力:

Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Verified using v3 scheme (APK Signature Scheme v3): true
Verified using v3.1 scheme (APK Signature Scheme v3.1): false
Verified using v4 scheme (APK Signature Scheme v4): false
Verified for SourceStamp: true
Number of signers: 1
Signer #1 certificate DN: CN=foo, OU=bar, O=MyCompany, L=MyCity, ST=MyState, C=JP
Signer #1 certificate SHA-256 digest: 420a8ef5fafe228100743041ff14dfc10f2e333d81fceb365f886d559dc9c0cd
Signer #1 certificate SHA-1 digest: 55df85c72e97352e18ad5839160bd7d009663ded
Signer #1 certificate MD5 digest: 95e39f35e656da3992bc1d0b8fd420ff
Signer #1 key algorithm: RSA
Signer #1 key size (bits): 2048
Signer #1 public key SHA-256 digest: 11e43620c70a4e69bc92eed1cd07562d89969e8dc09dcef13ff4ef2239682527
Signer #1 public key SHA-1 digest: 542e91d325b6d61f4068f243ccca057dfedc7a83
Signer #1 public key MD5 digest: b7dad41d60b903d3f7591923b900ecf5
Source Stamp Signer certificate DN: CN=Android, OU=Android, O=Google Inc., L=Mountain View, ST=California, C=US
Source Stamp Signer certificate SHA-256 digest: 3257d599a49d2c961a471ca9843f59d341a405884583fc087df4237b733bbd6d
Source Stamp Signer certificate SHA-1 digest: b1af3a0bf998aeede1a8716a539e5a59da1d86d6
Source Stamp Signer certificate MD5 digest: 577b8a9fbc7e308321aec6411169d2fb
Source Stamp Signer key algorithm: RSA
Source Stamp Signer key size (bits): 4096
Source Stamp Signer public key SHA-256 digest: 4c53c1d28f2ecceadcb1351603f0b702615b3454b6e30070de759359f241b802
Source Stamp Signer public key SHA-1 digest: 188b067a9ee881bde55dabe0f8f7ecb320b1a091
Source Stamp Signer public key MD5 digest: 965afac83f033aa037a54482eb6922d5
  • 「Signer #1」の部分が変更前のアプリ署名鍵です。

  • 「Signer #1 certificate MD5 digest」の値は、図3のGoogle Play Console上で表示された「MD5 証明書のフィンガープリント」の値と一致します。

  • 「Source Stamp Signer」の部分はPlayアプリ署名でAABから配布用APKを生成する際に付加される情報です。今回の本題とは関係ありません。

B. apksigner lineageコマンド

% ~/Library/Android/sdk/build-tools/34.0.0/apksigner lineage -v --print-certs --in 7.apk

出力:

The provided APK does not contain a valid lineage.

アプリ署名鍵のアップグレードを実施する前ですので、SigningCertificateLineageは存在しません。

アプリ署名鍵のアップグレードをした後のAPK

見出しをもう少し正確に言うと、アプリ署名鍵のアップグレードをした後にGoogle Play ConsoleにAABをアップロードし、それから生成された配布用APKです。

A. apksigner verifyコマンド

% ~/Library/Android/sdk/build-tools/34.0.0/apksigner verify -v --print-certs --in 8.apk

出力:

Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Verified using v3 scheme (APK Signature Scheme v3): true
Verified using v3.1 scheme (APK Signature Scheme v3.1): true
Verified using v4 scheme (APK Signature Scheme v4): false
Verified for SourceStamp: true
Number of signers: 1
Signer (minSdkVersion=33, maxSdkVersion=2147483647) certificate DN: CN=Android, OU=Android, O=Google Inc., L=Mountain View, ST=California, C=US
Signer (minSdkVersion=33, maxSdkVersion=2147483647) certificate SHA-256 digest: 6e6c471515ab525609b9f27556ca2acd1c6b35f39219cb4b9c706f1356f225f2
Signer (minSdkVersion=33, maxSdkVersion=2147483647) certificate SHA-1 digest: fa85baca90a9ab90a6f5e266b97ed44d759e640e
Signer (minSdkVersion=33, maxSdkVersion=2147483647) certificate MD5 digest: b97603d3aa5c38c1671d6c699d593052
Signer (minSdkVersion=33, maxSdkVersion=2147483647) key algorithm: RSA
Signer (minSdkVersion=33, maxSdkVersion=2147483647) key size (bits): 4096
Signer (minSdkVersion=33, maxSdkVersion=2147483647) public key SHA-256 digest: 09ff76ef27c366b8beec2120e6e715b6ea1e4f259f41bead571d3334548051a2
Signer (minSdkVersion=33, maxSdkVersion=2147483647) public key SHA-1 digest: 68f7bc12403f46fc4a14135fab45e9de5696e6ea
Signer (minSdkVersion=33, maxSdkVersion=2147483647) public key MD5 digest: da21023130282a010431e06dfad5023c
Signer (minSdkVersion=24, maxSdkVersion=32) certificate DN: CN=foo, OU=bar, O=MyCompany, L=MyCity, ST=MyState, C=JP
Signer (minSdkVersion=24, maxSdkVersion=32) certificate SHA-256 digest: 420a8ef5fafe228100743041ff14dfc10f2e333d81fceb365f886d559dc9c0cd
Signer (minSdkVersion=24, maxSdkVersion=32) certificate SHA-1 digest: 55df85c72e97352e18ad5839160bd7d009663ded
Signer (minSdkVersion=24, maxSdkVersion=32) certificate MD5 digest: 95e39f35e656da3992bc1d0b8fd420ff
Signer (minSdkVersion=24, maxSdkVersion=32) key algorithm: RSA
Signer (minSdkVersion=24, maxSdkVersion=32) key size (bits): 2048
Signer (minSdkVersion=24, maxSdkVersion=32) public key SHA-256 digest: 11e43620c70a4e69bc92eed1cd07562d89969e8dc09dcef13ff4ef2239682527
Signer (minSdkVersion=24, maxSdkVersion=32) public key SHA-1 digest: 542e91d325b6d61f4068f243ccca057dfedc7a83
Signer (minSdkVersion=24, maxSdkVersion=32) public key MD5 digest: b7dad41d60b903d3f7591923b900ecf5
Source Stamp Signer certificate DN: CN=Android, OU=Android, O=Google Inc., L=Mountain View, ST=California, C=US
Source Stamp Signer certificate SHA-256 digest: 3257d599a49d2c961a471ca9843f59d341a405884583fc087df4237b733bbd6d
Source Stamp Signer certificate SHA-1 digest: b1af3a0bf998aeede1a8716a539e5a59da1d86d6
Source Stamp Signer certificate MD5 digest: 577b8a9fbc7e308321aec6411169d2fb
Source Stamp Signer key algorithm: RSA
Source Stamp Signer key size (bits): 4096
Source Stamp Signer public key SHA-256 digest: 4c53c1d28f2ecceadcb1351603f0b702615b3454b6e30070de759359f241b802
Source Stamp Signer public key SHA-1 digest: 188b067a9ee881bde55dabe0f8f7ecb320b1a091
Source Stamp Signer public key MD5 digest: 965afac83f033aa037a54482eb6922d5
  • 「Verified using v3.1 scheme (APK Signature Scheme v3.1): true」からAPK署名スキームv3.1が有効に変わったことがわかります。

  • 「Signer (minSdkVersion=33, maxSdkVersion=2147483647) 」の部分がアップグレード後の新しいアプリ署名鍵です。「certificate MD5 digest」の値は、図8のGoogle Play Console上で表示された「MD5 証明書のフィンガープリント」の値と一致します。

  • 「Signer (minSdkVersion=24, maxSdkVersion=32) 」の部分がアップグレード前の古いアプリ署名鍵です。「certificate MD5 digest」の値は、図3のGoogle Play Console上で表示された「MD5 証明書のフィンガープリント」の値と一致します。

B. apksigner lineageコマンド

% ~/Library/Android/sdk/build-tools/34.0.0/apksigner lineage -v --print-certs --in 8.apk

出力:

Signer #1 in lineage certificate DN: CN=foo, OU=bar, O=MyCompany, L=MyCity, ST=MyState, C=JP
Signer #1 in lineage certificate SHA-256 digest: 420a8ef5fafe228100743041ff14dfc10f2e333d81fceb365f886d559dc9c0cd
Signer #1 in lineage certificate SHA-1 digest: 55df85c72e97352e18ad5839160bd7d009663ded
Signer #1 in lineage certificate MD5 digest: 95e39f35e656da3992bc1d0b8fd420ff
Signer #1 in lineage key algorithm: RSA
Signer #1 in lineage key size (bits): 2048
Signer #1 in lineage public key SHA-256 digest: 11e43620c70a4e69bc92eed1cd07562d89969e8dc09dcef13ff4ef2239682527
Signer #1 in lineage public key SHA-1 digest: 542e91d325b6d61f4068f243ccca057dfedc7a83
Signer #1 in lineage public key MD5 digest: b7dad41d60b903d3f7591923b900ecf5
Has installed data capability: true
Has shared UID capability    : true
Has permission capability    : true
Has rollback capability      : false
Has auth capability          : true
Signer #2 in lineage certificate DN: CN=Android, OU=Android, O=Google Inc., L=Mountain View, ST=California, C=US
Signer #2 in lineage certificate SHA-256 digest: 6e6c471515ab525609b9f27556ca2acd1c6b35f39219cb4b9c706f1356f225f2
Signer #2 in lineage certificate SHA-1 digest: fa85baca90a9ab90a6f5e266b97ed44d759e640e
Signer #2 in lineage certificate MD5 digest: b97603d3aa5c38c1671d6c699d593052
Signer #2 in lineage key algorithm: RSA
Signer #2 in lineage key size (bits): 4096
Signer #2 in lineage public key SHA-256 digest: 09ff76ef27c366b8beec2120e6e715b6ea1e4f259f41bead571d3334548051a2
Signer #2 in lineage public key SHA-1 digest: 68f7bc12403f46fc4a14135fab45e9de5696e6ea
Signer #2 in lineage public key MD5 digest: da21023130282a010431e06dfad5023c
Has installed data capability: true
Has shared UID capability    : true
Has permission capability    : true
Has rollback capability      : false
Has auth capability          : true
  • 「Signer #1 in lineage」の部分がアップグレード前の古いアプリ署名鍵です。「certificate MD5 digest」の値は、図3のGoogle Play Console上で表示された「MD5 証明書のフィンガープリント」の値と一致します。

  • 「Signer #2 in lineage 」の部分がアップグレード後の新しいアプリ署名鍵です。「certificate MD5 digest」の値は、図8のGoogle Play Console上で表示された「MD5 証明書のフィンガープリント」の値と一致します。

補足1:古いapksignerコマンドを使用すると新しいアプリ署名鍵が表示されない

アプリ署名鍵のアップグレードをした場合は、必ずリビジョン 33.0.1 以降のAndroid SDK ビルドツールに同梱されているapksignerコマンドを使用してください。もし33.0.1未満を使用してしまうと、次のように古いアプリ署名鍵しか表示されません。
※以下の例はいずれも、アプリ署名鍵のアップグレードをした後にGoogle Play ConsoleにAABをアップロードし、それから生成された配布用APKに対して実行しています。

A. apksigner verifyコマンド(リビジョン 31.0.0)

% ~/Library/Android/sdk/build-tools/31.0.0/apksigner verify -v --print-certs --in 8.apk
Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Verified using v3 scheme (APK Signature Scheme v3): false
Verified using v4 scheme (APK Signature Scheme v4): false
Verified for SourceStamp: false
Number of signers: 1
Signer #1 certificate DN: CN=First Last, OU=Mobile, O=MyCompany, L=MyCity, ST=MyState, C=JP
Signer #1 certificate SHA-256 digest: 420a8ef5fafe228100743041ff14dfc10f2e333d81fceb365f886d559dc9c0cd
Signer #1 certificate SHA-1 digest: 55df85c72e97352e18ad5839160bd7d009663ded
Signer #1 certificate MD5 digest: 95e39f35e656da3992bc1d0b8fd420ff
Signer #1 key algorithm: RSA
Signer #1 key size (bits): 2048
Signer #1 public key SHA-256 digest: 11e43620c70a4e69bc92eed1cd07562d89969e8dc09dcef13ff4ef2239682527
Signer #1 public key SHA-1 digest: 542e91d325b6d61f4068f243ccca057dfedc7a83
Signer #1 public key MD5 digest: b7dad41d60b903d3f7591923b900ecf5
Source Stamp Signer certificate DN: CN=Android, OU=Android, O=Google Inc., L=Mountain View, ST=California, C=US
Source Stamp Signer certificate SHA-256 digest: 3257d599a49d2c961a471ca9843f59d341a405884583fc087df4237b733bbd6d
Source Stamp Signer certificate SHA-1 digest: b1af3a0bf998aeede1a8716a539e5a59da1d86d6
Source Stamp Signer certificate MD5 digest: 577b8a9fbc7e308321aec6411169d2fb
Source Stamp Signer key algorithm: RSA
Source Stamp Signer key size (bits): 4096
Source Stamp Signer public key SHA-256 digest: 4c53c1d28f2ecceadcb1351603f0b702615b3454b6e30070de759359f241b802
Source Stamp Signer public key SHA-1 digest: 188b067a9ee881bde55dabe0f8f7ecb320b1a091
Source Stamp Signer public key MD5 digest: 965afac83f033aa037a54482eb6922d5
  • 31.0.0はAPK署名スキームv3.1に未対応のため、APK署名スキームv3.1の情報が丸ごと無視されます。なお、新しいアプリ署名鍵はAPK署名スキームv3.1の領域のみに格納されています。

  • 「Signer #1」の部分はアップグレード前の古いアプリ署名鍵です。

  • 「Source Stamp Signer」の部分はPlayアプリ署名でAABから配布用APKを生成する際に付加される情報です。アップグレード後のアプリ署名鍵とは関係ありません。

B. apksigner lineageコマンド(リビジョン 31.0.0)

% ~/Library/Android/sdk/build-tools/31.0.0/apksigner lineage -v --print-certs --in 8.apk
The provided APK does not contain a valid lineage.
  • 31.0.0はAPK署名スキームv3.1に未対応のため、APK署名スキームv3.1の情報が丸ごと無視され、SigningCertificateLineageが表示されません。

補足2:2022〜2023年にかけてアプリ署名鍵のアップグレード機能が大きく変わった

上記はアプリ署名鍵のアップグレードについて記載されているGoogle Play Consoleの公式ヘルプです。このページの変遷をWayback Machineで調べてみました。すると、アプリ署名鍵のアップグレードに関する章の小見出しが下図のように変わっていたことがわかりました。

図11. アプリ署名鍵のアップグレードに関する公式ヘルプの変遷

最初は "Request a key upgrade for new installs" (以下では旧方式と呼びます)だけでしたが、2022年9月頃に "Request a key upgrade for all installs on Android T (API level 33) and above" (以下では新方式と呼びます)が追加されました(Android TはAndroid 13のことです)。公式ヘルプの内容を読むと、アプリ署名鍵のアップグレードをリクエストする際に、旧方式と新方式のどちらかを選べたようです。それから2023年6月頃に新方式のOSバージョン要件が "Android N (API level 24)" まで引き下げられました(Android NはAndroid 7のことです)。そして2023年7月に旧方式が削除され、新方式しか選べないようになりました。

以上のように2022〜2023年にかけてアプリ署名鍵のアップグレードの方式が大きく変わっていますので、インターネット上の記事を参照する際はどの時期の情報かに留意する必要があります。また、今後も仕様が変わる可能性がありますので、必ず最新の公式ヘルプを参照してください。

▼図11の作成に使用したアーカイブ

補足3:アプリ署名鍵のアップグレードの旧方式はどんなものだったのか?

補足2で見た通り、2023年6月頃までは "Request a key upgrade for new installs" という方式が選べました。日本語版では「新しいインストール用に鍵のアップグレードをリクエストする」と記載されていました。

図12. https://support.google.com/googleplay/android-developer/answer/9842756 より引用(2023年5月17日閲覧)

実際に検証できていないため確証はありませんが、ヘルプを読む限りは以下の仕様だったようです。

  • 鍵ローテーションの仕組みは利用しない

  • Google Playが常に2種類のAPK(古い鍵で署名したAPKと新しい鍵で署名したAPK)を生成するようになる

図13. 旧方式のイメージ図

参考資料

宣伝

NTTレゾナントテクノロジーでは一緒に働いてくれるAndroid/iOSアプリエンジニアを募集中です。もし興味がありましたら採用ページを是非ご覧ください。


この記事が気に入ったらサポートをしてみませんか?