「Generate Signed Bundle or APK」ダイアログの混乱

このダイアログ。

「アップロード鍵」と「アプリ署名鍵」を同じもので行う場合は、一括で実行できますが、別のもので行う場合は混乱します。

処理自体は以下の3つですが、出力ファイルを考えながら、個別にも実行するのがいいのかもしれません。


A. 「アップロード鍵」または「アプリ署名鍵」を作成する。(.jks)

B. 「アプリ署名鍵」をエクスポートして暗号化する。(.pepk)

C. 「アップロード鍵」で署名した.aab をビルドする。(.aab)

 () : 出力ファイル形式

 

🔑 A. 「アップロード鍵」または「アプリ署名鍵」を作成する。(.jks)

 

🔑 B. 「アプリ署名鍵」をエクスポートして暗号化する。(.pepk)

 

🔑 C. 「アップロード鍵」で署名した.aab をビルドする。(.aab)

 

🔑 まとめ

「アップロードから公開まで一つの署名鍵で署名で行う。」という作業の敷居を下げたユーザー画面設計がここにきて混乱を生んでいるのだろう思います。

なので、

「一つの署名鍵でアップロード・アプリ署名鍵兼用」の場合は、


キーストアや鍵の追加 (.jks) → Android Studio

アプリ署名鍵の暗号化 (.pepk) → Android Studio

.aab ビルドとアップロード鍵署名 (.abb) → Android Studio

.pepk/.abb のアップロード → Play コンソール

というかんじでやって、

「アップロード鍵とアプリ署名鍵を別物にする」場合は、


キーストアや鍵たちの追加や編集 (.jks) → keytool コマンド

アップロード証明書作成 (.pem) → keytool コマンド

アプリ署名鍵の暗号化 (.pepk) → PEPK ツールコマンド

.aab ビルドとアップロード鍵署名 (.abb) → Android Studio

.pepk/.pem/.abb のアップロード → Play コンソール

でやると、よりきめ細かく自在に管理ができそうです。

てか、ややこしいわw

👉 【コピペ用】Android「Google アプリ署名」コマンドまとめ 
👉 はじめての Android App Bundle 
👉 【keytool】「キーストア(keystore)」と「エイリアス(alias)」の関係 


【コピペ用】Android「Google アプリ署名」コマンドまとめ

たまにしか使わないコマンドは忘れる。


➜  ~ keytool -help

キーおよび証明書管理ツール
コマンド:

 -certreq            証明書リクエストを生成します
 -changealias        エントリの別名を変更します
 -delete             エントリを削除します
 -exportcert         証明書をエクスポートします
 -genkeypair         鍵ペアを生成します
 -genseckey          秘密鍵を生成します
 -gencert            証明書リクエストから証明書を生成します
 -importcert         証明書または証明書チェーンをインポートします
 -importpass         パスワードをインポートします
 -importkeystore     別のキーストアから1つまたはすべてのエントリをインポートします
 -keypasswd          エントリの鍵パスワードを変更します
 -list               キーストア内のエントリをリストします
 -printcert          証明書の内容を出力します
 -printcertreq       証明書リクエストの内容を出力します
 -printcrl           CRLファイルの内容を出力します
 -storepasswd        キーストアのストア・パスワードを変更します

command_nameの使用方法については"keytool -command_name -help"を使用してください

-vオプションは、-helpコマンドを除くすべてのコマンドで使用できます。-vオプションを指定した場合、冗長モードになり、詳細な情報が出力されます。

👉 Java Platform, Standard Edition Tools Reference - keytool 
👉 Java Platform, Standard Editionツール・リファレンス - keytool 

ので、必要なものを箇条書き的メモに。

「キーストア」と「エイリアス」の言葉や関係は以下。

「keystore」というファイルの中に「keypair」が「entry」されている。「keypair」は「alias」という名称 (別名) で呼ばれる。

👉 【keytool】「キーストア(keystore)」と「エイリアス(alias)」の関係 

 

鍵の作成


➜  ~ keytool -genkeypair -v \
-keystore mykeystore.jks \
-alias mykey1 \
-keyalg RSA \
-keysize 2048 \
-validity 36500 \
-dname "C=JP, O=MY COMPANY, CN=MY NAME"


キーストアのパスワードを入力してください:
新規パスワードを再入力してください:
36,500日間有効な2,048ビットのRSAの鍵ペアと自己署名型証明書(SHA256withRSA)を生成しています
	ディレクトリ名: C=JP, O=MY COMPANY, CN=MY NAME
<mykey1>の鍵パスワードを入力してください
	(キーストアのパスワードと同じ場合はRETURNを押してください):
[mykeystore.jksを格納中]

以前のリリースでは「-genkey」という名前でした。この古い名前は、このリリースでも引き続きサポートされています。今後は新しい名前である「-genkeypair」を使用することをお薦めします。

👉 Java Platform, Standard Editionツール・リファレンス - keytool -genkeypair  

Android Studio では、以下のような画面で簡単に作成できますね。

Error ダイアログが、Warning メッセージと共に表示されますが、作成はされています。

 

キーストアの内容確認


➜  ~ keytool -list -v -keystore mykeystore.jks 


キーストアのパスワードを入力してください:
キーストアのタイプ: jks
キーストア・プロバイダ: SUN

キーストアには1エントリが含まれます

別名: mykey1
作成日: 2020/11/29
エントリ・タイプ: PrivateKeyEntry
証明書チェーンの長さ: 1
証明書[1]:
所有者: C=JP, O=MY COMPANY, CN=MY NAME
発行者: C=JP, O=MY COMPANY, CN=MY NAME
シリアル番号: 7f178100
有効期間の開始日: Sun Nov 29 13:10:39 JST 2020 終了日: Tue Nov 05 13:10:39 JST 2120
証明書のフィンガプリント:
	 MD5:  32:26:7F:2B:CC:FC:42:51:3F:3B:EE:78:E8:51:BE:4D
	 SHA1: 60:AB:6A:86:F0:5F:8A:B9:D5:00:E0:90:9A:FA:A8:75:33:8B:77:35
	 SHA256: 56:82:65:8C:C1:83:0F:3A:F8:EE:34:7A:A1:C9:17:B4:18:E9:89:C9:54:73:85:54:3B:5D:67:7C:67:E9:DF:CD
署名アルゴリズム名: SHA256withRSA
サブジェクト公開鍵アルゴリズム: 2048ビットRSA鍵
バージョン: 3

*******************************************
*******************************************


➜  ~ keytool -list -v -keystore .android/debug.keystore


キーストアのパスワードを入力してください:
キーストアのタイプ: jks
キーストア・プロバイダ: SUN

キーストアには1エントリが含まれます

別名: androiddebugkey
作成日: 2020/01/14
エントリ・タイプ: PrivateKeyEntry
証明書チェーンの長さ: 1
証明書[1]:
所有者: C=US, O=Android, CN=Android Debug
発行者: C=US, O=Android, CN=Android Debug
シリアル番号: 1
有効期間の開始日: Tue Jan 14 16:29:10 JST 2020 終了日: Thu Jan 06 16:29:10 JST 2050
証明書のフィンガプリント:
	 MD5:  21:18:F2:2D:27:D4:AB:22:32:02:AA:2C:FC:46:93:B2
	 SHA1: 6F:A3:EC:3C:AB:78:A1:D5:81:2C:9F:26:D5:27:C7:C9:05:88:74:E2
	 SHA256: BD:E1:34:6C:C9:FF:43:F0:67:C4:8A:EF:76:54:AB:09:8D:6E:34:C4:CB:E5:AB:49:CF:65:66:2F:FF:F7:A0:C8
署名アルゴリズム名: SHA1withRSA
サブジェクト公開鍵アルゴリズム: 2048ビットRSA鍵
バージョン: 1

*******************************************
*******************************************


➜  ~ keytool -list -rfc -keystore .android/debug.keystore


キーストアのパスワードを入力してください:
キーストアのタイプ: jks
キーストア・プロバイダ: SUN

キーストアには1エントリが含まれます

別名: androiddebugkey
作成日: 2020/01/14
エントリ・タイプ: PrivateKeyEntry
証明書チェーンの長さ: 1
証明書[1]:
-----BEGIN CERTIFICATE-----
MIIC5DCCAcwCAQEwDQYJKoZIhvcNAQEFBQAwNzEWMBQGA1UEAwwNQW5kcm9pZCBE
ZWJ1ZzEQMA4GA1UECgwHQW5kcm9pZDELMAkGA1UEBhMCVVMwIBcNMjAwMTE0MDcy
OTEwWhgPMjA1MDAxMDYwNzI5MTBaMDcxFjAUBgNVBAMMDUFuZHJvaWQgRGVidWcx
EDAOBgNVBAoMB0FuZHJvaWQxCzAJBgNVBAYTAlVTMIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEArTek9kmuVbQj5RU38w7vwvD6IaVt161YR62t3nWeJBU1
lCaOds4EKG4hhcUmR/tJcy0qklO/t7MotmGvKD9QpKLXI+EQ3hyf9W2iwpqe0QZB
mMvSaqu0rYnZkPnHaN7/8KVJBC8YRZNNIq6TQ34X1brmXD96/ftnAyZGLwdapS40
nKViT2QLmqjyWwcq2V8lafrSvuLEgn9exj1ZGs7TTD3xYuO/OOnjKUpIa/6VH5SY
WEFg4az74t10k3EVRyrpc0n+ihc+a5JyTFepiTd+wadhU45s7Ozrh8NEyzpa2Jll
Hqq8BJ8hComumlPEovTAYNBUasvWjudpcIfJE/cCjwIDAQABMA0GCSqGSIb3DQEB
BQUAA4IBAQAQWvQrZp6Lsj67CwNXRS8zxlVYlhRvm3OoVe/GgD4ZHRYhhcHzd1lw
ycfFK9jRFwFC1I+PAF4BAu7MxFT+kAKxJx4cY20bRki6yTfU/TfqFAfGudsIeeCI
YPSWTwqHOHDVSz6APe9QMY64HG2llyHjVP+w1Qiu1mowsXH3uWLH+TLb55BJEBP1
asT1TsCU3uTlZnDdKgz/v0SobXyAO7vLE3TEtv5+4hvXUyj+BHzjDm2Y1APMJeKP
e35yohrL2U2qUNvrDawhSMW+/UzkIM1jHYM5HZaZeH93kaNV+7wtkazDrGxa7+P7
0D8I0LK8pnCk+7gjp2X4jtvTXUmbZMVn
-----END CERTIFICATE-----

*******************************************
*******************************************

-vオプションと-rfcオプションを同時に指定することはできません。

 

鍵のエクスポートと暗号化


➜  ~ java -jar pepk.jar \
--keystore=foo.keystore \
--alias=foo \
--output=encrypted_private_key_path \
--encryptionkey=eb10fe8f7c7c992315022017b00c6471f8ba8170b13049a11e6c09ffe3a56a104a3bbe4ac5a955f4ba4f113fc8cef2a558a3eb9d2a529a2092761fb833b656cd4cb9de6d

Android Studio では、コマンド入力不要で暗号化した private_key.pepk ファイルを書き出してくれます。

 

鍵の証明書(PEM)のエクスポートと表示


➜  ~ keytool -exportcert -rfc \
-keystore mykeystore.jks \
-alias mykey1 \
-file mystore-mykey1.pem


キーストアのパスワードを入力してください:
証明書がファイルに保存されました

このコマンドは、以前のリリースでは-exportという名前でした。この古い名前は、このリリースでも引き続きサポートされています。今後は新しい名前である-exportcertを使用することをお薦めします。


➜  ~ keytool -printcert -file mystore-mykey1.pem


所有者: C=JP, O=MY COMPANY, CN=MY NAME
発行者: C=JP, O=MY COMPANY, CN=MY NAME
シリアル番号: 7f178100
有効期間の開始日: Sun Nov 29 13:10:39 JST 2020 終了日: Tue Nov 05 13:10:39 JST 2120
証明書のフィンガプリント:
	 MD5:  32:26:7F:2B:CC:FC:42:51:3F:3B:EE:78:E8:51:BE:4D
	 SHA1: 60:AB:6A:86:F0:5F:8A:B9:D5:00:E0:90:9A:FA:A8:75:33:8B:77:35
	 SHA256: 56:82:65:8C:C1:83:0F:3A:F8:EE:34:7A:A1:C9:17:B4:18:E9:89:C9:54:73:85:54:3B:5D:67:7C:67:E9:DF:CD
署名アルゴリズム名: SHA256withRSA
サブジェクト公開鍵アルゴリズム: 2048ビットRSA鍵
バージョン: 3

上記のコマンドは、アップロード鍵使用時の「アップロード鍵の証明書を PEM ファイルとしてエクスポートする」ときに利用されています。

Play コンソール [設定] - [アプリの署名]


➜  ~ keytool -export -rfc \
-keystore upload-keystore.jks \
-alias upload \
-file upload_certificate.pem

 

aab 署名証明書(フィンガープリント)の表示


➜  ~ keytool -printcert -v -jarfile 202011290.aab

.aab ファイルは、Play コンソールから「元のファイル」としてダウンロードして確認できます。

 

apk 署名証明書(フィンガープリント)の表示


➜  ~ apksigner verify --print-certs -v 202011290.apk

.apk ファイルは、Play コンソールから「署名済みのユニバーサル APK」としてダウンロードして確認できます。

 

その他

各出力結果に表示されますが、省略してます以下メッセージ。


Warning:
JKSキーストアは独自の形式を使用しています。"keytool -importkeystore -srckeystore mykeystore.jks -destkeystore mykeystore.jks -deststoretype pkcs12"を使用する業界標準の形式であるPKCS12に移行することをお薦めします。

👉 「Generate Signed Bundle or APK」ダイアログの混乱 
👉 はじめての Android App Bundle 
👉 【keytool】「キーストア(keystore)」と「エイリアス(alias)」の関係 
👉 Android: Reset Password Keystore file - DEV 
👉 Authenticating Your Client  |  Android 用 Google API  |  Google Developers 


はじめての Android App Bundle

公式アナウンス

お知らせ: 2021 年 8 月から新規アプリで App Bundle が必須に

👉 Android Developers Japan Blog: MAD Skills: Android App Bundle のエキスパートになる 

2021年中には対応しないといけませんよ、新規アプリリリースには。

👉 Android Developers Blog: New Android App Bundle and target API level requirements in 2021 
👉 Android Developers Blog: The future of Android App Bundles is here 

「App Bundle」を利用するには、「GooglePlayアプリ署名」に登録が必要。

重要: アプリの公開形式として推奨される Android App Bundle を使用するには、App Bundle を Play Console にアップロードする前に Google Play アプリ署名に登録する必要があります。

👉 Google Play アプリ署名を使用する - Play Console ヘルプ 

 

ややこしくて分かりづらい

簡単な使い方から順番に覚えていくといい。

設定まわりGUIや作業方法は当分変わり続けそう。

 

「アップロード鍵」と「アプリ署名鍵」を一つの鍵で登録するパターン

以下は、一番基本的な、コマンドライン作業なしの、Android Studio のみでの最小限の登録作業手順の考え方。

全体的に眺めてみると、

「アップロード鍵」というのは、「aab に署名する鍵」になります。

一方、「アプリ署名鍵」というのは、Playストアから配布される apk に署名する鍵で、PEPKツールで暗号化したものをアップデートしておくと、Playストアが、apk に署名してくれます。

 

「アップロード鍵」と「アプリ署名鍵」を違うものにするパターン

次は、「アップロード鍵」と「アプリ署名鍵」を違うものにしてセキュリティを高めたパターンです。

まとめると、

となります。

 

まとめ

Android Studio や、Play ストアの画面構成や流れ、説明を読んでも最初はわかりづらいと思います。

実際に、試しながらやってみるのも、Play ストアが絡んでくるのでこれもつらい。

間違いではないが、馴染みづらい日本語説明や初めてな単語たちがまたつらい。

なので、まずは、大きく概念的な意味合いをしっかり把握しておくこと大事です。

👉 「Generate Signed Bundle or APK」ダイアログの混乱 
👉 【コピペ用】Android「Google アプリ署名」コマンドまとめ 
👉 【keytool】「キーストア(keystore)」と「エイリアス(alias)」の関係 


関連ワード:  Google